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

2024-10-05 21:53:54 发布

您现在位置: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命令是唯一循环的东西,所以发生了什么?你知道吗


Tags: 命令程序ifstepabselseprintsucceeded
2条回答

即使将while条件改为<而不是<=,它仍然会无限循环,因为浮点不准确。你知道吗

尽管您添加了0.1的步骤,guess值将不会精确地变为5,而是4.99999998,此时循环将继续运行而不进入if块。你知道吗

这至少是我看到的情况here

只有当条件abs(guess**2 -x) >= epsilon为真时才增加guess。当guess = 5.0时,该条件为假。此时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。你知道吗

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

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

相关问题 更多 >