Aller au contenu principal

Informatique · Première · 4 min de lecture

Nombres flottants : pourquoi 0,1 + 0,2 ne fait pas 0,3

Un nombre flottant est représenté en base 2 avec un nombre fini de chiffres significatifs : seuls certains décimaux sont exacts (ceux qui s'écrivent avec un dénominateur puissance de 2, comme 0,25 ou 0,5) ; 0,1 et 1/3 n'ont pas d'écriture binaire finie ; en Python, 0.1 + 0.2 == 0.3 vaut False ; il faut éviter de tester l'égalité de deux flottants et comparer plutôt leur écart à une tolérance.

Chapitre du programme : Numérique et sciences informatiques (spécialité)

Bloc 1 sur 7 · Comprendre

Comprendre : un nombre fini de bits

Dans le modèle binaire usuel étudié ici, l’ordinateur range un nombre à virgule, appelé flottant, dans un nombre fini de bits (habituellement 64 bits pour le type float de Python). Il l'écrit en base 2. Or certains nombres n'ont pas d'écriture finie dans une base donnée.

C'est déjà vrai en base 10 : 1/3 = 0,333… ne s'écrit pas avec un nombre fini de chiffres. En base 2, c'est le cas de 0,1 : 0,1 = 1/10, et le dénominateur 10 contient le facteur 5, qui ne divise aucune puissance de 2. Le flottant stocké pour 0,1 n'est donc qu'une valeur approchée de 0,1.

À l'inverse, 0,25 = 1/4 et 0,5 = 1/2 ont un dénominateur qui est une puissance de 2 : en base 2, ils s'écrivent exactement 0,01 et 0,1. Ils sont stockés sans erreur.

Bloc 2 sur 7 · Approfondir

Approfondir : ce que Python calcule vraiment

Les petites erreurs d'arrondi se voient dès qu'on additionne :

print(0.1 + 0.2)
print(0.1 + 0.2 == 0.3)
print(0.25 + 0.5 == 0.75)
0.30000000000000004
False
True

La somme des valeurs approchées de 0,1 et de 0,2 n'est pas le flottant le plus proche de 0,3 : le test d'égalité vaut False. Avec 0,25 et 0,5, tout est exact, et le test vaut True.

Une même somme peut d'ailleurs dépendre de la façon dont on la calcule :

print(0.1 + 0.1 + 0.1 == 0.3)
print(0.1 + 0.1 + 0.1)
False
0.30000000000000004

La bonne pratique. Pour comparer des valeurs approchées issues de calculs, on évite généralement l’égalité stricte ==. Une égalité peut être intentionnelle pour des valeurs exactement représentables. On vérifie plutôt que leur écart est plus petit qu'une tolérance choisie :

x = 0.1 + 0.2
print(abs(x - 0.3) < 1e-9)
True

Ce comportement vient de l’arithmétique flottante binaire usuelle, pas d’un défaut de Python. Des langages utilisant le même format et le même mode d’arrondi présentent ces effets, même si l’affichage des nombres peut varier. Le détail de la norme IEEE 754 n’est pas exigé ici.

Bloc 3 sur 7 · Exemple

Exemple guidé : exact ou approché ?

Énoncé. Lesquels de ces nombres sont stockés EXACTEMENT par un flottant : 0,75 ; 0,2 ; 3,5 ; 1/3 ?

Méthode. Une fraction irréductible a une écriture binaire finie si et seulement si son dénominateur est une puissance de deux. Pour être stockée exactement dans un format flottant fini, elle doit aussi tenir dans sa précision et sa plage d’exposants. Ces conditions supplémentaires sont satisfaites pour les petits exemples exacts ci-dessous.

  1. 0,75 = 3/4 : dénominateur 4 = 2² → exact (en base 2 : 0,11).
  2. 0,2 = 1/5 : dénominateur 5 → approché.
  3. 3,5 = 7/2 : dénominateur 2 → exact (en base 2 : 11,1).
  4. 1/3 : dénominateur 3 → approché, comme en base 10.

Conséquence bornée. Une seule addition correctement arrondie dont les deux opérandes et la somme sont exactement représentables donne cette somme exacte, comme 0,25 + 0,5 = 0,75. Une suite d’opérations peut en revanche arrondir un résultat intermédiaire, même si les données et le résultat mathématique final sont représentables : en binary64, (253 + 1.0) - 253 vaut 0.0 au lieu de 1.0.

Bloc 4 sur 7 · Visualiser

Voir : quelques écritures en base 2

Tableau : Nombre, Fraction, Écriture en base 2, Stocké exactement ?
NombreFractionÉcriture en base 2Stocké exactement ?
0,51/20,1oui
0,251/40,01oui
0,753/40,11oui
0,11/100,000110011001100… (le motif 0011 se répète)non
1/31/30,010101… (le motif 01 se répète)non

Continuez sur votre lancée

Vous avez découvert l’essentiel et un exemple. Retrouvez la suite du cours et les points à retenir, puis passez à l’entraînement guidé dans votre compte.

  • Les formules et les repères à retenir
  • Les erreurs fréquentes expliquées
  • Un exercice avec des aides et sa correction

L’accès gratuit comprend les cours et exercices de votre niveau choisi.

Sources

  • BO spécial n°1 du 22 janvier 2019 — programme de spécialité numérique et sciences informatiques de première, « Représentation approximative des nombres réels : notion de nombre flottant »
  • IEEE Std 754-2019, IEEE Standard for Floating-Point Arithmetic
  • Documentation officielle de Python 3 — The Python Tutorial, § 15 « Floating-Point Arithmetic: Issues and Limitations » (https://docs.python.org/3/tutorial/floatingpoint.html)

Vous pensez avoir trouvé une erreur dans cette leçon ? Signalez-la par e-mail.

Explorer les autres cours

Accès rapide