web-dev-qa-db-ja.com

Pythonのマシンイプシロン

私が現在勉強しているマニュアル(私は初心者です)は次のように述べています。

"マシンのイプシロン未満で異なる数値は数値的に同じです"

Pythonでは、float値のマシンイプシロンは、次のように入力して取得できます。

eps = numpy.finfo(float).eps

さて、チェックしたら

1 + eps/10 != 1

私は偽を取得します。

でもチェックしたら

0.1 + eps/10 != 0.1

Trueを取得します。

後者の論理式は、epsを100で除算するとFalseになります。つまり、マシンイプシロンはどのように機能しますか? Pythonドキュメントは言うだけです

「1.0 + eps!= 1.0のように表現可能な最小の正数。epsのタイプは適切な浮動小数点タイプです。」

前もって感謝します。

12
Charlie

浮動小数点数は一定の精度を持ち、科学表記では小数点以下数桁までです。数値が大きいほど、その表現の最下位桁が大きくなるため、その数値に寄与する「イプシロン」も大きくなります。

したがって、イプシロンは、それが追加された数に相対的です。これは、引用したドキュメントに実際に記載されています: "... such that 1.0 + eps!= 1.0"。 「参照」番号が、たとえばマグニットの1オーダーで、epsも小さくなります。

そうでない場合、をすべて計算することはできませんは、eps(2.2e-16 私の場合)。

9
tobias_k

この場合、実際にはnp.finfo。あなたが望んでいるのはnp.spacingは、入力と、正確に表現できる次に大きい数値との間の距離を計算します。

基本的に、np.spacingは、任意の数値の「eps」を計算します。これは数値のデータ型を使用します(ネイティブpython浮動小数点数は64ビット浮動小数点数))ので、np.float32またはnp.float16は、64ビットfloatとは異なる回答を提供します。

例えば:

import numpy as np

print 'Float64, 1.0 -->', np.spacing(1.0)
print 'Float64, 1e12 -->', np.spacing(1e12)
print 'Float64, 1e-12 -->', np.spacing(1e-12)
print ''
print 'Float32, 1.0 -->', np.spacing(np.float32(1.0))
print 'Float32, 1e12 -->', np.spacing(np.float32(1e12))
print 'Float32, 1e-12 -->', np.spacing(np.float32(1e-12))

収量:

Float64, 1.0 --> 2.22044604925e-16
Float64, 1e12 --> 0.0001220703125
Float64, 1e-12 --> 2.01948391737e-28

Float32, 1.0 --> 1.19209e-07
Float32, 1e12 --> 65536.0
Float32, 1e-12 --> 1.0842e-19
10
Joe Kington