2012-03-02 9 views
36

Existe-t-il une valeur standard pour (ou une méthode pour obtenir) epsilon en Python? J'ai besoin de comparer les valeurs à virgule flottante et de comparer avec la plus petite différence possible.Valeur pour epsilon en Python

En C++, une fonction est fournie numeric_limits::epsilon() qui donne la valeur epsilon pour un type de données donné. Y a-t-il un équivalent en Python?

+5

Lors de la comparaison de flottants, l'ampleur des valeurs affectera l'epsilon. –

+1

Considérons également que l'erreur dans les valeurs peut se propager à travers les opérations. Le champ "Analyse Numérique" est consacré à l'étude de ceci. Ce site (http://floating-point-gui.de/errors/propagation/) fournit également de bonnes règles à suivre. – Darthfett

Répondre

79

Les informations sont disponibles dans sys.float_info, ce qui correspond à float.h dans C99.

>>> import sys 
>>> sys.float_info.epsilon 
2.220446049250313e-16 
21

Comme strcat posted, il est sys.float_info.epsilon. Mais n'oubliez pas les pièges de l'utiliser comme une marge d'erreur absolue pour les comparaisons en virgule flottante. Par exemple. pour les grands nombres, l'erreur d'arrondi pourrait dépasser epsilon.

Si vous pensez avoir besoin d'un rappel, la référence standard est What Every Computer Scientist Should Know About Floating-Point Arithmetic de David Goldberg, ou pour une revue plus simple, vous pouvez consulter The Floating Point Guide.

0

Surpris personne ne l'a mentionné ici; Je pense que beaucoup de gens utiliseraient numpy.finfo(type(variable)).eps à la place. Ou .resolution si c'est pour évaluer la précision.

Notez que finfo est uniquement pour les types à virgule flottante et qu'il fonctionne également avec le type float de Python (c'est-à-dire non limité aux types de numpy). L'équivalent pour les types entiers est iinfo, bien qu'il ne contienne pas d'informations de précision (parce que, bien, pourquoi le ferait-il?).

+0

Désapprouvé à propos du «plus grand nombre de personnes»: tout le monde n'utilise pas NumPy. Si vous voulez l'epsilon pour float de * Python *, utilisez 'sys.float_info'; il serait étrange d'utiliser NumPy juste pour ça. Si vous recherchez des valeurs pour les types * NumPy * ('np.float32',' np.float64', etc.), utilisez 'numpy.finfo'. –

+0

Modifié le libellé. Pour clarifier cependant, 'np.finfo (float)' _does_ fonctionne, mais je suis d'accord que si vous n'utilisez jamais numpy, il serait exagéré d'installer le paquet juste pour cela. – Sheljohn

+1

À droite, mais 'np.finfo (float)' est un peu trompeur, car NumPy [convertit immédiatement] (https://github.com/numpy/numpy/blob/6914bb41f0fb3c1ba500bae4e7d671da9536786f/numpy/core/getlimits.py#L378) le 'float' à' np.float64', puis rapporte les détails pour cela. C'est donc un rapport sur un type NumPy à nouveau, pas sur float de Python. (Quoiqu'il en soit, il est très probable que float et np.float64 aient le même format: ils utilisent tous deux le double C sous le capot.) –

Questions connexes