【发布时间】:2014-02-04 04:25:23
【问题描述】:
关于在 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?我不应该处理小数部分非常小的十进制数和浮点错误吗?
我知道这个问题可能属于 浮点错误,解决方案通常是不信任浮点进行这种计算,但我想更多地了解下发生的事情引擎盖。
【问题讨论】:
-
看看这里:docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html - 这是一篇非常流行的关于浮点运算的论文。
-
您还可以查看
Decimal模块,它允许您指定精度。 -
更平易近人的浮点介绍是ece.uwaterloo.ca/~dwharder/NumericalAnalysis/02Numerics/…。向下滚动到“添加大小数字”
标签: python floating-point