2012-03-02 19 views
36

Pythonでイプシロンの標準値(または取得する方法)はありますか?私は浮動小数点値を比較する必要があり、可能な限り小さな差と比較したいと思っています。Pythonのイプシロンの値

C++には、与えられたデータ型のイプシロン値を与える関数numeric_limits::epsilon()があります。 Pythonには同等のものがありますか?

+5

浮動小数点数を比較すると、値の大きさがイプシロンに影響します。 –

+1

また、値のエラーが操作全体に伝播する可能性があることも考慮してください。フィールド「数値解析」は、この研究に専念しています。 [This](http://floating-point-gui.de/errors/propagation/)サイトにも、従うべき良い規則がいくつかあります。 – Darthfett

答えて

79

この情報はsys.float_infoで利用できます。これはC99のfloat.hに対応しています。

>>> import sys 
>>> sys.float_info.epsilon 
2.220446049250313e-16 
21

strcat postedとしては、sys.float_info.epsilonがあります。

浮動小数点比較の絶対誤差マージンとして使用するという落とし穴を忘れないでください。例えば。多数の場合、丸め誤差はイプシロンを超える可能性があります。

リフレッシュする必要があると思われる場合は、標準参照番号はDavid GoldbergのWhat Every Computer Scientist Should Know About Floating-Point Arithmeticです。レビューを簡単にするために、The Floating Point Guideを参照してください。

0

驚いたことに、多くの人が代わりにnumpy.finfo(type(variable)).epsを使用すると思います。精度を評価する場合は.resolutionとなります。

finfoは浮動小数点型のみであり、Python独自のfloat型(numpyの型に限定されない)でも動作することに注意してください。整数型の等価はiinfoですが、正確な情報は含まれていません(なぜなら、それはなぜでしょうか?)。

+0

「ほとんどの人」について意見が異なります。誰もがNumPyを使用するわけではありません。 * Python *の 'float'のためにイプシロンを使いたい場合は' sys.float_info'を使います;そのためにNumPyを使用するのは奇妙なことです。 * NumPy *型( 'np.float32'、' np.float64'など)の値の後ろにいるなら、 'numpy.finfo'を使います。 –

+0

言い回しを変更しました。しかし、明確にするために 'np.finfo(float)' _does_は働いていますが、numpyを使用しないと、それだけでパッケージをインストールするのは残念です。 – Sheljohn

+1

NumPy [即時変換](https://github.com/numpy/numpy/blob/6914bb41f0fb3c1ba500bae4e7d671da9536786f/numpy/core/getlimits.py#L378)ので、正しく、 'np.finfo(float)'は少し誤解を招くことがあります。 'float'を' np.float64'にコピーし、その詳細を報告します。したがって、Pythonの 'float'ではなく、NumPy型を再び報告しています。 (確かに、 'float'と' np.float64'は同じフォーマットです:彼らは両方ともCダブルスをフードの下で使用しています)。 –