Première · Représentation des données

Nombres flottants et erreurs d’arrondi

Pourquoi 0.1 + 0.2 peut-il différer de 0.3 dans un programme ? La machine ne commet pas une faute d’addition : elle calcule avec des représentations finies de nombres dont certaines écritures binaires sont infinies. Il faut comprendre où apparaît l’approximation.

SofienAvec SofienIngénieur et enseignant en informatique
Dans ce chapitre

Un cap pour ce chapitre

Ce que vous saurez faire

  • Décomposer une fraction simple en puissances négatives de deux
  • Expliquer une erreur d’arrondi sans apprendre toute la norme IEEE
  • Choisir une comparaison adaptée à un résultat approché
Les bases utiles pour commencer

Après la virgule, les poids continuent

En décimal, les chiffres après la virgule portent les poids un dixième, un centième, etc. En binaire, les poids deviennent 1/2, 1/4, 1/8, 1/16, et ainsi de suite. Le nombre 0,101 en base deux vaut donc 1/2 + 1/8 = 0,625 en décimal. Un nombre comme 0,25 possède une écriture binaire courte : 0,01. La présence d’une virgule ne signifie donc pas automatiquement qu’une approximation est nécessaire. Tout dépend de la possibilité de représenter la valeur avec un nombre fini de positions dans la base choisie.

Chaque position ajoutée après la virgule divise le poids précédent par deux. Le quatrième bit pèse un seizième et le cinquième un trente-deuxième. Ajouter un zéro final ne change pas la valeur ; ajouter un un ajoute exactement le poids de cette nouvelle position.

Une écriture finie dans une base peut être infinie dans une autre

Le nombre un tiers possède une écriture décimale périodique. De façon analogue, un dixième ne possède pas d’écriture binaire finie. Pour produire ses bits fractionnaires, on multiplie la partie fractionnaire par deux, on retient la partie entière obtenue, puis on recommence avec le reste. Pour 0,1, ce processus fait apparaître une répétition. Une mémoire finie ne peut pas conserver tous les bits : elle retient une représentation proche selon une règle d’arrondi. Le nombre mémorisé et le nombre mathématique visé ne sont alors pas strictement identiques.

Pour une fraction réduite, une écriture binaire finie est possible lorsque le dénominateur est une puissance de deux. Trois huitièmes convient ; un dixième conserve un facteur cinq au dénominateur et ne convient pas. Ce critère explique les exemples sans imposer de mémoriser leurs suites infinies.

Un flottant conserve une précision limitée

L’idée d’un flottant ressemble à une notation scientifique : une partie significative est combinée à une échelle. Cela permet de représenter des valeurs très petites ou très grandes, avec un nombre limité de chiffres significatifs. Le détail complet de la norme IEEE 754 n’est pas exigé en Première. Il faut surtout comprendre que les valeurs disponibles sont espacées et que l’écart dépend de leur grandeur. Ajouter une toute petite quantité à un très grand nombre peut ainsi ne pas modifier sa représentation, si cette quantité est plus petite que la précision disponible.

L’atelier utilise une grille fixe de valeurs fractionnaires : avec quatre bits, les valeurs disponibles sont des multiples de un seizième. Ce modèle aide à comprendre la perte de précision, mais il ne simule pas la variation d’échelle d’un véritable flottant.

Comparer selon la précision utile

Pour un résultat approché, tester une égalité stricte peut rejeter deux valeurs suffisamment proches pour le problème. On peut examiner abs(a - b) < tolerance, en choisissant une tolérance justifiée par l’application. Une tolérance relative peut aussi être utile lorsque les ordres de grandeur varient beaucoup ; math.isclose propose ces paramètres. Il ne faut pas remplacer toute comparaison par une marge arbitraire : les entiers exacts se comparent normalement. Pour l’argent, compter des centimes entiers évite certaines difficultés lorsque les montants et opérations s’y prêtent.

a = 0.1 + 0.2
b = 0.3
print(a == b)
print(abs(a - b) < 1e-12)

