Python和非常小的小数

时间:2014-02-03 19:07:02

标签: python floating-point

在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?我不应该使用十进制小部分和浮点错误处理十进制数吗?

我知道这个问题可能属于浮点错误,并且解决方案通常不信任这种计算的浮点数,但我想了解更多关于下发生的事情引擎盖。

2 个答案:

答案 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,并返回该值。