2016-11-06 94 views
0
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的平方根。出於某種原因,這個程序無限期地循環,我不知道爲什麼。爲什麼這個Python程序無限循環?

目前只有guess有限多個值,因爲,後guess>x(即,當guess>=25.1 ,,所述while循環然後停止)。在程序中間的while命令是唯一的循環,所以發生了什麼?

+0

把一些打印語句,並找出 – scrappedcola

+0

所以會發生什麼,當'猜測= 5.0'?你的'if'語句不會匹配,但是'guess <= x'仍然是真的。 –

+0

如果猜測在ε內,則不會停止循環。 – BrenBarn

回答

2

當條件abs(guess**2 -x) >= epsilon爲真時,您僅增加guessfalseguess = 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.00.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 
0

即使你改變了,而條件<而不是<=,它還是會無限循環,因爲浮點不準確。

儘管您添加了0.1的步數,但guess值不會恰好爲5,而是爲4.999999999999998,此時循環將繼續運行而不輸入if塊。

這至少是我所看到的情況here

+0

stepsize是0.1,而不是0.01。 50 * 0.1仍爲5.0('(50 * 0.1).is_integer()'爲真)。 –

+0

也許它取決於處理器,因爲我看到它發生[這裏](https://repl.it/Dz1g/6)。 – trincot

+0

不,我可以重現它,當我離開乘法並使用加法50次。 –