Hors programme. On appelle epsilon machine le plus petit ε > 0 tel que…
Exercice supplémentaire · niveau 2 · NSI (première), chapitre 2 — Flottants, booléens et textes · Sous le capot des flottants
Énoncé
Hors programme. On appelle epsilon machine le plus petit tel que en flottants. Le calculer par une boucle, le comparer à , et expliquer pourquoi une tolérance absolue de est un mauvais critère de comparaison.
Corrigé
eps = 1.0
while 1.0 + eps / 2 != 1.0:
eps = eps / 2
>>> eps
2.220446049250313e-16
>>> eps == 2.0 ** -52
True
>>> import sys
>>> sys.float_info.epsilon
2.220446049250313e-16
On retrouve exactement : au voisinage de , deux flottants consécutifs sont distants de , puisque la mantisse compte bits stockés.
Pourquoi une tolérance absolue est mauvaise. L'écart entre deux flottants voisins n'est pas constant : il vaut près de , mais près de , et près de . Un seuil fixe est donc deux fois inadapté :
>>> abs(1e-20 - 2e-20) <= 1e-9
True
>>> math.isclose(1e-20, 2e-20)
False
Le critère absolu déclare égaux deux nombres dont l'un est le double de l'autre. À l'autre bout de l'échelle, il déclarerait différents deux calculs de ne différant que par le dernier bit — alors qu'ils sont indiscernables.
Contrôle : c'est précisément ce que fait le eps * max(1.0, abs(x), abs(y)) de presque_egaux dans le cours : mettre la tolérance à l'échelle des nombres comparés. Ce n'est pas une coquetterie, c'est la seule formulation correcte.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.