単一のfloatから配列を減算するときに、Pythonが非常に小さい数(1e-8よりも小さい)を自動的に丸めるという問題が発生しています。この例を見てください:
import numpy as np
float(1) - np.array([1e-10, 1e-5])
Pythonを強制的に丸めないようにする方法について何か考えはありますか?これにより、場合によってはゼロ除算が必要になり、問題になります。numpy配列から減算する場合にも同じ問題が発生します。
単一のfloatから配列を減算するときに、Pythonが非常に小さい数(1e-8よりも小さい)を自動的に丸めるという問題が発生しています。この例を見てください:
import numpy as np
float(1) - np.array([1e-10, 1e-5])
Pythonを強制的に丸めないようにする方法について何か考えはありますか?これにより、場合によってはゼロ除算が必要になり、問題になります。numpy配列から減算する場合にも同じ問題が発生します。
ほとんどの場合、repr
だまされているのは numpy 配列だけです。
上記の例を考えてみましょう:
import numpy as np
x = float(1) - np.array([1e-10, 1e-5])
print x
print x[0]
print x[0] == 1.0
これにより、次の結果が得られます。
[ 1. 0.99999 ]
0.99999999999
False
したがって、最初の要素は実際にはゼロではありません。そのように表示されているのは、numpy 配列のきれいな印刷です。
これは、 によって制御できますnumpy.set_printoptions
。
もちろん、numpy は基本的に限定精度の float を使用しています。numpy の全体的なポイントは、同様のデータの配列のメモリ効率の高いコンテナーであるためdecimal
、numpy のクラスに相当するものはありません。
ただし、64 ビットの浮動小数点数には適切な範囲の精度があります。1e-10 と 1e-5 ではあまり多くの問題に遭遇することはありません。必要に応じてnumpy.float128
dtype もありますが、操作はネイティブ フロートを使用するよりもはるかに遅くなります。
Pythonや基盤となるCライブラリによる非常に小さな浮動小数点数の処理に依存しているのは、ある時点で精度が低下する傾向があることだと思います。
そのレベルの精度が必要な場合は、分数などの別の何かに依存する必要があります。
それを処理するものがすでにあるかどうかはわかりませんが、その数値を別の方法(1/10000000000
およびなど1/100000
)で表現し、すべての計算の最後にのみ浮動小数点の結果を計算できる場合は、回避する必要がありますこれらすべての問題。
(もちろん、数式などを再実装する必要がないように、分数計算を自動的に処理するクラスが必要です。)