为什么我的程序在做一个看似无限的循环时会停止?

Pet*_*ima 2 python floating-point floating-accuracy python-3.x

这一定非常明显,但我目前正在做一个具有以下代码片段的小教程:

n=0
a=1
while a>0:
    n=n+1
    a=(1.0+2.0**(-n))-1.0
    print (n)
Run Code Online (Sandbox Code Playgroud)

我试图运行它但它仍然卡在n = 53.为什么?我只是假设while永远是真的......

Zer*_*eus 6

如果您将最后一行更改为print(n, a)您可以更清楚地看到发生的情况:

n = 0
a = 1
while a > 0:
    n = n + 1
    a = (1.0 + 2.0 ** (-n)) - 1.0
    print(n, a)
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

如您所见,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
Run Code Online (Sandbox Code Playgroud)

......,这时,减去1.01.0给你0.0,和while循环终止.