2009-06-15 11 views
0
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] 

、それは非常に明白だとしてbまでfloat(v) != float(d)が2になり、cFalseに評価され、空のタプル、上の3なぜこのコードはループから抜け出すのですか?

+0

可読コードとしてフォーマットするのはどうですか? – jitter

+1

これはフォーマットされています –

+3

これは興味深いことですが、Pythonでは* float(1)ではなく – Edmund

答えて

8

あなたwhileループテストになります。したがって、whileループ内のステートメントを実行することはありません:

をあなたはそれがbreak文を検出するまで、あなたのwhileループを実行したい場合は、次の操作を行います。

while True: 
    if (some_condition): 
     break 
    else: 
     # Do stuff... 
+0

float(v)== float(d): break この部分は実行されています! – Hick

+0

おっとしてしまいました!!ありがとうございますが、本当にキーワードはありません!! – Hick

+0

TrueとFalseはpythonキーワードであり、真または偽ではありません。 – Triptych

0

まあ、それは休憩に到達しませんでしたポイント。問題は、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] 
+1

FWIW: "while while"はPythonで "while(1)"よりも優れていますが、 "while()"、 "while": "、" while 0: –

+0

ああ、右は固定:) – mikl

2

をフロート(A)==フロートのようなcomparsisonsを(作ることは非常に危険である場合b)のフロート変数には、正確な表現を持っていないので、原因あなたが同じ値を持っていない可能性が丸め誤差に

でも2 * 0.5は、あなたが以下のように使用することができます。1.一致しない場合があります。。

if abs(float(a)-float(b)) < verySmallValue: 
2

http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm

浮動小数点数は正確ではありません。 0.2のような 単純な値は 正確バイナリ浮動小数点数を用いて表され、浮動小数点数の 限られた精度は、動作の順序 のわずかな変化が 結果を変更することができることを意味することはできません。異なるコンパイラとCPU アーキテクチャでは、一時的な結果が異なる精度で格納されるため、 は環境の詳細 によって異なります。 計算を行い、次に の結果と期待値とを比較すると、 は、 とまったく同じ結果になる可能性は非常に低いです。 で言い換えれば、あなたが計算を行う場合 し、この比較を行います。 (結果== expectedResult)

場合、 比較が真となることはほとんどありません。 の比較が真である場合、おそらく が不安定である - 入力の小さな変更 値、コンパイラ、またはCPUが の値を変更し、比較を falseに変更する可能性があります。

関連する問題