关于在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
为添加?我不应该使用十进制小部分和浮点错误处理十进制数吗?
我知道这个问题可能落在浮点错误的保护伞中,并且解决方案通常是不信任这种计算的浮点数,但我想了解更多关于发生在幕后的事情.
考虑当您尝试添加7.00和.001时会发生什么,并且只允许使用三位数作为答案.7.001是不允许的.你是做什么?
在您可以返回的值中,例如6.99,7.00和7.01,最接近正确答案的是7.00.因此,当要求添加7.00和.001时,返回7.00.
当你要求它在1e-21和1附近添加一个数字时,计算机有同样的问题.它只有53位用于浮点值的小数部分,而1e-21几乎比1位低70位.因此,它将正确的结果舍入到它可以的最接近的值1,并返回该结果.
浮点数就像科学记数法一样.1.0000000000000001e-21
适合64位浮点数允许的53位有效数字/尾数.除此之外1
,比微小部分大许多个数量级,会导致细微的细节被丢弃,1
而是准确地存储