2017-08-24 4 views
2

私はいくつかの正規化操作を行っていますが、驚いたことに、操作を元に戻そうとすると、既定の6小数点精度であるassert_array_almost_equalに対して100%の不一致が発生します。これはなぜ起こるのですか?それは私の最大値の精度に起因することができますか?もしそうなら、どのようにしてnumpy.ndarray.max()の精度を上げることができますか?正規化操作を元に戻すときの精度問題

from __future__ import division 
import numpy 

_max = numpy.float128(67.1036) # output of numpy.ndarray.max() on an a float32 array 

def divide_and_mult(x, y): 
    return numpy.divide(numpy.float128(x), y) * y 

for i in range(100): 
    try: numpy.testing.assert_array_equal(divide_and_mult(i, _max), numpy.float128(i)) 
    except AssertionError, e: print e 
+0

"assert_array_equalのデフォルトの小数点以下6桁の精度" < - 私は 'assert_array_equal'関数を何か他のものと混同しなければならないと思います。そのようなデフォルトはありません: 'assert_array_equal'は、公差なしで、_exact_等値をチェックします。 –

+0

はい、あなたは正しいMark、私は不一致パーセンテージを見るために別の実験で使用したnumpy.testingから 'assert_array_almost_equal'関数を参照していました。 –

答えて

2

あなたは最高でも低くなっているほとんどのシステムでは、float128よりnumpyの配列で、より精度を得ることができません:float64

通常、精度のビットロスは気にせず、np.testing.assert_almost_equalまたは特定の絶対差や相対差をテストできる類似の関数を使用してください。 sympyのような象徴的な数学ライブラリへdecimal.Decimalまたはfractions.Fractionまたはスイッチ:あなたが無限または少なくともユーザ定義の精度を持つタイプを使用する必要がはるかに高い精度でそれをしたい場合には