[英]Why is my program stopping when doing a seemingly infinite loop?
這確實很明顯,但是我目前正在做一個帶有以下代碼片段的小教程:
n=0
a=1
while a>0:
n=n+1
a=(1.0+2.0**(-n))-1.0
print (n)
而且我嘗試運行它,但是它一直陷在n = 53。 為什么? 我只是假設while
永遠都是真的...
如果將最后一行更改為print(n, a)
,則可以更清楚地看到正在發生的情況:
n = 0
a = 1
while a > 0:
n = n + 1
a = (1.0 + 2.0 ** (-n)) - 1.0
print(n, a)
輸出:
1 0.5
2 0.25
3 0.125
4 0.0625
# ...
50 8.881784197001252e-16
51 4.440892098500626e-16
52 2.220446049250313e-16
53 0.0
如您所見,每次循環時, a
的大小都是一半。 最終, 2.0 ** (-n)
太小,以至於浮點數學(精度有限)無法分辨1.0
和1.0 + 2.0 ** (-n)
之間的區別:
>>> 1.0 + 2.0 ** -51
1.0000000000000004
>>> 1.0 + 2.0 ** -52
1.0000000000000002
>>> 1.0 + 2.0 ** -53
1.0
…發生這種情況時,從1.0
減去1.0
將得到0.0
,而while
循環終止。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.