为什么这个Python程序无限循环?

时间:2016-11-06 21:48:43

标签: python

x = 25
epsilon = 0.01
step = 0.1
guess = 0.0

while guess <= x:
    if abs(guess**2 -x) >= epsilon:
        guess += step

if abs(guess**2 - x) >= epsilon:
    print('failed')
else:
    print('succeeded: ' + str(guess))

我得到了这个Python程序,它试图计算数字x的平方根。由于某种原因,这个程序无限循环,我不知道为什么。

guess只有有限的多个值,因为在guess>x之后(即当guess>=25.1时,while循环会停止)。程序中间的while命令是唯一循环的,所以发生了什么?

2 个答案:

答案 0 :(得分:2)

当条件guess为真时,您只需递增abs(guess**2 -x) >= epsilonguess = 5.0时,该条件为 false 。那时guess永远不会改变,但guess <= x仍然是真的,你进入一个无限循环:

>>> x = 25
>>> epsilon = 0.01
>>> guess = 5.0
>>> abs(guess**2 - x)
0.0
>>> abs(guess**2 - x) >= epsilon
False

guess = 0.0开始并按0.1递增意味着您的循环在到达该点之前执行了50次,之后guess永远不会再次更改。

实际上,guess并非5.0,因为添加0.1的近似值(无法使用二进制分数精确表示),会给您一个小的值金额较低:

>>> guess = 0.0
>>> for _ in range(50):
...     guess += 0.1
...
>>> guess
4.999999999999998

但差异仍小于epsilon

当你达到目标while距离之内时,你可能希望打破 epsilon循环:

while guess <= x:
    if abs(guess**2 -x) < epsilon:
        break
    guess += step

答案 1 :(得分:0)

即使您将while条件更改为<而不是<=,它仍会无限循环,因为浮点不准确。

虽然您添加的步数为0.1,但guess值不会精确为5,而是4.999999999999998,此时循环将继续运行而不会进入if块。

这至少是我看到的here