2017-01-31 10 views
0

私はnumpy.float32オブジェクトをJSONとしてエンコードしたいと思っています。問題は、ネイティブのPython floatに変換すると、値の精度が失われることです。float32からfloatに変換するときの精度を保持する方法は?

例:

In [1]: import numpy as np 
In [4]: np.float32(295.96).item() 
Out[4]: 295.9599914550781 

Iが最初に浮いているように、次に、文字列に変換する場合は、精度が保持されます。

In [3]: float(str(np.float32(295.96))) 
Out[3]: 295.96 

文字列を最初に通過することなく精度を保持する方法はありますか?

str(np.float32(295.96))は精度が保持されますが、np.float32(295.96).item()(またはfloat(np.float32(295.96))またはnp.asscalar(np.float32(295.96)))の精度を保持しているように見えるのはなぜですか。

注:精度は常に.01と仮定できません。私はデータの本来の精度を保持する必要があります。

+0

float32-> float変換で精度を失うことはありません。 float32を作成すると、ほとんどの精度低下が発生します。 float32-> float変換は、その精度損失を可視化するだけです。 – user2357112

+0

'float'は' float64'ですので、できません – Eric

答えて

2

32ビット値に64ビットの精度を格納することはできません。 Pythonでは、floatは64ビットです(Cではdoubleと呼ばれています)。デモとして64ビットが浮くと、すべてがOKです:

>>> d = 295.6; dn = np.float64(d) 
>>> (d, dn) 
(295.6, 295.95999999999998) # numpy prints out more digits than python 
>>> d == dn # but these are still the same 
True 
>>> d - dn 
0.0 

をしかし、あなたがしようとすると32ビットを使用する場合は、精度を落とす

>>> d = 295.96; fn = np.float32(d) 
>>> (d, fn) 
(295.96, 295.95999) 
>>> d == fn 
False 
>>> d - fn 
8.5449218545363692e-06 

なぜSTR(NPを行います。 float32(295.96))は精度を保持しているようです

str(np.float32(295.96))便宜上ラウンド(ベース10)。四捨五入すると、コードで入力したテキストと完全に一致します。その結果、まったく同じ値になります。

+0

float - > float32 - > str - > floatは、精度を保持しているように見えるのは何ですか? – FGreg

+0

入手しました。ですから、これを動作させるには、ソースデータが 'np.float64'であることを確認する必要があります。 – FGreg

2

コンソールで表示される内容が間違っていると誤って認識しています。表示される結果(つまり、丸め)は、あなたがコンソールを見ているあなたのためだけです。これは残念ながら浮動小数点の印刷がどのように実装されるかです(IMOは混乱します)。

基礎となる浮動小数点は常に正しいです(例:

In [4]: a = np.float32(295.96) 
In [5]: a 
Out[5]: 295.95999 
In [6]: import json 
In [7]: json.dumps(a.item()) 
Out[7]: '295.9599914550781' 
+0

丸めはあなたのためだけではありません。 (一部)丸めは 'float'と' double'の違いです – Eric

関連する問題