ÉtonniumLycée et prépaLycée Les nombres de la machine

Lycée et prépa · Informatique

Les nombres de la machine

Un ordinateur range chaque nombre dans un nombre fixe de bits. Alors les entiers débordent, et les nombres à virgule sont arrondis : 0,1 + 0,2 ne fait pas tout à fait 0,3. Fais déborder un registre, décortique un nombre à virgule bit par bit, trouve les lois, puis refais le calcul d’une horloge qui a dérivé d’un tiers de seconde.

Types de Python en 2de (maths 2026) ; 1re NSI ⏱ 20 à 30 min 8 missions Modèle exact : IEEE 754
Taille du registre
Codage

Les bits du registre (touche un bit pour le changer) :

L’opposé en complément à deux : inverser tous les bits, puis ajouter 1.

En Python, un int ne déborde jamais : il grandit autant que la mémoire le permet. Ce registre imite les entiers de taille fixe du processeur, du langage C ou de la carte Arduino (un int y fait 16 bits).

Palier 1 · DécouvrirDes nombres de taille fixe

Un compteur qui fait le tour 2de

Un processeur range un entier dans un registre d’un nombre fixe de bits : 8, 16, 32 ou 64. Chaque bit vaut 0 ou 1, et chaque rang vaut le double de celui de sa droite. Avec 8 bits, il n’existe que 2⁸ = 256 combinaisons : pas une de plus.

Ton pronostic : sur 8 bits signés, que donne 127 + 1 ?

  1. Sur le banc, choisis Entiers, 8 bits, signé. Clique sur « max » : le registre affiche 127, un 0 suivi de sept 1.
  2. Clique sur « + 1 ». Regarde les bits, puis la valeur.
  3. Passe en « non signé » : « max » vaut maintenant 255. Que donne 255 + 1 ?
  4. Touche les bits un par un pour composer d’autres nombres, et essaie 16 et 32 bits.

Sur 8 bits non signés, 255 + 1 donne…

Et en Python ? Les entiers int de Python ne débordent jamais : 2**100 donne 1267650600228229401496703205376, exactement. Les entiers de taille fixe sont ceux du processeur et de langages comme le C ; sur la carte Arduino Uno, un int fait 16 bits.

0,1 + 0,2 2de

Les nombres à virgule sont rangés en « virgule flottante » : c’est le type float de Python, exactement le même que le type Number de JavaScript. Tous deux suivent la norme IEEE 754 sur 64 bits, qu’on appelle « double ». Un calcul très simple va te surprendre.

Ton pronostic : en Python, que renvoie le test 0.1 + 0.2 == 0.3 ?

  1. Ouvre la Calculette du banc et choisis « 0,1 + 0,2 ». À gauche, ce que calcule la machine ; à droite, le calcul exact.
  2. Choisis « 0,1 dix fois » : la machine part de 0 et ajoute dix fois 0,1.
  3. Essaie « 0,5 + 0,25 » : cette fois, tout tombe juste. Pourquoi ? Le palier 2 répond.

Le flottant décortiqué 1re NSI

Ouvre Flottants et stocke 0,1. Le banc montre les 64 bits du double : 1 bit de signe, 11 bits d’exposant, 52 bits de mantisse. Juste dessous, la valeur vraiment stockée, écrite en entier.

D’après le banc, 0,1 est-il stocké exactement ?

Au palier 2 : pourquoi 0,1 ne tombe pas juste en binaire, comment est fait un double, et comment la machine écrit les entiers négatifs.

Tes missions

Voici les missions du palier choisi. Réponds, puis clique sur « Valider ma réponse ». Si ce n’est pas encore ça, un indice t’aide. Après trois essais, tu peux voir la solution.

Le savais-tu ?

Des faits vrais, avec les nombres qui les prouvent.

Les mots du module

Chaque mot, en une ou deux phrases.

