繁体   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