4

我有以下Python腳本:力竭浮點精度

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

這個看似無限循環,終止很快,如果x是一個浮點數。但是,如果我將x改爲300000000,它會進入無限循環(在我的測試中運行時間超過一分鐘)。

我認爲這是因爲它耗盡了可以在內存中表示的浮點數的精度。有人可以提供更詳細的解釋,爲什麼這是?

回答

11
  • 當您將x初始化爲300000000時,將在整個程序中使用整數運算。
  • x初始化爲300000000.0時,將使用浮點數學。

在Python中,整數可以增長到任意大。 (更準確地說,它們受可用內存的限制。)這意味着程序的整數版本需要很長時間才能終止。

最大的float約爲1.8e308。需要大約1000次循環的浮點版本的循環才能超過該值,此時x被設置爲正無窮大,並且程序終止。

+0

投票作爲正確的答案,因爲這實際上是爲什麼它解釋它不終止的整數情況下,其他答案只是解釋了它顯而易見,它終止時x = inf如果x是一個浮點數 –

6

這是因爲發生了浮點溢出。在這種情況下,as per IEEE754x將採用值正無窮大,這是不定義比什麼都少:每一步之後

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

x雙打。有限數量x永遠不會等於2 * x。但是一旦你超過了浮點類型的最大指數,加倍就會變成x+infinity。和+infinity = 2*+infinity。所以循環終止在那一點。