浮动计算的几率

时间:2014-09-21 22:56:41

标签: python floating-point

虽然这个话题不是很新且相关,但我无法理解一件事。

当我在x64 Windows 7,Intel核心i5 760上使用Python 2.7.8(x86)IDLE时,我发现我的机器在乘以特定浮点/双数的赔率,但不是全部他们!

>>> print 0.01 == 0.1 * 0.1
False
>>> print (1/10.0) ** 2 == 0.01
False
>>> print 0.01 - 0.1 ** 2
-1.73472347598e-18

BUT:
>>> print 1/10.0 * 1/10.0 == 0.01
True
>>> print 0.015 == 0.05 * 0.3
True
>>> print 0.0002 == 0.01 * 0.02
True
>>> print 0.0001 == 0.01 * 0.01
True
... (and so on. Always true.)

(!)我不是在谈论这样的困难(对于PC和对我而言)操作,如接电,记录,曝光。我说的是倍增,分裂,增加和减少。

我阅读了thisthis深入了解情况。它说实际上使用像1.1 == 1.1这样的比较会导致错误。就我而言,事实并非如此。因此,我的计算机将这个浮动表示舍入到相同的位表示中。

将Java 7与Eclipse编译器结合使用可以得到相同的结果。因此,我可以得出结论,在我的情况下,结果仅取决于我的机器epsilone(寄存器精度),小于1.734723475976807e-18,但不在编译器和编程环境中。

问题是为什么我的机器无法比较0.01 == 0.1 * 0.1,而没有引起其他乘法例子的不满(我试了很多东西来混淆我的电脑!)?

1 个答案:

答案 0 :(得分:1)

查看here以获得问题的答案。问题是所有浮点数学都是这样的,并且基于IEEE 754标准。 JavaScript使用64位浮点表示,这与Java的双重表示相同。

相反,如果您将其用于实际程序,请使用 epsilon 或非常小的数字:

>>> import math
>>> epsilon = 0.1**5
>>> (math.fabs((0.1 * 0.1) - 0.01) < epsilon)
True
>>>