La tolérance possède une unité et un sens. Pour une longueur en mètres, une marge de 0,001 représente un millimètre. Si les données sont exprimées en kilomètres, garder le même nombre changerait fortement la précision. Il faut convertir la marge avec les données.

Tronquer et arrondir répondent à deux règles

Avec quatre bits fractionnaires, un dixième se trouve entre un seizième, soit 0,0625, et deux seizièmes, soit 0,125. La troncature garde la valeur inférieure 0,0625. L’arrondi au plus proche choisirait 0,125, dont l’écart 0,025 est plus petit que 0,0375. Les deux méthodes utilisent la même largeur, mais ne produisent pas la même approximation.

Pour une fraction positive, l’erreur d’une troncature après n bits est strictement inférieure au poids 2 ** (-n). Cette borne provient des bits supprimés. Augmenter n resserre la borne, sans rendre nécessairement exacte une fraction dont l’écriture binaire est infinie.

Séparer affichage, stockage et décision

Un affichage limité à deux décimales peut montrer 0,30 alors que la valeur stockée conserve une approximation plus détaillée. Modifier l’affichage n’améliore pas le calcul effectué. La décision doit utiliser un critère adapté : comparaison exacte pour un nombre d’objets, écart toléré pour une mesure approchée.

Pour additionner 125, 250 et 75 centimes, les entiers donnent exactement 450 centimes. Si l’on applique ensuite un pourcentage, il faut encore définir comment arrondir au centime. Choisir une unité entière résout certaines erreurs de représentation ; cela ne décide pas les règles de calcul du problème.

À vous de faire varier les choses

Combien de bits pour approcher une fraction ?

Choisissez une fraction et le nombre de positions conservées. Comparez la troncature binaire au nombre visé ; ce modèle illustre la précision, pas le format IEEE complet.

Lire le résultat de l’expérience initiale

0,0001₂ = 0.0625

Il reste une fraction non nulle. La troncature conserve une valeur inférieure au nombre visé.

PositionBitPoidsSomme partielle
101/20
201/40
301/80
411/160.0625

Augmenter la précision réduit l’erreur, mais une écriture infinie ne devient pas finie simplement parce que l’on conserve davantage de bits.

De la compréhension à l’autonomie

À vous de résoudre

Cherchez d’abord par vous-même. Vérifiez les résultats demandés, utilisez les indices si nécessaire, puis comparez votre méthode à la correction.

Exercice 1 · S’entraîner#

Une fraction exacte

Convertissez 0,011₂ en décimal. Pourquoi cette valeur peut-elle être représentée exactement avec trois positions binaires après la virgule ?

Indice 1

Les trois poids sont 1/2, 1/4 et 1/8.

Indice 2

Seuls les deux derniers bits contribuent.

Comprendre la correction

La valeur est 1/4 + 1/8 = 3/8 = 0,375. Son écriture binaire s’arrête après trois positions : aucun bit supplémentaire n’est nécessaire. Elle peut donc être représentée exactement dans un format disposant de ces positions et d’un domaine suffisant, contrairement à une fraction comme un dixième.

Exercice 2 · S’entraîner#

Tronquer une représentation

On approxime un tiers en conservant seulement les quatre premiers bits après la virgule : 0,0101₂. Donnez la valeur obtenue et le sens de l’erreur.

Indice 1

Additionnez les poids 1/4 et 1/16.

Indice 2

La troncature supprime des contributions positives restantes.

Comprendre la correction

0,0101₂ vaut 1/4 + 1/16 = 5/16 = 0,3125. Cette approximation est inférieure à 1/3, proche de 0,3333. L’erreur exacte vaut 1/3 - 5/16 = 1/48. Il s’agit ici d’une troncature pédagogique ; un format flottant peut employer une autre règle d’arrondi.

Exercice 3 · S’entraîner#

Une comparaison trop stricte

Un calcul de longueur renvoie 2.9999999999999996 alors que l’on attend mathématiquement 3. Proposez une comparaison avec une tolérance absolue de 10 puissance -10.

Indice 1

Calculez la valeur absolue de la différence.

Indice 2

Le test doit porter sur l’écart, pas arrondir arbitrairement l’affichage.

Comprendre la correction

