4.1.2.1 : Différence de carrés

La différence de carrés $a^2-b^2$ semble tout à fait inoffensive, et si les unités du programme ont été bien choisies, on esquivera sans peine le risque de dépassement (il suffit pourtant que $a$ ou $b$ soit de l'ordre de $10^{19}$ en simple précision au lieu de $10^{154}$ en double). Le vrai problème réside, lorsque les deux termes sont voisins, dans la capacité de ce calcul à exhiber des «catastrophic cancellation» [192]What Every Computer Scientist Should Know About Floating-point Arithmetic, 1991, Goldberg, David, également connues comme «loss of significance» que le français «», «» ou «» rend mal, disons plutôt «». Ces compensations apparaissent lors d'une opération (généralement une soustraction) sur des opérandes qui ont subi une troncation, par exemple, le produit d'autres opérandes (ici, des carrés). Le résultat numérique n'a plus qu'une précision ridicule au regard de celle avec laquelle les calculs ont été effectués. Parfois, même son signe est faux. A contrario la même différence sur des opérandes exacts donne lieu à une compensation bénigne.

Le recours à la double précision est souvent un moyen d'estomper cet effet.

La meilleure solution est d'utiliser la formulation factorisée du calcul $a^2-b^2 = (a-b)\cdot(a+b)$ . La soustraction qui y subsiste peut être à l'origine de «benign cancellation» tout au plus. Dans ce cas la factorisation est à la fois un gain de performances (une seule multiplication au lieu de deux) et de précision\footnotetechniquement, lorsque $a$ et $b$ sont très différents, la version non-factorisée souffre d'une erreur d'arrondi en moins, donc est plus précise, mais sans affecter le sens du résultat. Pourquoi donc s'en priver ? Dans ce cas simple, la factorisation est triviale, mais pour l'aire d'un triangle, ou le volume d'un tétraèdre, le travail requis est ardu. De manière plus générale, dans les expressions déterminantales communes en géométrie, il n'y a aucune garantie d'existence de ces factorisations.