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

Python 在(看似)无限循环中耗尽浮点精度,python,floating-point,floating-accuracy,floating-point-precision,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=300000000.0 而(xx=float(“inf”) >>>x inf >>>x+x inf >>>x

我有以下Python脚本:

x = 300000000.0
while (x < x + x):
    x = x + x
    print "exec: " + str(x)
print "terminated" + str(x)
x=300000000.0
而(x
如果x是一个浮点数,这个看似无限的循环会很快终止。但如果我将x改为300000000,它将进入一个无限循环(在我的测试中运行时间超过一分钟)

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

  • 当您将
    x
    初始化为
    300000000
    时,在整个程序中使用整数数学
  • 当您将
    x
    初始化为
    300000000.0
    时,将使用浮点数学
在Python中,整数可以任意增长。(更准确地说,它们受到可用内存的限制。)这意味着程序的整数版本需要很长时间才能终止


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

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

>>> x = float("inf")
>>> x
inf
>>> x + x
inf
>>> x < x + x
False
>x=float(“inf”)
>>>x
inf
>>>x+x
inf
>>>x
x
在每个步骤后加倍。有限数
x
永远不等于
2*x
。但是,一旦超过浮点类型的最大指数,加倍会将
x
变为
+无穷大
。和
+infinity=2*+infinity
。因此循环在该点终止。

被选为正确答案,因为这实际上解释了为什么它在整数情况下不终止,而其他答案只是解释了当x=inf,如果x是浮点,它终止的明显原因