On peut écrire abs(longueur - 3) < 1e-10. L’écart observé est très inférieur à cette tolérance, donc le test accepte le résultat. Cela ne prouve pas que tout calcul est correct : la tolérance doit correspondre à la précision requise et ne pas masquer une erreur algorithmique beaucoup plus grande.

Exercice 4 · S’entraîner#

Les centimes comme entiers

Pour additionner trois achats de 1,20 €, 2,35 € et 0,45 €, proposez une représentation entière et donnez le résultat.

Indice 1

Choisissez le centime comme unité de stockage.

Indice 2

Convertissez chaque montant avant l’addition.

Comprendre la correction

On stocke 120, 235 et 45 centimes. La somme entière vaut 400 centimes, soit 4,00 €. Les additions portent alors sur des entiers exacts. Cette méthode est adaptée à ces montants, mais des calculs de pourcentage peuvent encore nécessiter une règle explicite pour arrondir au centime.

Exercice 5 · Approfondir et relier#

Deux approximations sur la même grille

Avec quatre bits fractionnaires, les voisins de 0,1 sont 0,0625 et 0,125. Calculez leurs écarts absolus. Donnez la troncature et l’arrondi au plus proche, puis expliquez pourquoi leurs erreurs n’ont pas le même signe.

Indice 1

La troncature retient le voisin inférieur.

Indice 2

Comparez les distances au nombre visé.

Comprendre la correction

Les écarts absolus sont 0,0375 et 0,025. La troncature donne 0,0625, en dessous de la cible. L’arrondi au plus proche donne 0,125, au-dessus. La largeur seule ne définit donc pas une approximation : la règle d’arrondi doit être annoncée.

Exercice 6 · Approfondir et relier#

Une fraction exacte au bon endroit

Écrivez sept huitièmes en binaire. Donnez sa troncature sur deux bits puis sur trois bits fractionnaires et calculez l’erreur dans les deux cas. Expliquez pourquoi un quatrième bit est inutile ici.

Indice 1

Sept huitièmes est la somme de un demi, un quart et un huitième.

Indice 2

Le troisième bit contient la dernière contribution non nulle.

Comprendre la correction

La représentation est 0,111 en binaire. Sur deux bits, on conserve 0,11, soit 0,75, et l’erreur vaut 0,125. Sur trois bits, on obtient exactement 0,875 et une erreur nulle. Les bits suivants sont tous nuls, contrairement au développement de un dixième.

Exercice 7 · Approfondir et relier#

Une tolérance qui doit suivre l’unité

Une longueur attendue de 2 mètres est acceptée si l’écart est strictement inférieur à 0,001 mètre. Testez 2,0006 puis 2,002 mètres. Convertissez ensuite la cible et la tolérance en millimètres. Distinguez ce test d’un arrondi d’affichage.

Indice 1

Un mètre vaut mille millimètres.

Indice 2

La marge doit être multipliée par le même facteur que la mesure.

Comprendre la correction

Les écarts valent 0,0006 et 0,002 mètre : la première mesure est acceptée, la seconde refusée. En millimètres, la cible vaut 2000 et la tolérance un. Arrondir l’affichage pourrait masquer un écart, mais ne remplace pas la comparaison de la valeur stockée à la cible.

Les erreurs qui méritent un détour

Croire que tous les décimaux sont approchés
Des fractions comme 1/2, 1/4 et 3/8 possèdent une écriture binaire finie.
Confondre affichage arrondi et valeur mémorisée
Afficher moins de chiffres ne modifie pas nécessairement la valeur sur laquelle le programme calcule.

La fiche à garder

L’essentiel à retenir

  • Une représentation finie ne couvre pas tous les nombres réels.
  • La base explique pourquoi 0,1 pose une difficulté particulière.
  • Une tolérance se choisit selon le problème.

Cette notion au bac

Retrouvez ces idées dans un sujet complet, avec des indices, une correction expliquée et des ateliers.

Le prochain pas

Retrouver le catalogue de Première

Ce chapitre s’appuie sur le programme officiel de Première (PDF, nouvel onglet). Les explications et exercices sont proposés pour l’apprentissage.