印刷された値が正しくありません。あなたの場合、 を使用する場合y
よりも小さく、を使用する場合と同じかそれ以上です。丸め誤差は のサイズに依存するため、これは予期されることです。1
float64
1
float32
float
この種の問題を回避するために、浮動小数点数を扱うときは、常に「最小誤差」を決定する必要があります。これは通常epsilon
、等値を比較する代わりに、結果がepsilon
目標値から最大で離れているかどうかを確認するために呼び出されます。
In [13]: epsilon = 1e-11
In [14]: number = np.float64(1) - 1e-16
In [15]: target = 1
In [16]: abs(number - target) < epsilon # instead of number == target
Out[16]: True
特に、特定の許容誤差が与えられた場合に配列が等しいかどうかを比較するのに便利な which はnumpy
すでに提供されています。np.allclose
引数が配列でない場合でも機能します(例np.allclose(1 - 1e-16, 1) -> True
)。
ただし、/の印刷numpy.set_printoptions
方法には影響しないことに注意してください。配列の印刷方法にのみ影響します。np.float32
64
In [1]: import numpy as np
In [2]: np.float(1) - 1e-16
Out[2]: 0.9999999999999999
In [3]: np.array([1 - 1e-16])
Out[3]: array([ 1.])
In [4]: np.set_printoptions(precision=16)
In [5]: np.array([1 - 1e-16])
Out[5]: array([ 0.9999999999999999])
In [6]: np.float(1) - 1e-16
Out[6]: 0.9999999999999999
また、対話型インタープリターで実行print y
または評価すると、異なる結果が得られることに注意してください。y
In [1]: import numpy as np
In [2]: np.float(1) - 1e-16
Out[2]: 0.9999999999999999
In [3]: print(np.float64(1) - 1e-16)
1.0
違いは、print
呼び出しstr
を評価しながら呼び出すことrepr
です:
In [9]: str(np.float64(1) - 1e-16)
Out[9]: '1.0'
In [10]: repr(np.float64(1) - 1e-16)
Out[10]: '0.99999999999999989'