我有以下 Python 脚本:
x = 300000000.0
while (x < x + x):
x = x + x
print "exec: " + str(x)
print "terminated" + str(x)
如果 x 是浮点数,这个看似无限的循环会很快终止。但是,如果我将 x 更改为 300000000,它会进入无限循环(在我的测试中运行时间超过一分钟)。
我认为这是因为它耗尽了可以在内存中表示的浮点数的精度。有人可以提供更详细的解释为什么会这样吗?
我有以下 Python 脚本:
x = 300000000.0
while (x < x + x):
x = x + x
print "exec: " + str(x)
print "terminated" + str(x)
如果 x 是浮点数,这个看似无限的循环会很快终止。但是,如果我将 x 更改为 300000000,它会进入无限循环(在我的测试中运行时间超过一分钟)。
我认为这是因为它耗尽了可以在内存中表示的浮点数的精度。有人可以提供更详细的解释为什么会这样吗?
x为 时300000000,整个程序都会使用整数数学。x为时300000000.0,将使用浮点数学。在 Python 中,整数可以任意增长。(更准确地说,它们受到可用内存的限制。)这意味着您的程序的整数版本需要很长时间才能终止。
最大float的大约是1.8e308. 循环的浮点版本大约需要 1000 次迭代才能超过该值,此时x将设置为正无穷大,程序终止。
这是因为发生了浮点溢出。在这种情况下,根据 IEEE754,x将采用值正无穷大,根据定义,该值不小于其他任何值:
>>> x = float("inf")
>>> x
inf
>>> x + x
inf
>>> x < x + x
False
x每一步后加倍。有限数x永远不等于2 * x。但是,一旦超过浮点类型的最大指数,加倍x变为+infinity. 和+infinity = 2*+infinity。因此循环在该点终止。