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”是正确的解决方案,但通常更稳定的算法更重要
在某些计算中,这些操作顺序上的细微差异可能变得很重要,在IEEE平台上处理浮点数时,应始终牢记这一点。浮点运算很容易导致一个运行数小时的模拟突然中断,没有任何原因,或者只有在某些特定情况下才会中断。虽然它与时间戳有关,但本文粗略概述了使用浮点运算时可能遇到的陷阱,最重要的是: 这个真实的例子演示了一些事情:
- 任何时候,当你加上或减去不同大小的浮动时,你都需要注意精度的损失
- 有时使用“double”而不是“float”是正确的解决方案,但通常更稳定的算法更重要
在某些计算中,这些操作顺序上的细微差异可能变得很重要,在IEEE平台上处理浮点数时,应始终牢记这一点。一个运行数小时的模拟,如果没有任何原因或者只有在某些特定的事情发生时才突然中断,很容易由浮点运算引起。+1;在Python中,至少可以执行
(3+int(1e20))-int(1e20)
并获得3
+1;在Python中,至少可以执行(3+int(1e20))-int(1e20)
并获得3
。