Question

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

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

Était-ce utile?

La solution

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

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

Autres conseils

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

Mais n'oubliez pas les pièges de l'utiliser comme marge d'erreur absolue pour les comparaisons de points flottants. Par exemple, pour un grand nombre, l'erreur d'arrondi pourrait dépasser Epsilon.

Si vous pensez que vous avez besoin d'un recyclage, la référence standard est celle de David Goldberg Ce que chaque informaticien doit savoir sur l'arithmétique à virgule flottante, ou pour une critique plus simple, vous pouvez consulter Le guide des points flottants.

Surpris que personne ne soit mentionné ici; Je pense que beaucoup de gens utiliseraient numpy.finfo (type (variable)) .eps Au lieu. Ou .resolution Si c'est pour évaluer la précision.

Notez que finfo est uniquement pour les types de points flottants, et qu'il fonctionne également avec Python float Type (c'est-à-dire non limité aux types de Numpy). L'équivalent pour les types entiers est iinfo, bien qu'il ne contient pas d'informations de précision (parce que, pourquoi le serait-il?).

Si vous ne trouvez pas de fonction pour ce faire, n'oubliez pas que l'algorithme pour calculer la précision de la machine est très facile (vous pouvez tester avec votre langage de programmation préféré) .Eg, 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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top