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

Joe*_*Tam 4 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)
Run Code Online (Sandbox Code Playgroud)

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

我认为这是因为它耗尽了可以在内存中表示的浮点数的精度.有人可以提供更详细的解释原因吗?

NPE*_*NPE 11

  • 当初始化x300000000,整数运算在整个程序中使用.
  • 当初始化x300000000.0,浮点运算来代替.

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

最大的float1.8e308.大约需要1000次迭代的环路的浮点版本超过该值,此时x被设置为正无穷大,并且程序终止.


Nik*_* B. 6

这是因为发生浮点溢出.在这种情况下,根据IEEE754,x将采用正无穷大值,根据定义,其值不小于其他任何值:

>>> x = float("inf")
>>> x
inf
>>> x + x
inf
>>> x < x + x
False
Run Code Online (Sandbox Code Playgroud)