2012-07-16 54 views

回答

6

浮点数具有有限的精度。如果将较小数字(3)添加到较大数字(1e20),结果通常与大数字相同。是这样的话在这里,因此

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

double的精度是大约15个十进制数字,float■找的精度大约7位十进制数。

+2

+1;在Python中,至少你可以执行'(3 + int(1e20)) - int(1e20)'并获得'3'。 – 2012-07-16 15:34:40

3

虽然它涉及到的时间戳,文章“Don't store that in a float”让你可以使用浮点算术时,遇到陷阱的粗略概述,最重要的是:

这个真实的例子演示了几件事情:

  • 无论何时添加或减去幅度变化很大的浮标,都需要注意精度的损失
  • 有时使用'double'而不是'float'是正确的解决方案,但通常是mor Ë稳定的算法更重要的是

在您添加10 20 3你的第二个情况下,变化很大的幅度。由于双精度限制(14位数字,7字节浮点数(单精度)),3会在结果中丢失。如果你首先从自身中减去10²,你会得到一个零,这个加到3并不会改变结果。

这些操作顺序的细微差别在某些计算中会变得很重要,并且在处理IEEE平台上的浮点数时应该始终牢记这一点。一个运行良好的小时突然没有任何理由或只有当某些特定事件发生时才能正常运行,这很容易由浮点运算造成。

+0

感谢您的参考。 – Rsh 2012-07-16 16:33:54