2016-10-23 12 views
1

Pythonのいくつかの実装(64ビットOS)をテストしていますが、正確な答えを測ることに興味があります(正しい小数点はいくつですか?反復回数が増えます。浮動小数点表現そのものが不正確であるため、小数点以下15桁を比較することは望ましくありません。浮動小数点結果の精度をN小数点以下の桁数に換算する

など。低反復カウントのために、私が得た答えは、私は私の答えは3になりたい上記の場合

>>> math.pi 
3.141592653589793 

をにMath.PIするために比較したい

>>> x 
3.140638056205993 

ある (第三十進数が間違っています)私はそれをやった方法は次のとおりです。

>>> p = str('%.51f' % math.pi) 
>>> q = str('%.51f' % x) 
>>> for i,(a,b) in enumerate(zip(p,q)): 
...  if a != b: 
...   break 

上記すなわち文字列に山車を変換して文字ずつ比較し、これを行うのは良い方法があり、私には不器用に見える、より多くを語るPython的または股関節tは生の浮動小数点値自体を使用しますか?

Btw math.frexpが見つかりました。これを使用してこれを行うことはできますか?

>>> math.frexp(x) 
(0.7851595140514982, 2) 
+0

これは、指定されたデルタ/イプシロン内で比較しています。例えば。上記の2つの値の差は0.0009545973838003263です。これは小数点第3位に変換できません。 – Tanager4

+1

小数点の値に本当に関心がある場合は、はるかに良いとは思いません。0.02と同じ違いがあります大文字小文字の違いによる第2小数点または第1小数点への影響:2.34 vs 2.36または2.39 vs 2.41。 – Julien

答えて

3

は、あなたは、2つの数の差に等しくなるように取るん10のどのパワー見つけ出すている、基本的に2つの

>>> val = 3.140638056205993 
>>> epsilon = abs(val - math.pi) 
>>> abs(int(math.log(epsilon, 10))) + 1 
3 

間の差の対数を計算することができます。これは、2つの数値の差が1未満の場合にのみ機能します。

+0

OPが本当に最初の10進数の後に来る場合は、結果が1つしかない可能性があります(私のコメントを参照してください) – Julien

+0

@JulienBernuああ、あなたは正しいよ –

+0

ブレンダン、別の番号で試してみるとかなり正しくない... >>> U = 3.14623 >>> O = 3.14622 >>> E = ABS(O - U) >>> ABS(INT(math.log(E、10))) 4私は5番目の小数がオフになってから5を期待しています。私はあなたの方法が小数点第1位以内に正確だと思いますか? – Tanager4

関連する問題