2012-01-02 4 views
3

I持ってmath domain error例外スローし、このコード:このPythonの数値エラーをうまく処理するには?

v = -1.0 

for i in range (201): 
    print acos (v) 
    v += 0.01 

をしかし、私はこれに変更した場合、それが動作:

v = -100 

for i in range (201): 
    print acos (v/100.0) 
    v += 1 

これが原因で、丸めのですか?

これをPythonで最もうまく解決する方法は?それとも私は最後の例のようにしなければなりませんか?

+0

私は数学的な問題のように見えます。 'acos'が入力をサポートしているかどうか確認しましたか? – muhuk

+1

あなたが見ることができるかわかりませんが、2番目のコードは最初のコードとは異なるものを実行しています... – JBernardo

+0

最初の例で最後の行を修正しました。 –

答えて

9

そうした場合:

>>> format(0.01, '.30f') 
'0.010000000000000000208166817117' 

あなたは(倍精度の浮動小数点数など)0.01はあなたが学校で学んだ数0.01よりも大きいことがわかります。

>>> sum([0.01]*100) 
1.0000000000000007 

をそして、それは数学・ドメイン・エラーを与えるのに十分です:

だから、あなたが100回、それを合計すると、エラーが大きくなります。

あなたは何ができますか?

  • 以下小数点に
  • round()にそれを第二のコードを使用:

>>> round(1.0000000000000007, 13) 
1.0 

13または14で十分かもしれません。

1

あなたはこれを試すことができます。

v = -1.0 
for i in range(201): 
    print acos(v) 
    v = round(v + 0.01, 2) 

は、それはあなたの質問のために動作します。これは、浮動小数点数と同じ古い問題です。すべての10進数をバイナリで正確に表現できるわけではありません。これを実行します。

v = -1.0 
for i in range(201): 
    print repr(v), acos(v) 
    v += 0.01 

をそして、あなたは右のエラーの前に、ループの最後でそれを参照してくださいよ、vはがmath domain errorを引き起こすものであることを少し1.0よりも大きく、かつ値を持っています。

+0

vをインクリメントした直後に丸めるほうが良いので、時間の経過とともにエラーは増加しません。 –

+0

@NiklasBaumstark提案してくれてありがとう、私はそれに応じて私の答えを編集しました。 –

関連する問題