Bit, octet
Un bit vaut 0 ou 1. Un octet est un groupe de 8 bits : 256 combinaisons.
Registre
Une petite mémoire du processeur, d’un nombre fixe de bits, où se font les calculs.
Entier de taille fixe
Un entier codé sur n bits : 2ⁿ valeurs possibles, pas une de plus. Les int de Python, eux, n’ont pas de taille fixe.
Débordement
Quand un résultat ne tient pas dans le registre : la machine garde les n bits de poids faible, et 32 767 + 1 devient −32 768 sur 16 bits.
Complément à deux
Le codage des entiers signés : le bit de poids fort vaut −2ⁿ⁻¹. On obtient −x en inversant les bits de x puis en ajoutant 1.
Virgule flottante
Un nombre écrit comme signe × mantisse × 2^exposant : la virgule « flotte » selon l’exposant, ce qui permet de ranger aussi bien 10⁻³⁰⁰ que 10³⁰⁰.
Double, simple
Les deux formats les plus courants de la norme IEEE 754 : 64 bits (53 bits de précision, le float de Python) et 32 bits (24 bits de précision).
Mantisse, exposant
La mantisse porte les chiffres significatifs (1,m) ; l’exposant dit par quelle puissance de 2 les multiplier. Il est stocké avec un décalage (1023 en double).
Arrondi au plus proche
La règle de la norme : chaque résultat est remplacé par le flottant le plus proche ; en cas d’égalité, par celui dont la mantisse finit par 0 (« au pair »).
Troncature
Couper les chiffres en trop au lieu d’arrondir. L’erreur est alors toujours du même côté, et s’accumule.
Écart entre flottants voisins
La distance d’un flottant au suivant (en anglais ulp, « unit in the last place »). En double, 2⁻⁵² à partir de 1, et 2 à partir de 2⁵³.
Représentable
Un nombre est représentable dans un format s’il y est stocké exactement. 0,5 l’est en double, 0,1 ne l’est pas.
Virgule fixe
Un nombre à virgule stocké comme un entier N avec un nombre fixe k de chiffres binaires après la virgule : il vaut N/2ᵏ. C’était le cas de l’horloge du Patriot.
Tolérance
L’écart en dessous duquel on considère deux flottants comme égaux : abs(x − y) < tolérance.
Pour les parents et les enseignantsouvrir

Objectifs

  • Comprendre qu’un entier de taille fixe a 2ⁿ valeurs, et prévoir un débordement (8, 16, 32 bits, signé ou non).
  • Coder un entier négatif en complément à deux et justifier la règle « inverser puis ajouter 1 ».
  • Savoir quels nombres ont une écriture binaire finie (p/q avec q puissance de 2), et en déduire que 0,1 est arrondi.
  • Lire un double : signe, exposant, mantisse, formule (−1)ˢ × 1,m × 2^(e − 1023) ; relier 53 bits de précision aux 15 à 17 chiffres significatifs et à 2⁵³.
  • Expliquer 0,1 + 0,2 ≠ 0,3 par des données arrondies et un calcul correctement arrondi ; comparer des flottants avec une tolérance ; compter avec des entiers.
  • Refaire un calcul d’ordre de grandeur sur un cas réel (l’horloge du Patriot) et sur des compteurs qui débordent.

Notions

Bit, octet, base 2, entier non signé et signé, complément à deux, débordement, type int et float de Python, virgule flottante, norme IEEE 754 (binary64 et binary32), signe, exposant biaisé, mantisse, précision, écart entre flottants voisins, arrondi au plus proche (au pair), troncature, virgule fixe, erreur relative, accumulation d’erreurs, tolérance.

Déroulé (20 à 30 minutes)

Palier 1 : faire déborder un registre, prédire puis tester 0,1 + 0,2 == 0,3, lire la valeur vraiment stockée. Palier 2 : les fractions binaires, le format double et sa précision, l’arrondi, le complément à deux. Palier 3 : l’horloge du Patriot, des compteurs qui débordent (Arduino, Boeing 787, temps Unix), les comparaisons de flottants.

Les pièges visés

Confondre 2¹⁵ et 2¹⁶ (ou 2³¹ et 2³²) ; oublier le bit de signe ; croire qu’un registre plein reste bloqué au maximum ; oublier le « + 1 » du complément à deux ou le confondre avec le codage signe et valeur absolue ; croire que l’addition de la machine est fausse, ou que seul l’affichage arrondit ; compter 52 bits de précision au lieu de 53 ; confondre les limites des entiers de 32 ou 64 bits avec celle des doubles ; confondre arrondi et troncature ; se tromper d’un facteur 10 entre secondes et dixièmes ; tester l’égalité de deux flottants. Les indices des missions repèrent ces erreurs.

