2011-07-29 21 views
4

私はpythonで問題を抱えています.1つのfloatから配列を減算すると、非常に小さな数値(1e-8より小さい)が自動的に丸められます。この例を見てみましょう:ラウンドしないのpythonを強制する方法についてPythonでnumpy配列を減算するときの不要な丸め

import numpy as np 
float(1) - np.array([1e-10, 1e-5]) 

任意の考え?これは私にいくつかのケースでゼロで割ることを余儀なくさせ、問題になっています。 numpyの配列から減算するときも同じ問題が発生します。

+0

私は、1の累乗に小さな数字を上げ、0に丸めて同じ問題を抱えています。 – mike

+1

あなたにはダウンボントがあります...それは良い質問です、i.m.o. –

答えて

6

主に、それはあなたをだましていますnumpyの配列のちょうどreprです。

の上にあなたの例を考えてみましょう:だから最初の要素は、実際にゼロではない、それはそのように見せてnumpyの配列のちょうどプリティプリントだ

[ 1.  0.99999 ] 
0.99999999999 
False 

import numpy as np 
x = float(1) - np.array([1e-10, 1e-5]) 
print x 
print x[0] 
print x[0] == 1.0 

この利回りを。これはもちろんnumpy.set_printoptions.

によって制御することができる

、numpyのはfundementally限られた精度の浮動小数点数を使用しています。 numpyの全体的な点は、同様のデータの配列のメモリ効率の良いコンテナになるため、numpyにはdecimalクラスに相当するものはありません。

しかし、64ビット浮動小数点精度はまともな精度を持っています。あなたは1e-10と1e-5であまりにも多くの問題を打つことはありません。必要に応じて、numpy.float128 dtypeもありますが、ネイティブ浮動小数点を使用するよりも操作が非常に遅くなります。

+0

私はそれについては考えていませんでしたが、あなたは絶対に正しいです。 +1 – redShadow

1

私はすべて、非常に小さな浮動小数点数の扱い、Pythonとその基礎となるCライブラリの扱いに依存していると思います。このようフラク番号など

あなたが別の何かに依存している必要があります私見あなたは、精度のレベルを必要とする場合など

私はすでにそれを処理するために何かがあるかどうかわかりませんが、あなたはに管理することができればその数値を別の方法(例えば1/100000000001/100000)で表現してから、すべての計算が終了した時点で浮動小数点の結果を計算すれば、これらの問題はすべて回避する必要があります。

(もちろん、あなたが自動的に数式などを再実装することを避けるためにフラク計算を扱ういくつかのクラスが必要です)

関連する問題