Chapitre1 AnalNum
Chapitre1 AnalNum
Chapitre1 AnalNum
Sommaire
1.1. L’arithmétique flottante . . . . . . . . . . . . . . . . . . . . 5
1.2.1. Non-associativité . . . . . . . . . . . . . . . . . . . . . 8
4
Dans tout ce cours, nous manipulerons des nombres réels. L’objet de ce
premier chapitre est de décrire comment ces nombres réels sont représentés dans un
ordinateur.
X dk
x = sgn(x)β e ,
k≥1
βk
où sgn(x) ∈ {+, −} est le signe de x, les dk sont des entiers tels que 0 < d1 ≤ β − 1 et
0 ≤ dk ≤ β − 1 pour k ≥ 2, et e ∈ Z. De plus, cette écriture est unique (sauf pour les décimaux :
2, 5 = 2, 499999 . . .).
D’ordinaire, nous utilisons le système décimal, i.e., β = 10 et les chiffres
0, 1, 2, 3, 4, 5, 6, 7, 8, 9 pour les dk . Nous avons par exemple :
• 0,0038 = 0,38.10−2 = + 10−2 ( 10
3
+ 8
102
).
1 1
• = 0,142857... = + 100 ( 10
7
+ 1042 + 1023 + 1084 + ...). Notons que le développement
décimal d’un nombre rationnel est périodique (ici, 71 = 0, 142857142857142857...).
√ 1
• - 2 = −1, 4142... = −101 ( 10 + 1042 + 1013 + 1044 + ...).
3 1 4 1
• π = 3, 14159... = +101 ( 10 + 102
+ 103
+ 104
+ ...).
Historiquement, le choix β = 10 est lié à une particularité anatomique de la race
humaine (nous avons 10 doigts). Les ordinateurs utilisent quant à eux β = 2 (numération
binaire), β = 8 (numération octale), ou encore β = 16 (numération hexadécimale).
Remarquons que l’on perd l’unicité si on autorise d1 = 0 : en effet, on a par exemple
:
−2 3 8 −2
0.0038 = 0.38.10 = +10 +
10 102
−3 −1 0 3 8
= 0.038.10 = +10 + +
10 102 103
5
e d1 d2 dt
F = y ∈ R|y = ±β ( + 2 + ... + t ), emin ≤ e ≤ emax ,
β β β
ou encore
F = y ∈ R|y = ±mβ e−t , emin ≤ e ≤ emax .
F est un système de nombres à virgule flottante (floating point number system) noté
F (β, t, emin , emax ). Il dépend de quatre paramètres :
1. la base β (chiffres utilisés 0, 1, ..., β − 1),
2. la précision t (nombre de chiffres utilisés pour représenter la mantisse),
3. emin et emax qui définissent le domaine des exposants.
Par exemple, pour F (2, 3, −1, 3), on obtient les nombres représentés en rouge sur la
figure ci-dessous :
On constate que l’écart entre deux nombres consécutifs est multiplié par 2 à chaque
puissance de 2. Dans le standard IEEE 754 utilisé par Matlab, on a β = 2 et :
• en simple précision : t = 24, emin = −125, emax = 128,
• en double précision : t = 53, emin = −1021, emax = 1024,
Définition 1.2 On appelle epsilon machine et on note M la distance de 1 au nombre flottant
suivant.
Par exemple, pour F (2, 3, −1, 3), on a M = 0, 25. Dans Matlab, c’est eps.
Proposition 1.3 Pour F (β, t, emin , emax ), on a M = β 1−t .
β
Démonstration. On a 1 = β β1 = β 1−t 10...0 . Le nombre suivant dans le système de
β
nombres à virgule flottante F (β, t, emin , emax ) est alors β 1−t 10...1 = β 1−t (β t−1 + 1) = 1 +
β 1−t .
Lemme 1.4 Dans le système de nombres à virgule flottante F (β, t, emin , emax ), l’écart |y − x|
entre un nombre flottant x (non nul) et un nombre flottant y (non nul) adjacent vérifie β −1 M |x| ≤
|y − x| ≤ M |x|
6
Démonstartion. On a x = mβe − t, donc |y − x| = 1β e−t . Or β t−1 ≤ m < β t donc
mβ −t < 1 et mβ 1−t ≥ 1. Il vient donc mβ −t β e−t < 1β e−t ≤ mβ 1−t β e−t d’où le résultat
puisque M = β 1−t .
7
Par exemple, dans le standard IEEE 754 utilisé par Matlab, on a u = 2−24 ≈ 5, 96.10−8
en simple précision et u = 2−53 ≈ 1, 11.10−16 en double précision.
∆S ≤ δ(S2 + ...Sn ),
ou encore
∆S ≤ δ(un + 2un−1 + 3un−2 + ... + (n − 1)u2 + (n − 1)u1 ).
On voit donc que pour minimiser cette erreur on a tout intérêt à sommer d’abord les
termes les plus petits (Cf exemple de la sous-section précédente).
8
calcul des produits Pi vérifient ∆Pi ≤ ∆Pi−1 ui + δ(Si−1 ui ) = ∆Pi−1 ui + δPi où |δ| < u.
L’erreur globale sur P = Pn vérifie donc
∆P ≤ (k − 1)δPn
9
On peut donc calculer successivement les valeurs de In en utilisant la récurrence I0 =
ln 11
10
, In = 1
n
− 10 In−1 . Numériquement, cela conduit à des résultats très mauvais. Cela
provient du fait que l’erreur d’arrondi ∆ In sur le calcul de In vérifie ∆In ≈ 10∆In−1 , si
l’on néglige l’erreur d’arrondi sur n1 . On voit donc que l’erreur croit exponentiellement :
l’erreur sur I0 est multipliée par 10n sur In . Par conséquent cette formule de récurrence
ne peut pas nous permettre de calculer la valeur de I3 6 par exemple. Pour remédier à ce
problème, on peut renverser la récurrence c’est-à-dire considérer la formule :
1 1
In−1 = − In
10 n
1 1
≤ In ≤ .
11 (n + 1) 10 (n + 1)
1
L’approximation In ≈ 11(n+1) nous permet alors de calculer une valeur de départ pour
1
notre récurrence renversée. Par exemple, si l’on part de I46 ≈ 11(46+1) , on obtiendra pour
−10
I36 une 11 erreur relative meilleure que 10 .
On constate ici l’importance du coefficient d’amplification d’erreur pour ce genre de
calcul.
Exemple 2 : On considère la suite définie par :
u0 = 2
u1 = −4
un = 111 − u1130 3000
+
n−1 un−1 un−2
introduite par J.-M. Muller. On peut alors montrer que la limite de cette suite est égale à 6
et malgré cela, quelque soit le système et la précision utilisés, cette suite semblera tendre
vers 100. L’explication de ce phénomène étrange est assez simple : la solution générale de
la récurrence un = 111 − u1130
n−1
3000
+ un−1 un−2
est donnée par :
10
1.2.6 Erreur amont et erreur aval
Considérons un problème que l’on résout à l’aide d’un algorithme numérique et
appelons f la fonction qui fait correspondre à l’entrée x de l’algorithme la solution
algébrique y = f (x). En pratique, compte tenu des erreurs d’arrondis, étant donnée
une entrée x, nous allons obtenir une sortie ȳ qui sera distincte de la solution algébrique
y = f (x). L’erreur aval est alors la différence entre le résultat ȳ obtenu et la solution
algébrique y. L’erreur amont ou erreur inverse est le plus petit δx tel que la solution
algébrique f (x + δx) correspondant à l’entrée x + δx soit égale à ȳ. Ces deux erreurs
sont liées par le conditionnement (voir Chapitre ??) : l’erreur aval étant du même ordre
que l’erreur amont multipliée par le conditionnement. L’erreur amont est en général plus
intéressante que l’erreur aval car elle nous renseigne sur le problème qui est réellement
résolu par l’algorithme numérique. De plus, en pratique, nous ne connaissons en général
qu’une valeur approchée de l’entrée (par exemple obtenue par une mesure).
fl((x × y) + z) = [fl(x × y) + z] (1 + δ1 )
= [(x × y)(1 + δ2 ) + z] (1 + δ1 )
= (x × y)(1 + δ2 )(1 + δ1 ) + z(1 + δ1 )
11