Importance du codage des réels☘
Les deux tragédies ci-dessous permettent de se rendre compte de l'importance du codage des nombres réels en machine.
Ces 2 anecdotes sont issues de cette page : http://ta.twi.tudelft.nl/users/vuik/wi211/disasters.html.
Missile Patriot Américain☘
Le 25 février 1991, pendant la guerre du Golfe, une batterie de missiles Patriot américains à Dharan, en Arabie Saoudite, n'a pas réussi à intercepter un missile Scud irakien en approche. Le Scud a frappé une caserne de l'armée américaine et a tué 28 soldats.
Un rapport du bureau de la comptabilité générale, GAO/IMTEC-92-26, intitulé « Patriot Missile Defense : Software Problem Led to System Failure at Dhahran, Saudi Arabia » (Un problème de logiciel a conduit à une défaillance du système à Dhahran, en Arabie Saoudite) a fait état de la cause de cette défaillance.
Il s'avère que la cause était un calcul inexact du temps écoulé depuis le démarrage en raison d'erreurs d'arithmétique informatique. Plus précisément, le temps en dixièmes de seconde mesuré par l'horloge interne du système a été multiplié par 10 pour produire le temps en secondes. Ce calcul a été effectué à l'aide d'un registre de 24 bits. En particulier, la valeur \frac{1}{10}, qui a une expansion binaire non terminale, a été coupée à 24 bits.
La « petite » erreur de découpage, lorsqu'elle est multipliée par le grand nombre donnant le temps en dixièmes de seconde, conduit à une erreur significative.
En effet, la batterie du Patriot était en service depuis environ 100 heures, et un calcul facile montre que l'erreur de temps résultante due à l'erreur de hachage amplifiée était d'environ 0,34 seconde.
Explication
La représentation binaire de \frac{1}{10} est 0,00011001100110011001100110011001100....
Mais, le registre 24 bits du Patriot a stocké à la place 0.000110011001100110011001100
introduisant une erreur de (0.000000000000000000011001100)_2 soit environ
0.000000095 en décimal. En multipliant par le nombre de dixièmes de seconde
en 100 heures, on obtient 0,000000095 × 100 × 3600 × 10 = 0,34 s
Un Scud se déplace à environ 1 676 mètres par seconde, et parcourt donc plus d'un demi-kilomètre en 0,34 s. Cette distance est suffisante pour que le Scud entrant se trouve en dehors de la « porte du champ de tir » que le Patriot a suivie.
Explosion d'Ariane 5☘
Le 4 juin 1996, une fusée Ariane 5 sans équipage lancée par l'Agence spatiale européenne a explosé quarante secondes seulement après le décollage. La fusée effectuait son premier voyage, après une décennie de développement qui a coûté 7 milliards de dollars. La fusée détruite et sa cargaison ont été évaluées à 500 millions de dollars.
Une commission d'enquête a enquêté sur les causes de l'explosion et a publié un rapport en deux semaines. Il s'est avéré que la cause de la panne était une erreur logicielle dans le système de référence inertiel. Plus précisément, un nombre à virgule flottante de 64 bits relatif à la vitesse horizontale de la fusée par rapport à la plate-forme a été converti en un nombre entier signé de 16 bits.
Le nombre était supérieur à 32 768, le plus grand nombre entier stockable dans un entier signé de 16 bits, et donc la conversion a échoué.