私が現在勉強しているマニュアル(私は初心者です)は次のように述べています。
"マシンのイプシロン未満で異なる数値は数値的に同じです"
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のタイプは適切な浮動小数点タイプです。」
前もって感謝します。
浮動小数点数は一定の精度を持ち、科学表記では小数点以下数桁までです。数値が大きいほど、その表現の最下位桁が大きくなるため、その数値に寄与する「イプシロン」も大きくなります。
したがって、イプシロンは、それが追加された数に相対的です。これは、引用したドキュメントに実際に記載されています: "... such that 1.0 + eps!= 1.0"。 「参照」番号が、たとえばマグニットの1オーダーで、epsも小さくなります。
そうでない場合、をすべて計算することはできませんは、eps(2.2e-16
私の場合)。
この場合、実際には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