在macosx上运行Python 2.7.6的有趣事实:
你的数字非常小:
0.000000000000000000001
您可以将其表示为:
>>> 0.1 / (10 ** 20)
1.0000000000000001e-21
但是你可以在最后看到浮动指向错误。我们真正拥有的是这样的:
0.0000000000000000000010000000000000001
所以我们得到了一个错误的数字,但没关系。问题如下:
正如所料:
>>> 0.1 / (10 ** 20) == 0
False
但是,等等,这是什么?
>>> 0.1 / (10 ** 20) + 1 == 1
True
>>> repr(0.1 / (10 ** 20) + 1)
'1.0'
看起来python正在使用另一种数据类型来表示我的号码,因为这只在使用第16个十进制数字时发生,依此类推。另外为什么python决定在添加时自动将我的号码变为0
?我不应该使用十进制小部分和浮点错误处理十进制数吗?
我知道这个问题可能属于浮点错误,并且解决方案通常不信任这种计算的浮点数,但我想了解更多关于下发生的事情引擎盖。
答案 0 :(得分:7)
浮点数就像科学记数法一样。 1.0000000000000001e-21
符合64位浮点允许的 53位有效数字/尾数。将1
添加到其中,比微小部分大许多个数量级,会导致丢失细微的细节,并准确存储1
答案 1 :(得分:7)
考虑当您尝试添加7.00和.001时会发生什么,并且只允许使用三位数作为答案。 7.001是不允许的。你做什么的?
在您可以返回的值中,例如6.99,7.00和7.01,最接近正确答案的是7.00。因此,当要求添加7.00和.001时,您将返回7.00。
当你要求它在1e-21和1附近添加一个数字时,计算机有同样的问题。它只有53位用于浮点值的小数部分,而1e-21几乎是70位因此,它将正确的结果四舍五入到它可以的最接近的值1,并返回该值。