2017-08-24 2 views
2

Je suis en train de faire une opération de normalisation et, à ma grande surprise, lorsque j'essaie de rétablir l'opération, j'obtiens un décalage de 100% pour la précision 6 décimale par défaut de assert_array_almost_equal. Pourquoi cela se produit-il? Cela peut-il être dû à la précision de ma valeur maximale? Si oui, comment puis-je obtenir plus de précision dans numpy.ndarray.max()?Problèmes de précision lors de la restauration de l'opération de normalisation

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

"la précision 6 décimale par défaut de assert_array_equal" <- Je pense que vous devez confondre la fonction 'assert_array_equal' avec quelque chose d'autre. Il n'y a pas de valeur par défaut: 'assert_array_equal' vérifie l'égalité _exact_, sans tolérance. –

+0

Oui, vous avez raison Mark, je faisais référence à la fonction 'assert_array_almost_equal' de numpy.testing que j'ai utilisée dans une autre expérience pour voir le pourcentage de discordance. –

Répondre

2

Vous ne pouvez pas obtenir plus de précision avec des tableaux numpy que float128, sur la plupart des systèmes, le meilleur est encore plus faible: float64.

Normalement, vous ne vous souciez pas d'une perte de précision et utilisez np.testing.assert_almost_equal ou des fonctions similaires qui vous permettent de tester une différence absolue absolue et/ou relative.

Si vous voulez faire avec beaucoup plus de précision, vous devez utiliser un type qui a une précision infinie ou au moins défini par l'utilisateur: decimal.Decimal ou fractions.Fraction ou passer à une bibliothèque mathématique symbolique comme sympy.