2 つの数値を n 桁の有効数字に丸めたときに、その数値がほぼ等しいかどうかを判定する関数 質問する

2 つの数値を n 桁の有効数字に丸めたときに、その数値がほぼ等しいかどうかを判定する関数 質問する

サードパーティが提供するライブラリをテストするように依頼されました。このライブラリは、重要な数字。重要でない誤差は無視しても問題ありません。結果を比較するのに役立つ関数を書きたいと思います。

def nearlyequal(a, b, sigfig=5):

この関数の目的は、2つの浮動小数点数(aとb)がほぼ等しいかどうかを判定することです。関数は、a==b(完全一致)の場合、またはaとbを丸めて同じ値になる場合にTrueを返します。記号図10 進数で表記した場合の有効数字。

誰か良い実装を提案してくれませんか? ミニユニットテストを書きました。私のテストにバグが見られない限り、良い実装は次のテストに合格するはずです:

assert nearlyequal(1, 1, 5) 
assert nearlyequal(1.0, 1.0, 5) 
assert nearlyequal(1.0, 1.0, 5) 
assert nearlyequal(-1e-9, 1e-9, 5) 
assert nearlyequal(1e9, 1e9 + 1 , 5) 
assert not nearlyequal(1e4, 1e4 + 1, 5) 
assert nearlyequal(0.0, 1e-15, 5) 
assert not nearlyequal(0.0, 1e-4, 6) 

その他の注意事項:

  1. 値 a と b は、int、float、または numpy.float64 型になります。値 a と b は常に同じ型になります。変換によって関数に追加のエラーが発生しないことが重要です。
  2. これを数値のままにしておきましょう。文字列に変換したり、非数学的なトリックを使用したりする関数は理想的ではありません。このプログラムは、関数が期待どおりに動作することを証明したい数学者によって監査されます。
  3. 速度...たくさんの数字を比較する必要があるので、速いほど良いです。
  4. 私は numpy、scipy、標準ライブラリを持っています。特にプロジェクトのごく一部では、他のものを入手するのは難しいでしょう。

ベストアンサー1

Python 3.5では、これを標準ライブラリを使って行う標準的な方法は、math.isclose関数。

署名は次の通りです。

isclose(a, b, rel_tol=1e-9, abs_tol=0.0)

絶対誤差許容度の使用例:

from math import isclose
a = 1.0
b = 1.00000001
assert isclose(a, b, abs_tol=1e-8)

精度が欲しいなら小数点以下の桁数を変更するには、最後の行を次のように置き換えます。

assert isclose(a, b, abs_tol=10**-n)

おすすめ記事