2016-11-06 26 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

がでいくつかのprint文を入れて、だから何がとき '推測= 5.0'起こる – scrappedcola

+0

を見つける起こって見るものでしょうか?あなたの 'if'文は一致しませんが、'推測<= x'はまだ真です。 –

+0

推測がイプシロン内にある場合は、ループを停止しません。 – BrenBarn

答えて

2

条件abs(guess**2 -x) >= epsilonがtrueの場合は、guessだけ増分します。その状態は、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は決して変更された後に再び。実際に

、(正確バイナリ画分を使用して表すことができない)0.1の近似値を追加すると、少量低いあなた値を与えるためguessが正確5.0ない:

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

が、その差まだepsilonより小さい。

あなたがターゲットのepsilon距離以内に達したとき、あなたはおそらくブレークwhileループにしたい:あなたは<代わりの<=にwhile条件を変更

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

たとしても、それは無限にループまだ意志浮動小数点の不正確さが原因です。

0.1のステップを追加しても、guessの値は正確に5になりませんが、4.999999999999998になります。その時点で、ループはifブロックに入力されずに実行され続けます。

これは、少なくとも私はhere

+0

ステップサイズは0.01ではなく、0.1です。 50 * 0.1は依然として5.0です。( '(50 * 0.1).is_integer()'は真です)。 –

+0

多分それはプロセッサーに依存しています。私はそれが起こっているのを見ているからです(https://repl.it/Dz1g/6)。 – trincot

+0

いいえ、乗算から離れて50回加算したときに再現できます。 –

関連する問題