Les enjeux du codage des nombres

Signaler

L’utilisation d’un nombre limité de chiffres binaires, que ce soit pour les nombres à virgules ou les nombres entiers est la source de bugs conséquents.

I. Troncature et accumulation d’arrondis

1) Erreur d’arrondi

À noter

Les erreurs d’arrondi sont très fréquentes, mais ne conduisent pas toujours à l’amplification des erreurs… sauf si elles sont toujours réalisées dans le même sens (troncature).

Une erreur d’arrondi est la différence entre la valeur approchée calculée d’un nombre et sa valeur mathématique exacte. Des erreurs d’arrondi naissent lorsque des nombres exacts sont représentés dans un système incapable de les exprimer exactement, par exemple, si un certain nombre de décimales ne sont pas prises en considération, comme cela se produit lors d’une troncature.

Exemple : On veut calculer ∑k=1104110. Un calcul en Python avec une boucle for donne 1000.0000000001588, alors que la valeur exacte est 103.

2) À la bourse de Vancouver

L’indice boursier est un nombre qui mesure la « santé » d’un marché boursier. Il est calculé plusieurs fois par jour et sa valeur de clôture à la fin de journée indique si la bourse est en hausse ou en baisse.

En 1982, la bourse de Vancouver a créé son propre indice, initialisé à 1 000, et recalculé à chaque modification du prix de vente d’une action, presque 3 000 fois par jour, à partir de l’indice précédent.

Après chaque calcul, seules les trois premières décimales du résultat étaient conservées et réinjectées dans le calcul suivant. Cet arrondi par défaut systématique a conduit, en deux ans, à un indice avoisinant 500 alors qu’un calcul exact, réalisé plus tard, a montré que l’indice valait en réalité un peu plus de 1 000.

II. Représentation approchée des nombres à virgule

1) Valeur effective en machine

La plupart des réels sont approchés sur un ordinateur. Ceux qui possèdent une infinité de décimales ne peuvent pas avoir de représentation exacte en machine. Le plus simple des calculs devient alors approché, avec des résultats parfois lourds de conséquences.

2) Antimissile Patriot

Lors du premier conflit États-Unis/Irak, en 1991, les américains disposaient d’antimissiles (Patriot) pour intercepter les missiles irakiens (Scud). Les Patriot disposaient d’une horloge interne émettant un signal toutes les 0,1 seconde. Le temps écoulé était obtenu en multipliant 0,1 par le nombre de signaux d’horloge reçus.

Or, la représentation en virgule fixe de 0,1 est inexacte : 0,1 dans le système décimal s’écrit 0,0001100110011001100110011… dans le système binaire. La valeur effective en machine est très légèrement inférieure.

3) Propagation de l’erreur

Cette petite erreur, multipliée par le nombre conséquent de signaux d’horloge reçus en 100 heures de fonctionnement conduit à un décalage d’horloge interne de 0,34 seconde. À la vitesse d’un missile, ce décalage correspond à un déplacement de plus de 550 m. Ainsi un Patriot est passé à plus de 500 m du Scud qu’il devait intercepter provoquant indirectement la mort de 28 personnes.

Certains nombres (comme ici 0,1) ne sont pas exacts en virgule fixe ni en virgule flottante. Cette erreur, même très faible, si elle est amplifiée (ici par la multiplication) peut avoir des conséquences désastreuses.

III. Dépassement de capacité

1) Overflow

On ne peut coder qu’un nombre fini d’entiers. Si on travaille avec une machine manipulant des mots codés sur un octet, on peut coder les nombres entiers allant de −27 à 27 − 1. Un simple calcul comme 53 + 100 par exemple donne un résultat (153) qui ne fait pas partir de cette liste !

On parle alors de dépassement de capacité, overflow en anglais.

2) Vol 501 d’Ariane V

Le 4 juin 1996, la fusée Ariane V a été détruite en vol 37 secondes après son lancement, suite à un problème dans la centrale inertielle. Déjà utilisé sur Ariane IV, le système a eu un comportement inattendu avec Ariane V. Initialement codée comme nombre flottant double précision (sur 64 bits), la valeur de l’accélération horizontale était convertie, durant le processus de contrôle de la fusée, en un nombre entier signé codé sur 16 bits.

La valeur de l’accélération étant trop grande, la conversion du nombre en entier a échoué, provoquant une réaction en chaîne dans le pilote automatique qui a abouti à l’autodestruction de la fusée.

Dans ce cas, c’est la représentation des nombres entiers qui est en cause.