La soustraction de nombres proches en arithmétique à virgule flottante ne provoque pas toujours une annulation catastrophique, ni même une erreur — d'après le lemme de Sterbenz, si les nombres sont suffisamment proches, la différence en virgule flottante est exacte. Mais l’annulation peut amplifier les erreurs dans les entrées résultant de l’arrondi d’autres calculs arithmétiques à virgule flottante.
Etant donnés deux nombres
et
, la tentative naïve de calculer la fonction mathématique
par l'arithmétique à virgule flottante
est sujette à une annulation catastrophique lorsque
et
sont proches en amplitude, car la soustraction peut exposer les erreurs d'arrondi dans la mise au carré. La factorisation alternative
, évaluée par l'arithmétique à virgule flottante
, évite une annulation catastrophique car elle évite d'introduire une erreur d'arrondi conduisant à la soustraction[2].
Par exemple, si
et
, alors la vraie valeur de la différence
est
. En arithmétique IEEE 754 binary64, évaluer la factorisation alternative
donne exactement le résultat correct (sans arrondi), mais en évaluant l'expression naïve
, on a le nombre à virgule flottante
, dont moins de la moitié des chiffres sont corrects et les autres chiffres (soulignés) reflètent les termes manquants
, perdus en raison de l'arrondi lors du calcul des valeurs élevées au carré intermédiaires.
Lors du calcul de la fonction arc sinus complexe, on peut être tenté d'utiliser directement la formule logarithmique :
Cependant, supposons
pour
. Alors
et
; on note la différence entre ces deux valeurs
— qui est donc une très petite différence, presque nulle. Si
est évalué en arithmétique à virgule flottante donnant
avec une erreur quelconque
, où
désigne un arrondi à virgule flottante, puis avec le calcul de la différence
de deux nombres proches, tous deux très proches de
, peut amplifier l'erreur
en une entrée par un facteur de
— un facteur très important parce que
était presque nul. Par exemple, si
, la valeur exacte de
est d'environ
, mais l'utilisation de la formule logarithmique naïve dans l'arithmétique binary64 IEEE 754 peut donner
, avec seulement cinq chiffres sur seize corrects et le reste (souligné) tous incorrects.
Dans le cas où
pour
, en utilisant l'identité
évite l'annulation parce que
mais
, donc la soustraction est effectivement une addition avec le même signe qui ne s'annule pas.
Les constantes numériques dans les logiciels sont souvent écrites en décimal, comme dans le fragment C double x = 1.000000000000001; pour déclarer et initialiser une variable binaire64 IEEE 754 nommée x. Cependant,
n'est pas un nombre binaire64 à virgule flottante ; le plus proche, auquel x sera initialisé dans ce fragment, est
. Bien que la conversion de base de la virgule flottante décimale à la virgule flottante binaire n'entraîne qu'une petite erreur relative, une annulation catastrophique peut l'amplifier en une erreur beaucoup plus importante :
double x = 1.000000000000001; // arrondi à 1 + 5*2^{-52}
double y = 1.000000000000002; // arrondi à 1 + 9*2^{-52}
double z = y - x; // la difference vaut exactement 4*2^{-52}
La différence
est
. Les erreurs relatives de x de
et de y de
sont tous les deux ci-dessous
, et la soustraction à virgule flottante y - x est calculée exactement par le lemme de Sterbenz.
Mais même si les entrées sont de bonnes approximations, et même si la soustraction est calculée exactement, la différence des approximations
a une erreur relative de plus de
de la différence
des valeurs originales écrites en décimal : une annulation catastrophique a amplifié une petite erreur dans la conversion de base en une grande erreur dans la sortie.
L'annulation est parfois utile et souhaitable dans les algorithmes numériques. Par exemple, les algorithmes 2Sum et Fast2Sum s'appuient tous deux sur une telle annulation après une erreur d'arrondi afin de calculer exactement quelle était l'erreur dans une opération d'addition à virgule flottante en tant que nombre à virgule flottante lui-même.
La fonction
, si elle est évaluée naïvement pour des valeurs
, perdra la plupart des chiffres de
en arrondi
. Cependant, la fonction
elle-même est bien conditionné aux entrées proches de
. La réécrire comme
exploite l'annulation dans
pour éviter l'erreur de
évalué directement[2]. Cela fonctionne car l'annulation au numérateur
et l'annulation au dénominateur
se contrecarrer; la fonction
est suffisamment bien conditionnée près de zéro pour que
donne une bonne approximation de
, Et ainsi
donne une bonne approximation de
.