Pourquoi la précision est un enjeu ?

Contrairement à ce qu'on croit les ordinateurs ne sont pas des bons calculateurs. Pour votre processeur les lois naturelles des mathématiques ne fonctionnent plus et les erreurs s'accumulent.

Les ordinateurs utilisent un format binaire de représentation des nombres à virgules qui est défini par le standard IEEE754 et qui permet de codifier les règles de l’arithmétique flottante.

Ce format, à la fois souple et compact, permet de représenter aussi bien de très grands nombres (de l’ordre de 1016 pour le format 32 bits) comme de très petits nombres (de l’ordre de 10-16 dans le format 32 bits). Néanmoins, cette souplesse à un coût, qui s’exprime par des erreurs d’arrondis. Autrement dit, certains nombres réels différents seront arrondis vers la même représentation binaire dans les nombres flottants. D’autre part, les nombres réels n’auront pas forcément d’équivalent « naturel » dans les nombres flottants. C’est le cas de la valeur 0,1 qui, contrairement à ce que l’on pourrait penser, est approximée en arithmétique flottante par la valeur 0.100000024 (en format 32 bits).

L’arithmétique flottante pose des problèmes d’arrondis des valeurs mais aussi des calculs.

Ces erreurs d'arrondies sur la représentation des nombres ensuite s'accumulent tout au long de l'exécution des calculs et amène un dérive entre le résultat mathématique attendu et le résultat informatique calculé. Dans certains cas cette dérive entraîne des comportements incorrects du programme et peut conduire à des catastrophes industrielles. C'est dans ce contexte que le bug du missile Patriot en 1991 a eu lieu.

Le cas d'école du missile Patriot (source)

Illustration d'un missile Patriot américainLe 25 février 1991, durant la première guerre du Golfe, une batterie de missile basée à Dharan, en Arabie Saoudite, échoua à suivre et intercepter un missile Scud irakien en approche. Le missile Scude frappa un barraquement américain, tuant 28 sudats et blessa environ 100 autres personnes. Le rapport du commandement général, GAO/OMTEC-92-26, détailla dans un rapport concernant l'incident de ce missile défense de la manière suivante : un problème logiciel a conduit à un défaillance du système at Dharan, Arabie Saoudite. Il est apparu que la cause était un mauvais calcul du temps écoulé depuis le démarrage du missile dû à des erreurs d'arrondies numériques.

Plus spécifiquement, le temps mesuré était en dixième de secondes par l'horloge interne, était ensuite multiplié par la valeur 1/10 pour avoir le résultat en secondes. Ce calcul était réalisé sur un registre 24 bits en arithmétique fixe. La valeur 1/10, qui n'a pas de développement binaire fini, était tronquée à la 24ième décimale après la virgule. Cette petite erreur d'arrondi, une fois multipliée par un plus grand nombre lors de la conversion en seconde, conduit à un erreur d'arrondi plus significative. En effet, la batterie de missile Patriot était allumé depuis 100 heures, et un calcul rapide montre que l'erreur d'arrondi amplifiée était de l'ordre de 0.34 secondes.

En effet le nombre 1/10 est égale à 1/24 +1/25 +1/28 +1/29 +1/212 +1/213 +... En d'autres mot, l'expansion en binaire de 1/10 est 0.0001100110011001100110011001100... Comme le registre dans lequel le missile Patriot stocke la valeur n'est que de 24 bits la valeur stocké est 0.00011001100110011001100. Cette valeur introduit donc une erreur en binaire d'une valeur de 0.0000000000000000000000011001100... soit environ 0.000000095 en décimale. Si l'on multiplie par nombre de dixième de seconde écoulé en 100 heure on obtient 0.000000095×100×60×60×10=0.34

Un missile Scud se déplace à environ 1 676 mètres par second, il traverse donc plus d'un demi kilomètre en 0,34s. Cette distance est suffisante pour le missile Scud soit hors de la "fenêtre d'interception" que le missile Patriot poursuivait. Ironiquement, le fait que cette mauvaise manière de calculer ai été corrigée à certain endroit du code, mais pas partout, a contribué au problème, car cela a empêché les erreurs d'arrondies de s'annuler mutuellement.