Objectifs du chapitre
À la fin de ce chapitre, vous serez capable de:
- distinguer les quatre sources d'erreur d'un calcul scientifique — le modèle, les données, la troncature de la méthode et l'arrondi de la machine — et dire laquelle domine dans une situation donnée;
- calculer une erreur absolue et une erreur relative, et compter les chiffres significatifs corrects d'une valeur approchée;
- décrire le format IEEE 754 en double précision, situer les nombres représentables sur un axe et justifier que leur espacement double à chaque exposant;
- utiliser le modèle d'arrondi , , pour majorer l'erreur d'une somme, d'un produit et d'une différence;
- reconnaître une annulation catastrophique, en évaluer le facteur d'amplification et réécrire l'expression fautive sous une forme stable;
- distinguer le de la , et estimer l'amplification d'une erreur de donnée à travers une fonction dérivable.
Pourquoi un cours d'analyse numérique commence par l'erreur
Un ordinateur ne calcule pas avec des nombres réels. Il calcule avec un ensemble fini de rationnels, à l'intérieur duquel les quatre opérations ne sont ni associatives ni distributives, et il le fait si vite qu'aucune inspection humaine du résultat n'est possible. Toute la discipline consiste à obtenir, malgré cela, des résultats dont on connaît la précision. Un résultat numérique sans estimation de son erreur n'est pas un résultat: c'est une opinion en seize chiffres.
Ce premier chapitre installe le vocabulaire et les deux ou trois inégalités dont les neuf suivants se serviront constamment. Il n'y a ici aucune méthode à proprement parler: il y a l'arithmétique dans laquelle toutes les méthodes du cours vont s'exécuter.
Les quatre sources d'erreur
Considérons une question concrète: quelle est la valeur de
Cette intégrale n'a pas de primitive élémentaire — c'est précisément pour des questions de ce genre que le chapitre 8 existe. Pour obtenir un nombre, il faut choisir une méthode, la discrétiser, puis l'exécuter. À chaque étape, un écart apparaît.
- L'erreur de modèle. Elle précède le calcul. Si l'intégrale (1.1) représente la probabilité qu'une grandeur physique tombe dans un intervalle, la loi normale sous-jacente est une idéalisation; aucune méthode numérique ne corrigera le choix du modèle. L'analyse numérique ne s'occupe pas de cette erreur, mais elle doit être nommée, car il est absurde de calculer à près un modèle valable à près.
- L'erreur sur les données. Les nombres qui entrent dans le calcul proviennent de mesures, de tables ou de calculs antérieurs; ils sont connus avec une incertitude. La question «de combien cette incertitude est-elle amplifiée par mon calcul?» est celle du conditionnement, traitée à la fin de ce chapitre et quantifiée au chapitre 4 pour les systèmes linéaires.
- L'erreur de troncature. Elle naît du remplacement d'un objet infini par un objet fini: une série par une somme partielle, une dérivée par un quotient de différences, une intégrale par une somme de trapèzes, une solution d'équation différentielle par une ligne brisée. C'est l'erreur propre à la méthode, et elle existerait même sur une machine arithmétiquement parfaite.
- L'erreur d'arrondi. Elle naît du remplacement de chaque réel par le nombre machine le plus proche, à chaque opération. C'est l'erreur propre à la machine, et elle existerait même avec une méthode mathématiquement exacte.
La troncature seule s'observe très bien sur le développement de l'exponentielle. En sommant , on obtient, calculé en précision étendue pour isoler la seule erreur de méthode:
| 2 | 2,500000000000000 |
L'erreur décroît, très vite, et elle vaut exactement le reste de la série: c'est de la troncature pure, et aucune machine n'y est pour rien. La suite du chapitre s'occupe de l'autre erreur — celle dont la machine, elle, est entièrement responsable.
Vous approchez par les trois premiers termes de sa série de Taylor, sur un ordinateur en double précision. L'écart entre votre résultat et la vraie valeur de est-il de la troncature, de l'arrondi, ou les deux?
Erreur absolue, erreur relative, chiffres significatifs
Tout le cours utilise l'erreur relative, et il vaut la peine de dire pourquoi. Une erreur absolue de mm est excellente sur la longueur d'un pont et catastrophique sur l'épaisseur d'une couche mince; elle ne veut rien dire tant qu'on n'a pas dit sur quoi elle porte. L'erreur relative, elle, voyage: elle se conserve par changement d'unité, elle se compare d'une grandeur à l'autre, et surtout c'est elle que l'arithmétique de la machine borne, comme nous allons le voir. C'est la raison pour laquelle le théorème central de ce chapitre, le modèle d'arrondi, est énoncé en relatif.
Cette définition par l'erreur relative est plus robuste que le comptage naïf des chiffres qui coïncident. Les nombres et n'ont aucun chiffre en commun dans leur écriture décimale, et pourtant leur erreur relative vaut : ils s'accordent à cinq chiffres significatifs près, ce qui est la seule lecture utile.
Un capteur renvoie m pour une longueur dont la valeur exacte est m. Calculez l'erreur relative, exprimée en pour cent.
Les nombres à virgule flottante
Le format IEEE 754 en double précision
Depuis 1985, presque toutes les machines représentent les réels selon la norme IEEE 754. Le format que ce cours utilise partout — celui du type float de Python, du double de C et de Java, du réel par défaut de Matlab et de NumPy — est le format binary64, dit double précision. Il occupe 64 bits, répartis ainsi:
| Champ | Bits | Rôle |
|---|---|---|
| signe | 1 | pour , pour |
| exposant | 11 | un entier biaisé, donnant entre et |
| mantisse | 52 | les bits après la virgule |
Trois conséquences immédiates, chiffrées:
- Amplitude. Le plus grand élément de vaut , le plus petit normalisé positif . Au-delà, on obtient ; en deçà, des nombres jusqu'à , puis zéro. La norme prévoit aussi () pour et .
L'arrondi et son modèle
Un réel quelconque n'appartient pratiquement jamais à . La machine lui substitue , l'élément de le plus proche (en cas d'égalité, celui dont le dernier bit de mantisse est pair — c'est l'arrondi au plus proche pair, mode par défaut de la norme, choisi parce qu'il ne biaise pas les sommes). Le théorème suivant est le seul fait dont nous aurons besoin sur , et il est remarquable: la borne ne dépend ni de , ni de son ordre de grandeur.
Démonstration. Supposons , le cas s'en déduisant par symétrie puisque et l'arrondi au plus proche sont symétriques par rapport à . Soit l'entier tel que .
Les éléments de contenus dans sont exactement les nombres
d'après (1.4): ils forment une subdivision régulière de l'intervalle, de pas
Comme , il existe un indice avec . L'arrondi au plus proche choisit celui des deux bornes qui est le plus proche de (l'ambiguïté du milieu étant tranchée par la parité, ce qui ne change pas la majoration), donc
Il ne reste qu'à diviser par . Puisque ,
ce qui est bien (1.6) avec . Le point décisif est l'étape (1.7) divisée par : le pas et la borne inférieure de contiennent le même facteur , qui disparaît. C'est exactement ce que la figure 1.1 montre — l'espacement double avec , donc l'espacement rapporté à ne change pas.
Faites varier le nombre de bits de mantisse: chaque bit ajouté double le nombre de valeurs disponibles dans chaque octave et divise par deux l'espacement. Déplacez ensuite le réel x et surveillez l'erreur relative: elle change à chaque pas, mais elle ne dépasse jamais la borne ε/2 — c'est exactement le contenu du modèle d'arrondi, et c'est la seule ligne du tableau qui ne bouge pas quand vous déplacez x.
Combien y a-t-il de nombres binary64 dans l'intervalle , comparé au nombre de ceux de ?
Ce que devient une opération
La norme IEEE 754 exige que les quatre opérations et la racine carrée soient correctement arrondies: le résultat machine est l'arrondi du résultat exact. Pour et ,
C'est une exigence forte et une excellente nouvelle: chaque opération prise isolément est aussi bonne que le format le permet. Tous les ennuis de ce chapitre viennent de leur enchaînement, et d'une seule d'entre elles.
Produit et quotient: les erreurs s'additionnent, doucement
Si et sont des valeurs approchées, alors
de sorte que l'erreur relative du produit vaut environ au premier ordre. En ajoutant l'arrondi de l'opération elle-même, on obtient une erreur relative bornée par à des termes du second ordre près. Le même calcul, avec , donne la même borne pour le quotient.
Autrement dit: la multiplication et la division ne détériorent presque rien. Les erreurs relatives s'ajoutent, une par opération, sans facteur d'amplification. C'est pourquoi une longue chaîne de produits reste fiable, et c'est aussi pourquoi, chaque fois qu'on peut remplacer une soustraction par un quotient, il faut le faire.
La somme et la différence: le facteur d'amplification
Pour une addition, la situation change de nature, parce que l'erreur relative du résultat se rapporte à et non plus à ni à .
Démonstration. Écrivons l'écart entre la somme approchée et la somme exacte:
L'inégalité triangulaire donne . En divisant par , on obtient (1.9).
Si et sont de même signe, et donc : l'erreur relative de la somme ne dépasse pas la plus grande des erreurs relatives des termes. Si et sont de signes opposés, posons avec et ; alors
La borne (1.9) est atteinte: en prenant et (ce qui est licite, puisque le modèle d'arrondi ne contraint que et ), l'écart vaut exactement .
Le cas d'école: 0.1 + 0.2
Le nombre n'est pas représentable en binaire: son écriture binaire, , est infinie périodique, exactement comme en décimal. La machine retient le plus proche double, dont la valeur exacte est
soit une erreur relative de , conforme au théorème 1.1 puisque . De même pour et pour . La somme des deux premiers arrondis, une fois arrondie à son tour, ne tombe pas sur l'arrondi de :
>>> 0.1 + 0.2
0.30000000000000004
>>> 0.1 + 0.2 == 0.3
False
>>> (0.1 + 0.2) - 0.3
5.551115123125783e-17
L'écart vaut exactement , c'est-à-dire un ulp de — l'erreur minimale possible. Rien n'a mal fonctionné. Les trois arrondis étaient chacun optimaux; c'est leur composition qui ne l'est pas, et aucune arithmétique de largeur finie n'y échappe.
Réparez la fonction presque_egal(a, b, tol) pour qu'elle compare deux flottants à une tolérance relative, tout en restant utilisable au voisinage de zéro. Le programme doit afficher False, puis True, puis False.
L'annulation catastrophique
Le théorème 1.2 dit tout, mais il faut le voir agir. Trois expressions classiques, chacune avec sa forme naïve et sa forme stable.
La différence de deux racines carrées
Évaluons
pour grand. Mathématiquement, comme ; numériquement, les deux racines deviennent de plus en plus proches, donc leur différence relève exactement du cas . Le facteur d'amplification vaut
en utilisant l'identité qui va nous sauver. Avec , l'erreur relative attendue est de l'ordre de : pour , environ , c'est-à-dire la perte de huit chiffres sur seize.
La cure est algébrique et tient en une ligne — on multiplie par la quantité conjuguée:
Le membre de droite ne contient aucune soustraction: c'est une somme de deux quantités positives, puis une division, deux opérations dont on a vu qu'elles n'amplifient rien. Le facteur a disparu.
Écrivez difference_racines(x) qui évalue sans annulation. Le programme affiche, pour trois valeurs de , la valeur de puis le résultat en notation scientifique à douze décimales.
La formule du second degré
L'équation a pour racines
Lorsque , la racine carrée vaut presque , et l'une des deux racines est obtenue en soustrayant deux nombres presque égaux: si , c'est qui s'annule; si , c'est . L'autre racine, obtenue par une addition de termes de même signe, est parfaite.
La cure repose sur la relation entre coefficients et racines, : on calcule la bonne racine par (1.12), et l'autre par une division.
Remettez dans l'ordre les étapes du calcul stable des deux racines réelles de lorsque .
Glissez les éléments pour les mettre dans le bon ordre
- Obtenir la racine de plus petit module par la division , sans aucune soustraction
- Calculer , somme de deux termes de même signe
- Contrôler le résultat avec la relation
- Calculer le discriminant et vérifier qu'il est positif ou nul
- Obtenir la racine de plus grand module par
Écrivez racines(a, b, c) qui renvoie les deux racines réelles de sans annulation, la racine de plus grand module en premier. Le programme les affiche pour , , .
Le troisième classique:
Pour petit, est proche de et la différence annule tous les chiffres. La forme stable utilise l'identité :
| (naïf) | erreur relative de la naïve | ||
|---|---|---|---|
| 4,9999999696126 |
Ce troisième exemple mérite une place à part, et nous y reviendrons: contrairement aux deux précédents, le problème est ici parfaitement bien posé. C'est l'algorithme, et lui seul, qui est mauvais.
La propagation d'une erreur à travers une fonction
Jusqu'ici, l'erreur venait de la machine. Considérons maintenant une donnée connue avec une incertitude — une mesure, une constante physique tabulée, le résultat d'un calcul antérieur — et demandons ce que devient cette incertitude après le calcul de .
Si est dérivable au voisinage de , la formule des accroissements finis (Analyse I, chapitre 8) donne, pour un entre et ,
d'où, pour petit et continue,
La dérivée est donc le facteur d'amplification de l'erreur absolue. En passant au relatif, qui est ce qui nous intéresse:
Pour , calculez le facteur d'amplification de la différence (1.10). Donnez-le sous forme d'un nombre.
Conditionnement du problème, stabilité de l'algorithme
Nous pouvons maintenant énoncer la distinction qui structure tout le cours, et dont ce chapitre n'a besoin que sous forme qualitative.
Les quatre combinaisons existent, et nous en avons déjà rencontré trois:
| algorithme stable | algorithme instable | |
|---|---|---|
| problème bien conditionné | résultat précis: | résultat faux: |
| problème mal conditionné | résultat imprécis, inévitablement: pour | résultat faux pour deux raisons |
Le cas est l'exemple à retenir, parce qu'il isole la notion. Le conditionnement du problème vaut
puisque et . Le problème est donc excellemment conditionné: une donnée à près autorise un résultat à près. C'est pourtant l'écriture naïve qui perd tout. La faute est entièrement imputable à l'algorithme, et le remède est algébrique — ce qui est la règle: on ne stabilise pas un calcul en le faisant «plus soigneusement», on le stabilise en le réécrivant.
L'erreur d'arrondi accumulée sur une somme
Une somme de termes est le calcul le plus banal qui soit, et le premier où l'accumulation des arrondis se voit. En sommant de gauche à droite,
chaque étape introduit un facteur , et l'exercice 1.5 établit la borne
où . Deux lectures. D'abord, la borne croît linéairement en : sommer un million de termes en double précision peut coûter jusqu'à d'erreur relative, ce qui reste acceptable. Ensuite, c'est le rapport qui apparaît dès qu'on passe au relatif: c'est encore le facteur d'amplification du théorème 1.2, généralisé à termes. Une somme de termes de même signe est bien conditionnée; une somme à signes alternés ne l'est pas.
La figure 1.3 dit trois choses. La borne (1.17) n'est presque jamais atteinte: les ne conspirent pas, et l'erreur observée croît plutôt comme , à la manière d'une marche aléatoire — sauf pour la sommation croissante, qui souffre d'un mal supplémentaire. Quand la somme partielle a atteint et que le terme courant vaut , ce terme est plus petit que la moitié de l'ulp de en simple précision (): il est , et il le reste pour tous les termes suivants. Sommer en commençant par les plus petits termes évite cela, et gagne ici un facteur 470 à (de à ) pour un coût nul.
On peut faire beaucoup mieux, avec un algorithme dû à Kahan, qui garde trace de ce que chaque arrondi a jeté et le réinjecte au tour suivant:
def somme_kahan(valeurs):
"""Sommation compensee: 4n operations au lieu de n, erreur independante de n."""
total = 0.0
compensation = 0.0
for v in valeurs:
y = v - compensation
t = total + y
compensation = (t - total) - y
total = t
return total
La ligne décisive est compensation = (t - total) - y: en arithmétique exacte elle vaudrait zéro, et c'est précisément parce qu'elle ne la vaut pas qu'elle capture l'erreur d'arrondi de l'addition précédente. L'algorithme coûte quatre opérations flottantes par terme au lieu d'une, et sa borne d'erreur est en — indépendante de au premier ordre. C'est un algorithme stable pour un problème bien conditionné, et la courbe brune de la figure 1.3 est plate, ce qui est la signature de cette situation.
Remplacez la somme naïve par la sommation compensée de Kahan. Le programme somme 1,0 puis cent mille fois , et doit afficher la valeur exacte et non .
Troncature contre arrondi: le premier compromis du cours
Les deux erreurs ne se comportent pas de la même manière quand on raffine un calcul, et leur opposition est le motif central des chapitres 8 à 10. L'exemple le plus court est l'approximation de pour , par le quotient de différences , dont la valeur exacte est .
| erreur totale observée | troncature estimée | arrondi estimé | |
|---|---|---|---|
La troncature décroît proportionnellement à ; l'arrondi, lui, croît comme , parce que le numérateur est une différence de nombres voisins — c'est encore l'annulation catastrophique de ce chapitre. Le total passe par un minimum vers , où l'on obtient huit chiffres corrects et pas davantage. Cette courbe en V est le sujet du chapitre 8; elle explique aussi pourquoi un critère d'arrêt trop exigeant, au chapitre 2, fait tourner une méthode indéfiniment.
Un collègue résout un système linéaire et obtient un résidu de l'ordre de . Il en conclut que sa solution est correcte à quinze chiffres. Que lui répondez-vous?
Synthèse
- Un calcul scientifique porte quatre erreurs: celle du modèle, celle des données, l'erreur de troncature (propre à la méthode, elle existerait sur une machine exacte) et l'erreur d'arrondi (propre à la machine, elle existerait avec une méthode exacte). Le cours entier tient dans la maîtrise des deux dernières.
- L'erreur relative est la grandeur qui voyage: sans dimension, comparable d'une quantité à l'autre, et c'est elle que l'arithmétique borne. Une erreur relative de correspond à environ chiffres significatifs corrects.
- Le format binary64 représente avec . Les nombres machine sont régulièrement espacés de dans chaque intervalle : l'espacement à chaque exposant, mais l'espacement relatif reste constant, et vaut au plus .
Quelle est la valeur de en double précision, dans la convention de ce cours?
Exercices
Vous pouvez afficher le corrigé directement sous chaque énoncé après avoir cherché la solution.
- La constante est approchée par . Calculer les erreurs absolue et relative, et le nombre de chiffres significatifs corrects.
- Une masse mesurée vaut kg avec une erreur relative garantie inférieure à . Dans quel intervalle la masse exacte se trouve-t-elle?
- Écrire en binaire et expliquer pourquoi il n'est pas représentable exactement, alors que et le sont.
- Quel est l'espacement des nombres machine autour de ? Autour de ? En déduire la plus petite quantité qu'on puisse ajouter à sans que le résultat soit à nouveau .
Chacune des expressions suivantes perd des chiffres significatifs dans le régime indiqué. Identifier la soustraction fautive, estimer le facteur d'amplification, et proposer une forme stable.
- pour .
- pour .
- Une résistance électrique est mesurée à à et une tension à V à . Estimer l'erreur relative sur la puissance .
Soient des nombres machine (supposés exacts) que l'on somme de gauche à droite:
Références
- Quarteroni, A., Sacco, R. et Saleri, F., Méthodes numériques — algorithmes, analyse et applications, Springer, Milan, chap. 2 (les bases de l'analyse numérique matricielle et la stabilité).
- Rappaz, J. et Picasso, M., Introduction à l'analyse numérique, Presses polytechniques et universitaires romandes, Lausanne, chap. 1.
- Higham, N. J., Accuracy and Stability of Numerical Algorithms, 2e éd., SIAM, Philadelphie, chap. 1 à 4 (la référence sur le modèle d'arrondi et la sommation compensée).
- Goldberg, D., «What Every Computer Scientist Should Know About Floating-Point Arithmetic», ACM Computing Surveys, vol. 23, n° 1, 1991.
- Burden, R. L. et Faires, J. D., Numerical Analysis, Cengage, Boston, chap. 1.
- IEEE Standard for Floating-Point Arithmetic, IEEE Std 754, Institute of Electrical and Electronics Engineers (norme en vigueur, révisée en 2019).