在(看似)无限循环中耗尽浮点精度

时间:2012-05-02 13:41:49

标签: python floating-point floating-accuracy floating-point-precision

我有以下Python脚本:

x = 300000000.0
while (x < x + x):
    x = x + x
    print "exec: " + str(x)
print "terminated" + str(x)

如果x是浮点数,这个看似无限的循环会很快终止。但是,如果我将x改为300000000,它会进入无限循环(在我的测试中运行时间超过一分钟)。

我认为这与它耗尽可以在内存中表示的浮点数的精度这一事实有关。有人可以提供更详细的解释原因吗?

3 个答案:

答案 0 :(得分:11)

  • x初始化为300000000时,整个程序会使用整数数学。
  • x初始化为300000000.0时,会改为使用浮点数学。

在Python中,整数可以任意增长。 (更准确地说,它们受可用内存的限制。)这意味着程序的整数版本需要很长时间才能终止。

最大float约为1.8e308。循环的浮点版本需要大约1000次迭代才能超过该值,此时x设置为正无穷大,程序终止。

答案 1 :(得分:6)

这是因为发生了浮点溢出。在这种情况下,as per IEEE754x将采用正无穷大值,根据定义,它不会小于其他任何值:

>>> x = float("inf")
>>> x
inf
>>> x + x
inf
>>> x < x + x
False

答案 2 :(得分:4)

每步后

x加倍。有限数x永远不等于2 * x。但是,一旦超过浮点类型的最大指数,加倍就会x变为+infinity。并+infinity = 2*+infinity。所以循环终止于那一点。