なぜ、このコードは、ループから抜け出すのですか?
-
13-09-2019 - |
質問
import math
t=raw_input()
k=[]
a=0
for i in range(0,int(t)):
s=raw_input()
b=1
c=1
a=int(s)
if a==0:
continue
else:
d=math.atan(float(1)/b) + math.atan(float(1)/c)
v=math.atan(float(1)/a)
print v
print d
print float(v)
print float(d)
while():
if float(v)== float(d):
break
b=b+1
c=c+1
d=math.atan(float(1)/float(b)) + math.atan(float(1)/float(c))
print d
k.append(int(b)+int(c))
for i in range(0,int(t)):
print k[i]
それはfloat(v) != float(d)
まで非常に明白b
が2になりますとc
が3になってます。
解決
while
と評価空のタプル、上のあなたのFalse
ループテスト。このように、while
ループ内のステートメントを実行することはありません。
あなたはそれがwhile
文を検出するまで、あなたのbreak
ループを実行したい場合は、次の操作を行います。
while True:
if (some_condition):
break
else:
# Do stuff...
他のヒント
フロートのようなcomparsisonsを作ることは非常に危険である場合には(A)==フロート(b)のフロート変数には、正確な表現を持っていないので。丸め誤差に、あなたは同じ値を持っていない可能性があります。
あなたは、次を使用することができます1.でも2 * 0.5は一致しない場合があります。
if abs(float(a)-float(b)) < verySmallValue:
http://www.cygnus-software.com/papers/comparingfloats /comparingfloats.htmする
浮動小数点演算は正確ではありません。 0.2のような単純な値にすることはできません 正確にバイナリを使って表現 浮動小数点数、および 浮動小数点の限られた精度 数字は、その中にわずかな変化を意味し、 動作の順序は変更することができます 結果。異なるコンパイラとCPU アーキテクチャは、一時的な結果を格納します 異なる精度で、結果はそう 内容によって異なります お使いの環境の。もしあなたが 計算して、比較します いくつかの期待値は、それに対する結果 あなたが取得する可能性はほとんどありません あなたが意図を正確に結果。に 言い換えれば、あなたは計算を行う場合 その後、この比較を行います。if (結果== expectedResult)
それはないようです 比較はtrueになります。もし 比較が真である、それはおそらくです 不安定 - 入力における小さな変化 値は、コンパイラ、またはCPUが変更される可能性があり 結果との比較を可能にします 偽ます。
まあ、それはブレークポイントに到達しませんでした。問題はwhile()
が全くループをしないということです。無限ループを実行するには、while条件がtrueに評価しなければならないので、(while (1):
を行うこと。ここでは、クリーンアップ作業()のサンプルです。
import math
t = raw_input()
k = []
a = 0.0
for i in range(0,int(t)):
s = float(raw_input())
b = 1.0
c = 1.0
a= float(s)
if a == 0:
continue
else:
d = math.atan(1.0/b) + math.atan(1.0/c)
v = math.atan(1.0/a)
print v
print d
while True:
if v == d:
print 'bar'
break
b += 1
c += 1
d = math.atan(1.0/b) + math.atan(1.0/c)
print d
k.append(int(b)+int(c))
for i in range(0,int(t)):
print k[i]