MathLvl
Question de mathsMathsRaisonnement et algorithmes

Pourquoi un ordinateur affirme-t-il que 0,1 + 0,2 n'est pas égal à 0,3 ?

En binaire, 0,1 s'écrit avec une infinité de chiffres (une série géométrique de somme 1/10) ; l'ordinateur la tronque et Python affiche 0,30000000000000004 : il ne faut jamais tester l'égalité de deux nombres à virgule.

Grand oral session 2027 : exposé de 10 minutes debout, puis 10 minutes d'échange, sans calculatrice. Plan prévu pour 10 min.

Pourquoi cette question : un modèle d'introduction

Le jury attend que vous expliquiez pourquoi vous avez choisi la question. Inspirez-vous de ce modèle, mais racontez votre propre parcours.

En cours de Python, j'ai tapé 0.1 + 0.2 == 0.3 et l'ordinateur a répondu False. J'ai d'abord cru à un bug. En cherchant, j'ai découvert que l'ordinateur ne connaît pas le nombre 0,1 : il n'en connaît qu'une approximation, parce qu'il compte en base 2. J'ai voulu expliquer ce phénomène avec les suites géométriques.

L'enjeu et les notions du programme

Comprendre l'écriture des nombres en base 2, la somme d'une série géométrique et les conséquences des arrondis en algorithmique.

Mathématiques

  • Nombres décimaux, fractions, écriture des nombres (seconde)
  • Somme des termes d'une suite géométrique (première)
  • Limite d'une suite géométrique de raison comprise entre −1 et 1 (terminale)
  • Algorithmique en Python : flottants, tests d'égalité (seconde, première)

Le plan de l'exposé en 10 min

  1. 1. Introduction : un « bug » qui n'en est pas un

    1,5 min

    Python affiche 0.1 + 0.2 = 0.30000000000000004. Problématique : pourquoi un ordinateur, qui calcule si vite, se trompe-t-il sur une addition d'école primaire ?

  2. 2. 0,1 en base 2 : une écriture infinie

    4 min

    En base 2, les chiffres après la virgule valent 1/2,1/4,1/8,…. Un nombre a une écriture binaire finie si et seulement s'il s'écrit a/2^(k). Or 1/10=1/2×5 : le 5 empêche toute écriture finie, de même que 1/3 n'a pas d'écriture décimale finie.

    On trouve 0,1=0,0 0011 0011 0011… en base 2. Vérifions-le : les chiffres 1 sont aux rangs 4, 5, 8, 9, 12, 13… La somme vaut 1/16+1/32+1/256+1/512+…=3/32(1+1/16+1/16²+…). C'est une série géométrique de raison 1/16 : 3/32×1/(1-1/16)=3/32×16/15=1/10.

  3. 3. Ce que fait l'ordinateur, et ce qu'il faut faire

    3 min

    Un flottant garde 53 chiffres binaires significatifs. 0,1 est arrondi à 0,1000000000000000055… ; 0,2 et 0,3 aussi, et les erreurs ne se compensent pas : l'écart final vaut environ 5,6×10⁻¹⁷.

    Conséquence pratique : on ne teste jamais x == y pour des flottants, mais abs(x - y) < 1e-9. Une boucle « while x != 1 » où x augmente de 0,1 ne s'arrête jamais. Exemple historique : en 1991, un missile Patriot comptait le temps par dixièmes de seconde sur 24 chiffres binaires ; l'erreur d'environ 9,5×10⁻⁸ s par dixième, accumulée sur 100 heures (3,6 millions de dixièmes), atteignait 0,34 s, assez pour manquer sa cible.

  4. 4. Conclusion

    1,5 min

    L'ordinateur ne se trompe pas dans son calcul : il calcule exactement sur des approximations de 0,1 et 0,2, parce que ces nombres ont une écriture binaire infinie. La somme d'une série géométrique le prouve. J'ouvre sur le calcul exact : Python sait manipuler des fractions (module fractions), au prix d'une vitesse moindre.

Ce que j'écris au tableau

Pas de calculatrice ni de support numérique : un calcul clé écrit au tableau rend l'exposé concret et montre la solidité des connaissances.

0,1=(0,0 0011 0011…)₂=3/32Σ_k=0^(+∞)(1/16)^(k)=3/32×16/15=1/10
écriture binaire finie ⇔ x=a/2^(k)
3,6×10⁶×9,5×10⁻⁸≈0,34 s

Conclusion : la réponse à la question

0,1 + 0,2 ne fait pas exactement 0,3 pour un ordinateur, car 0,1 a une écriture binaire infinie, tronquée en mémoire. En algorithmique, on compare donc des flottants à une tolérance près. Les mathématiques expliquent l'erreur et en mesurent la taille.

Les questions probables du jury

Pendant les 10 minutesd'échange, le jury vous fait préciser et approfondir, sur tout le programme de vos spécialités en lien avec la question.

0,5 et 0,25 posent-ils le même problème ?

Non : 0,5=1/2 et 0,25=1/4 ont une écriture binaire finie (0,1 et 0,01 en base 2). 0.5 + 0.25 == 0.75 renvoie True.

Écrivez 1/3 en base 10 comme une série géométrique.

0,333…=3/10×1/(1-1/10)=3/10×10/9=1/3.

Démontrez la formule de la somme d'une suite géométrique.

S=1+q+…+qⁿ et qS=q+…+qⁿ⁺¹, donc (1-q)S=1-qⁿ⁺¹. Si |q|<1, qⁿ⁺¹→0 et S→1/(1-q).

Comment tester l'égalité de deux flottants en Python ?

abs(a - b) < 1e-9, ou math.isclose(a, b), avec une tolérance adaptée à l'ordre de grandeur des nombres.

Une boucle x = 0 ; while x != 1 : x = x + 0.1 s'arrête-t-elle ?

Non : x vaut 0.9999999999999999 après dix tours, puis dépasse 1 sans jamais lui être égal.

Pourquoi les ordinateurs comptent-ils en base 2 ?

Les circuits électroniques distinguent facilement deux états (courant ou non) ; deux chiffres suffisent.

Les pièges qui coûtent des points

  • Parler d'un « bug » ou d'une erreur de calcul de l'ordinateur.
  • Croire que tout décimal a une écriture binaire finie.
  • Écrire une boucle ou un test avec == sur des flottants.

Revoir les notions

Autres questions : raisonnement et algorithmes

Toutes les questions de maths →

Préparer l'oral, pas seulement le contenu

Gestion des 20 minutes de préparation, usage du tableau, posture debout, réponses au jury : la méthode complète, conforme aux règles de la session 2027.

Méthode : traiter une question de Grand oral →