Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gcc、Python和googlecalculator中的大浮点数计算错误_Python_C_Gcc_Floating Point - Fatal编程技术网

Gcc、Python和googlecalculator中的大浮点数计算错误

Gcc、Python和googlecalculator中的大浮点数计算错误,python,c,gcc,floating-point,Python,C,Gcc,Floating Point,为什么这两个表达式的结果应该不同? 在gcc和python中也会发生同样的事情。这里发生了什么事?有什么办法可以预防吗? 浮点数的精度有限。如果将小数值(3)添加到大数值(1e20),结果通常与大数值相同。因此,这里的情况就是这样 (3 + 1e20) - 1e20 = 1e20 - 1e20 = 0 double的精度约为15位小数,floats的精度约为7位小数。浮点数的精度有限。如果将小数值(3)添加到大数值(1e20),结果通常与大数值相同。因此,这里的情况就是这样 (3 + 1e2

为什么这两个表达式的结果应该不同?
在gcc和python中也会发生同样的事情。这里发生了什么事?有什么办法可以预防吗?


浮点数的精度有限。如果将小数值(3)添加到大数值(1e20),结果通常与大数值相同。因此,这里的情况就是这样

(3 + 1e20) - 1e20 = 1e20 - 1e20 = 0

double
的精度约为15位小数,
float
s的精度约为7位小数。

浮点数的精度有限。如果将小数值(3)添加到大数值(1e20),结果通常与大数值相同。因此,这里的情况就是这样

(3 + 1e20) - 1e20 = 1e20 - 1e20 = 0

double
的精度约为15位十进制数字,
float
s的精度约为7位十进制数字。

虽然它与时间戳有关,但本文粗略概述了使用浮点算术时可能遇到的陷阱,最重要的是:

这个真实的例子演示了一些事情:

  • 任何时候,当你加上或减去不同大小的浮动时,你都需要注意精度的损失
  • 有时使用“double”而不是“float”是正确的解决方案,但通常更稳定的算法更重要
在第二种情况下,您将添加10²⁰ 到3,这是一个广泛变化的量级。由于双精度有限(约14位,4字节浮点为7位(单精度)),因此3将在结果中丢失。但如果先减去10²⁰ 从它本身,你得到一个零,它加在3上根本不会改变结果


在某些计算中,这些操作顺序上的细微差异可能变得很重要,在IEEE平台上处理浮点数时,应始终牢记这一点。浮点运算很容易导致一个运行数小时的模拟突然中断,没有任何原因,或者只有在某些特定情况下才会中断。

虽然它与时间戳有关,但本文粗略概述了使用浮点运算时可能遇到的陷阱,最重要的是:

这个真实的例子演示了一些事情:

  • 任何时候,当你加上或减去不同大小的浮动时,你都需要注意精度的损失
  • 有时使用“double”而不是“float”是正确的解决方案,但通常更稳定的算法更重要
在第二种情况下,您将添加10²⁰ 到3,这是一个广泛变化的量级。由于双精度有限(约14位,4字节浮点为7位(单精度)),因此3将在结果中丢失。但如果先减去10²⁰ 从它本身,你得到一个零,它加在3上根本不会改变结果


在某些计算中,这些操作顺序上的细微差异可能变得很重要,在IEEE平台上处理浮点数时,应始终牢记这一点。一个运行数小时的模拟,如果没有任何原因或者只有在某些特定的事情发生时才突然中断,很容易由浮点运算引起。

+1;在Python中,至少可以执行
(3+int(1e20))-int(1e20)
并获得
3
+1;在Python中,至少可以执行
(3+int(1e20))-int(1e20)
并获得
3