78 votes

Valeur d'epsilon en Python

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

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

8 votes

Lors de la comparaison de flottants, la magnitude des valeurs affecte l'epsilon.

1 votes

Considérez également que les erreurs de valeurs peuvent se propager entre les opérations. Le domaine "Analyse numérique" est consacré à l'étude de ce phénomène. Ce site Le site fournit également quelques bonnes règles à suivre.

0 votes

En guise d'exemple pour le commentaire des gens ci-dessus, 1e300-(1e300-1e200) retourner 0.0 où la différence réelle doit être de 10^200.

143voto

strcat Points 1781

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

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

35voto

Ergwun Points 5293

Comme strcat a 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 en virgule flottante. Par exemple, pour les grands nombres, l'erreur d'arrondi pourrait dépasser epsilon.

Si vous pensez avoir besoin d'une remise à niveau, la référence standard est l'ouvrage de David Goldberg. Ce que tout informaticien devrait savoir sur l'arithmétique à virgule flottante ou pour un examen plus simple vous pouvez consulter Le guide de la virgule flottante .

9voto

s.ouchene Points 907

Si vous ne trouvez pas de fonction pour le faire, rappelez-vous que l'algorithme pour calculer l'epsilon de la machine est très facile (vous pouvez le 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 epsilon is:", eps)

Dans mon cas, j'ai obtenu :

The machine epsilon is: 2.220446049250313e-16

0 votes

Belle façon de générer des eps mais pourquoi l'appelez-vous précision machine ?

0 votes

@gfdsal : Merci, je pense que epsilon machine devrait être le terme exact.

8voto

Sh3ljohn Points 746

Je suis surpris que personne ne l'ait mentionné ici ; je pense que beaucoup de personnes utiliseraient numpy.finfo( type(variable) ).eps à la place. Ou .resolution s'il s'agit d'évaluer la précision.

Notez que finfo n'est que pour les types à virgule flottante, et qu'il fonctionne également avec la méthode Python float (c'est-à-dire qu'elle n'est pas limitée aux types de numpy). L'équivalent pour les types entiers est iinfo Bien qu'il ne contienne pas d'informations précises (parce que, pourquoi le ferait-il ?).

7 votes

Je ne suis pas d'accord avec "la plupart des gens" : tout le monde n'utilise pas NumPy. Si vous voulez l'epsilon pour Python 's float utiliser sys.float_info il serait étrange d'utiliser NumPy uniquement pour cela. Si vous recherchez des valeurs pour NumPy types ( np.float32 , np.float64 etc.), puis utilisez numpy.finfo .

1 votes

J'ai changé la formulation. Mais pour clarifier, np.finfo(float) fait mais je suis d'accord pour dire que si vous n'utilisez jamais numpy, il serait exagéré d'installer le paquet juste pour cela.

4 votes

Oui, mais np.finfo(float) est un peu trompeuse, puisque NumPy convertit immédiatement le site float a np.float64 et en rapporte les détails. Il s'agit donc d'un type NumPy, et non pas d'un type Python. float . (Bien qu'il faille admettre qu'il est très probable que ) float y np.float64 ont le même format : ils utilisent tous deux des doubles C sous le capot).

0voto

Rúben Dias Points 196

Ce qui suit a également fonctionné pour moi :

>>> import math
>>> math.ulp(1.0)
2.220446049250313e-16

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X