Trois divergences flottantes
Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 3 — Algorithmes, programmes et complexité
Énoncé
Mesurer, en C, ce que valent ces trois expressions, et dire à chaque fois quelle propriété des réels est perdue.
0.1 + 0.2 == 0.3
1e16 + 1.0 == 1e16
(0.1 + 0.2) + 0.3 == 0.1 + (0.2 + 0.3)
Combien de tours fait while (y < 1.0) { y = y + 0.1; } en partant de y = 0.0 ?
Corrigé
0.1 + 0.2 = 0.30000000000000004 == 0.3 ? non
1e16 + 1.0 = 10000000000000000 == 1e16 ? OUI
(0.1 + 0.2) + 0.3 = 0.60000000000000009
0.1 + (0.2 + 0.3) = 0.59999999999999998 egaux ? non
tours de « while (y < 1.0) y += 0.1 » : 11, y final = 1.0999999999999999
(1) L'exactitude de l'écriture décimale est perdue. Ni ni ne s'écrivent en base avec un nombre fini de bits — comme en base . Chacun est arrondi, et les deux erreurs se cumulent.
(2) L'absorption : avec . Un double porte bits de mantisse. À côté de , l'écart entre deux flottants consécutifs vaut : le nombre n'existe pas, et l'addition le ramène à . Toute somme où de petits termes s'ajoutent à un grand total en souffre — le problème 3.4 en fait la mesure.
(3) L'associativité de l'addition est perdue. C'est le plus déroutant, et le plus lourd de conséquences : deux programmes qui ne diffèrent que par le parenthésage — ou par l'ordre de sommation, ou par la répartition d'un calcul sur plusieurs c{œ}urs — ne donnent pas le même résultat. En arithmétique flottante, et sont deux expressions différentes.
Les onze tours. On en attendait dix : . Mais chaque addition arrondit, et la somme de dix fois vaut , strictement inférieure à : la boucle repart pour un tour de plus et sort à . Le compte de tours d'une boucle ne se confie jamais à un flottant. On écrit
for (int k = 0; k < 10; k = k + 1) { y = y + 0.1; }
et l'on compte sur un entier, quitte à calculer à partir de . C'est la règle du chapitre : « l'on compte les tours de boucle sur un entier, jamais sur un flottant qu'on incrémente ».
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.