簡體   English   中英

為什么在執行看似無限循環時我的程序停止了?

[英]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.01.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM