Expliquer pourquoi 0.1 + 0.1 + 0.1 == 0.3 est faux alors que 0.1 + 0.1…
Exercice de TD · niveau 2 · NSI (première), chapitre 2 — Flottants, booléens et textes · Écriture binaire et pièges des flottants
Énoncé
Expliquer pourquoi 0.1 + 0.1 + 0.1 == 0.3 est faux alors que 0.1 + 0.1 == 0.2 est vrai.
Corrigé
Les deux membres de chaque test sont des flottants, c'est-à-dire des approximations. Tout se joue sur la question : les deux approximations tombent-elles sur le même flottant ?
Le cas qui marche. est une multiplication par déguisée : elle ne fait qu'augmenter l'exposant d'une unité, sans toucher à la mantisse — donc sans aucun arrondi. Le résultat est exactement le double du flottant retenu pour , et c'est aussi exactement le flottant retenu pour (même mantisse, exposant décalé). L'égalité est vraie, et elle l'est pour une raison structurelle, pas par chance.
Le cas qui échoue. La troisième addition, elle, arrondit : le résultat exact de n'est pas représentable, la machine prend le flottant le plus proche, et il se trouve qu'il est au-dessus de tandis que le flottant retenu pour est en dessous. Les deux valeurs diffèrent d'un cran.
>>> from decimal import Decimal
>>> Decimal(0.1 + 0.1 + 0.1)
Decimal('0.3000000000000000444089209850062616169452667236328125')
>>> Decimal(0.3)
Decimal('0.299999999999999988897769753748434595763683319091796875')
Piège : conclure de 0.1 + 0.1 == 0.2 que « parfois ça marche, donc on peut tester l'égalité ». Non : cela signifie que le test d'égalité est imprévisible sans une analyse fine des arrondis — c'est précisément pour cela qu'on l'interdit.
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.