web-dev-qa-db-fra.com

Valeur pour epsilon dans Python

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

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

49
thornate

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

>>> import sys
>>> sys.float_info.epsilon
2.220446049250313e-16
103
strcat

Comme strcat publié , il y a sys.float_info.epsilon.

Mais n'oubliez pas les pièges de son utilisation comme marge d'erreur absolue pour les comparaisons à virgule flottante. Par exemple. pour les grands nombres, l'erreur d'arrondi peut dépasser epsilon.

Si vous pensez avoir besoin d'un recyclage, la référence standard est celle de David Goldberg Ce que tout informaticien devrait savoir sur l'arithmétique à virgule flottante , ou pour une revue plus simple, vous pouvez consulter The Floating Point Guide .

27
Ergwun

Surpris, personne n'a mentionné cela ici; Je pense que beaucoup de gens utiliseraient plutôt numpy.finfo (type (variable)) .eps . Ou .resolution pour évaluer la précision.

Notez que finfo est uniquement pour les types à virgule flottante, et qu'il fonctionne également avec le propre 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 (car, eh bien, pourquoi le ferait-il?).

2
Sheljohn

Si vous ne trouvez pas de fonction pour cela, rappelez-vous que l'algorithme pour calculer la précision de la machine est très simple (vous pouvez tester avec votre langage de programmation préféré). Par exemple, pour python:

eps = 1.0
while eps + 1 > 1:
    eps /= 2
eps *= 2
print("The machine precision is:", eps)

Dans mon cas, j'ai eu:

The machine precision is: 2.220446049250313e-16

0
Navaro