Liens avec les programmes

  • Mathématiques, seconde, programme de 2026 (arrêté du 26 février 2026, Bulletin officiel n° 14 du 2 avril 2026, p. 336-337), partie « Algorithmique et programmation », en Python : « Variables informatiques de type entier, booléen, flottant, chaine de caractères » ; « Choisir ou déterminer le type d’une variable (entier, flottant ou chaine de caractères) ». Texte relu dans le BO.
  • SNT, seconde (arrêté du 17 janvier 2019, Bulletin officiel spécial n° 1 du 22 janvier 2019) : programmation en Python 3 ; thème « La photographie numérique » : « La profondeur de couleur est en général de 8 bits par pixel et par couleur » (des entiers de 0 à 255). Texte relu.
  • NSI, première (arrêté du 17 janvier 2019, même BO) : « Représentation binaire d’un entier relatif » : « Utiliser le complément à 2 », « décrire les tailles courantes des entiers (8, 16, 32 ou 64 bits) », « évoquer la représentation des entiers de taille arbitraire de Python » ; « Représentation approximative des nombres réels : notion de nombre flottant » : « 0.2 + 0.1 n’est pas égal à 0.3. Il faut éviter de tester l’égalité de deux flottants. Aucune connaissance précise de la norme IEEE-754 n’est exigible. » Texte relu.
  • Un cran au-dessus : le détail du format double (exposant biaisé, 53 bits, arrondi au pair, écart entre flottants voisins) dépasse la NSI, qui n’exige pas la norme ; il est au programme d’informatique commune des classes préparatoires scientifiques (arrêté du 5 janvier 2021, 1re année, second semestre : complément à deux, flottants), d’après le dossier de programmes du site, texte non relu ici. Les badges le signalent : ce n’est pas une limite.

À faire en vrai

Dans une console Python : tapez 0.1 + 0.2, puis 0.1 + 0.2 == 0.3, puis from decimal import Decimal et Decimal(0.1) pour voir la valeur stockée. Écrivez une boucle while x != 1.0: x = x + 0.1 en ajoutant un compteur de sécurité, et observez qu’elle ne s’arrête pas d’elle-même. Comparez avec 2**100 (int, exact) et 2.0**100 (float, arrondi).

Ce que le module simplifie

Le banc calcule avec les vrais types de JavaScript, qui sont exactement ceux de la norme IEEE 754 et des processeurs : les résultats de la machine ne sont pas simulés. La calculette exacte travaille en décimal exact (entiers de taille arbitraire). Le registre entier montre 8, 16 et 32 bits ; 64 bits suivent les mêmes règles. Les tout petits nombres (dénormalisés), les infinis et « NaN » sont à peine évoqués. Pour le Patriot, le banc reproduit l’erreur de conversion de 0,1 décrite par Skeel (1992) et retrouve les chiffres du rapport GAO ; il ne simule ni le radar ni la fenêtre de poursuite, dont le rapport donne seulement les déplacements.

Sources

Tous les nombres du module sont calculés par son modèle (modele.js), vérifié dans node, avec les types de JavaScript ; les affichages de Python ont été comparés à python3.

  1. IEEE (2019). IEEE Standard for Floating-Point Arithmetic, IEEE Std 754-2019. doi:10.1109/IEEESTD.2019.8766229.
  2. Ecma International (2025). ECMAScript 2025 Language Specification (ECMA-262, 16e édition), § 6.1.6.1 « The Number Type » : les valeurs binary64 de la norme IEEE 754-2019.
  3. Python Software Foundation. The Python Tutorial, chapitre « Floating-Point Arithmetic: Issues and Limitations » : « almost all platforms map Python floats to IEEE 754 binary64 “double precision” values ».
  4. Goldberg D. (1991). What every computer scientist should know about floating-point arithmetic. ACM Computing Surveys 23(1) : 5–48. doi:10.1145/103162.103163.
  5. United States General Accounting Office (1992). Patriot Missile Defense: Software Problem Led to System Failure at Dhahran, Saudi Arabia, GAO/IMTEC-92-26, 4 février 1992 (dont l’annexe II). Lu dans la copie du PDF conservée par l’Internet Archive, le site du GAO refusant le téléchargement direct.
  6. Skeel R. (1992). Roundoff error and the Patriot missile. SIAM News 25(4) : 11, juillet 1992.
  7. Lions J.-L. et al. (1996). ARIANE 5 Flight 501 Failure, rapport de la commission d’enquête, Paris, 19 juillet 1996.
  8. Federal Aviation Administration (2015). Airworthiness Directive 2015-09-07, Boeing 787 (Federal Register 80 FR 24789, 1er mai 2015).
  9. Arduino. Language Reference, millis() : « This number will overflow (go back to zero), after approximately 50 days » ; type renvoyé unsigned long.
  10. Ministère de l’Éducation nationale. Programme de mathématiques de seconde, arrêté du 26 février 2026 (Bulletin officiel n° 14 du 2 avril 2026) ; programmes de SNT (seconde) et de NSI (première), arrêtés du 17 janvier 2019 (Bulletin officiel spécial n° 1 du 22 janvier 2019).