当前位置: 首页 > 知识库问答 >
问题:

int64_t再次加倍为int64_t,精度损失

丁沛
2023-03-14

我需要解析一个给定的类型(例如:长整型),它用科学记数法表示。例子:

123456789012345678.3e-3
123456789012345678.3

我知道给定字符串的类型,但我不能使用strtoll,因为数字是用科学符号表示的。我所做的是使用strtod转换它,对int64_t进行错误检查,并将其转换回int64_t。ErrCheckInt和ErrCheck Double对整型和浮点型进行错误检查(溢出、下溢等),并将数字强制转换为任何类型。

double res = strtod(processedStr, &end);
return (std::is_floating_point<OUT_T>::value) ? ErrCheckFloat<double, OUT_T>(res, out) : ErrCheckInt<double, OUT_T>(res, out);

问题是,当我用双精度解析int64_t时,我得到一个具有正确科学符号的浮点数,1显式。当我再次将数字转换为int64_t时,我失去了精度。示例数字:

input:             123456789012345678.3
double_converted:  1.23456789012346E+17
cast_to_int64_t:   123456789012345680
expected:          123456789012345678

我知道这个数字足够长,可以以双精度正确表示。我可以使用长双倍,但这不会解决问题。

我可以对字符串求值,最后根据e符号删除/添加数字,但是处理应该非常非常快,因为代码将在嵌入式rtos中运行。我已经做了很多检查,strtod也会慢慢来。

共有1个答案

晁开宇
2023-03-14

我知道给定字符串的类型,但是我不能使用strtoll,因为数字是用科学符号表示的。

只需调用一次,使用结果指针检测数字是否为xxxexyyy形式,然后再次调用strtoll来解析指数。在我看来,这比浮点运算要简单得多。

我知道这个数字足够长,可以用双精度正确表示。

不,您不知道,因为您的示例输入是“123456789012345678”,这在IEEE 754双精度中无法表示。

我可以用长双,但那解决不了问题。

实际上,如果编译器将longdouble映射到“具有64位有效位的80位扩展精度”,它将解决问题:所有64位整数都可以用该格式表示。GCC和Clang通过Linux上的long double使历史80位浮点格式可用,但它非常不方便,以至于实际上被认为在Windows上不可用(您需要更改FPU控制字,并在每次有库函数要调用时还原它,并编写自己的数学函数来操作80位浮点值。从strtell开始。

 类似资料:
  • 问题内容: 我有一个原始浮点数,需要作为原始双数。简单地将浮标转换为两倍会给我带来额外的精度。例如: 但是,如果我不是强制类型转换,而是将浮点数输出为字符串,然后将字符串解析为双精度,那么我将得到所需的内容: 有没有比String返回更好的方法了? 问题答案: 这并不是说你实际上获得了更高的精度-而是浮标没有准确地代表你最初瞄准的数字。双被精确地表示原始浮子; 显示的是已经存在的“额外”数据。 例

  • 问题陈述: 编写一个方法whatTime,它采用int,seconds,表示从某一天午夜开始的秒数,并返回一个格式为“:”的字符串。此处,表示自午夜以来的完整小时数,表示自上一完整小时结束以来的完整分钟数,以及自上一完整分钟结束以来的秒数。和中的每一个都应该是整数,没有额外的前导0。因此,如果秒为0,则应返回“0:0:0”,而如果秒为3661,则应返回“1:1:1” 我的算法: 以下是我的算法对输

  • 问题内容: 我有一个关于精度损失的问题 我的任务是将数字打印为字符串 例如0.2 * 7 = 1.4000000000000001; 0.0000014 / 10 = 1.3999999999999998E-7 如何解决这个问题? UPD :主要问题是 字符串 输出格式。我不担心丢失约0.00000001的值。现在,我将其解析为String.format(“%f”,value),但我认为这不是一个

  • 我有一个只有完全连接/密集层的深度网络,形状为128-256-512-1024-1024所有层使用激活,没有,最后一层使用激活。 在第20次训练后,验证/测试损失开始逆转并上升,但测试精度也在继续提高。这怎么说得通?如果显示了新的数据,测试的准确性是否准确,或者是否存在某种假阳性? 我这样编译模型:

  • 有人知道为什么。

  • 问题内容: 我的代码是 编译时出现以下错误 但是,当我使用它代替它成功编译时,那么我的问题是,当所有3个变量(即a,b和c)都是字节数据类型时,为什么需要强制转换? 问题答案: ,此处的运算符将返回,这就是您需要使用强制转换的原因。