Beaucoup de développeurs ont entendu parler du bug d'Ariane 5, l'une des défaillances logicielles les plus tristement célèbres de l'histoire de l'ingénierie aérospatiale. Il s'est produit le 4 juin 1996, lors du vol inaugural de la fusée Ariane 5, qui devait placer en orbite quatre satellites Cluster destinés à étudier la magnétosphère terrestre.
Le bug lui-même était un problème logiciel lié au système de guidage de la fusée. Le composant chargé de convertir une valeur flottante 64 bits en entier signé 16 bits pour le système de guidage a provoqué une exception non gérée due à un dépassement de capacité. En définitive, une seule ligne de code a contribué à une défaillance qui a coûté des millions de dollars, faisant du lancement d'Ariane 5 l'une des pannes logicielles les plus coûteuses de l'histoire.
Mais connaissez-vous une ligne de code qui a pu valoir des millions de dollars ?
C'est cette fameuse ligne de C++ : i = 0x5f3759df - (i >> 1);
Cette ligne est apparue pour la première fois dans le code de Quake pour optimiser le calcul de la racine carrée inverse.
float Q_rsqrt(float number)
{
long i;
float x2, y;
const float threehalfs = 1.5F;
x2 = number * 0.5F;
y = number;
i = * ( long * ) &y; // evil floating point bit level hacking
i = 0x5f3759df - ( i >> 1 ); // what the fuck?
y = * ( float * ) &i;
y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration
// y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed
return y;
}
Pourquoi l'optimisation de la racine carrée inverse est-elle si importante ?
Les racines carrées inverses sont largement utilisées dans les graphismes des jeux vidéo, en particulier dans les moteurs de jeu 3D. De nombreux aspects de la programmation de jeux, comme la recherche de chemin, l'éclairage et les reflets, reposent massivement sur la normalisation de vecteurs, qui requiert une opération de racine carrée inverse. Or effectuer des racines carrées inverses, qui impliquent une division en virgule flottante, peut s'avérer coûteux en calcul pour les processeurs. Dans des jeux rapides et visuellement immersifs comme Quake III Arena, ces calculs se produisent des millions de fois par seconde. Par conséquent, même une légère amélioration des performances de ces calculs pouvait accélérer sensiblement le traitement graphique et améliorer la fréquence d'images du jeu. Pour éviter le coût de calcul de la fonction de racine carrée inverse, les programmeurs du moteur id Tech 3 ont conçu une approximation exceptionnellement rapide et précise.

Sans cette optimisation ingénieuse, Quake n'aurait peut-être pas atteint le statut de référence dans l'industrie du jeu vidéo.
Qui était l'esprit brillant derrière cette solution innovante ?
Rys Sommerfeldt, directeur senior de l'équipe européenne d'ingénierie des jeux chez AMD RTG, a lancé une enquête sur les origines de la fonction en 2004. L'enquête a finalement désigné Greg Walsh comme son auteur. Greg Walsh est un monument du monde de l'informatique. Il a contribué à l'élaboration du premier traitement de texte WYSIWYG (« what you see is what you get ») chez Xerox PARC et a participé à la fondation d'Ardent Computer. Greg a travaillé en étroite collaboration avec Cleve Moler, l'auteur de Matlab, lors de son passage chez Ardent, et c'est Cleve que Greg désignait comme la source d'inspiration de la fonction de racine carrée inverse rapide.
Morale de l'histoire
Pour certains problèmes, il est payant de prendre son temps et de sortir des sentiers battus. Sortir des sentiers battus, c'est rompre avec les modes de pensée conventionnels ou traditionnels et explorer des solutions non conventionnelles, innovantes et créatives. Lorsqu'un problème est difficile à résoudre, prenez le temps de l'examiner sous différents angles. Vous trouverez peut-être une solution qui dépasse vos attentes.
