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
命令是唯一循环的,所以发生了什么?
答案 0 :(得分:2)
当条件guess
为真时,您只需递增abs(guess**2 -x) >= epsilon
。 guess = 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