6
1 Ce qu’on ne peut ignorer
Les éléments de F sont “plus denses” quand on s’approche de x min ,
et “moins denses” quand on s’approche de x max . Ainsi, le nombre de F
le plus proche de x max (à sa gauche) et celui le plus proche de x min (à
sa droite), sont respectivement
x
−
max = 1.797693134862315 · 10
+308 ,
x
+
min = 2.225073858507202 · 10
−308 .
On a donc x
+
min − x min 10
−323 , tandis que x max − x
−
max 10
292 ( !).
Néanmoins, la distance relative est faible dans les deux cas, comme le
montre (1.2).
1.2.2 Comment calculer avec des nombres à virgule flottante
Comme F est un sous-ensemble propre de R, les opérations algébriques
élémentaires sur F ne jouissent pas des mêmes propriétés que sur R.
La commutativité est satisfaite par l’addition (c’est-à-dire fl(x + y) =
fl(y+x)) ainsi que par la multiplication (fl(xy) = fl(yx)), mais d’autres
propriétés telles que l’associativité et la distributivité sont violées. De
plus, 0 n’est plus unique. En effet, affectons à la variable a la valeur 1,
et exécutons les instructions suivantes :
>> a = 1; b=1; while a+b ~= a; b=b/2; end
La variable b est divisée par deux à chaque étape tant que la somme
de a et b demeure différente (˜=) de a. Si on opérait sur des nombres
réels, ce programme ne s’arrêterait jamais, tandis qu’ici, il s’interrompt
après un nombre fini d’itérations et renvoie la valeur suivante pour b :
1.1102e-16= M /2. Il existe donc au moins un nombre b différent de 0
tel que a+b=a. Ceci est lié au fait que F est constitué de nombres isolés ;
quand on ajoute deux nombres a et b avec b on obtient toujours a+b égal à a. En MATLAB, le nombre a+eps(a) est
le plus petit majorant strict de a dans F. Donc, la somme a+b retourne
a pour tout b < eps(a).
L’associativité est perdue chaque fois qu’une situation d’overflow ou
d’underflow se produit. Prenons par exemple a=1.0e+308, b=1.1e+308
et c=-1.001e+308, et effectuons la somme de deux manières différentes.
On trouve :
a + (b + c) = 1.0990e + 308, (a + b) + c = Inf.
C’est en particulier ce qui se produit quand on ajoute deux nombres
de signes opposés et proches en valeur absolue : le résultat d’une telle
opération peut être très imprécis. On appelle ce phénomène perte, ou
annulation, des chiffres significatifs. Par exemple, calculons ((1 + x) −
1)/x (le résultat est évidemment 1 pour tout x = 0) :
1 Ce qu’on ne peut ignorer
Les éléments de F sont “plus denses” quand on s’approche de x min ,
et “moins denses” quand on s’approche de x max . Ainsi, le nombre de F
le plus proche de x max (à sa gauche) et celui le plus proche de x min (à
sa droite), sont respectivement
x
−
max = 1.797693134862315 · 10
+308 ,
x
+
min = 2.225073858507202 · 10
−308 .
On a donc x
+
min − x min 10
−323 , tandis que x max − x
−
max 10
292 ( !).
Néanmoins, la distance relative est faible dans les deux cas, comme le
montre (1.2).
1.2.2 Comment calculer avec des nombres à virgule flottante
Comme F est un sous-ensemble propre de R, les opérations algébriques
élémentaires sur F ne jouissent pas des mêmes propriétés que sur R.
La commutativité est satisfaite par l’addition (c’est-à-dire fl(x + y) =
fl(y+x)) ainsi que par la multiplication (fl(xy) = fl(yx)), mais d’autres
propriétés telles que l’associativité et la distributivité sont violées. De
plus, 0 n’est plus unique. En effet, affectons à la variable a la valeur 1,
et exécutons les instructions suivantes :
>> a = 1; b=1; while a+b ~= a; b=b/2; end
La variable b est divisée par deux à chaque étape tant que la somme
de a et b demeure différente (˜=) de a. Si on opérait sur des nombres
réels, ce programme ne s’arrêterait jamais, tandis qu’ici, il s’interrompt
après un nombre fini d’itérations et renvoie la valeur suivante pour b :
1.1102e-16= M /2. Il existe donc au moins un nombre b différent de 0
tel que a+b=a. Ceci est lié au fait que F est constitué de nombres isolés ;
quand on ajoute deux nombres a et b avec b on obtient toujours a+b égal à a. En MATLAB, le nombre a+eps(a) est
le plus petit majorant strict de a dans F. Donc, la somme a+b retourne
a pour tout b < eps(a).
L’associativité est perdue chaque fois qu’une situation d’overflow ou
d’underflow se produit. Prenons par exemple a=1.0e+308, b=1.1e+308
et c=-1.001e+308, et effectuons la somme de deux manières différentes.
On trouve :
a + (b + c) = 1.0990e + 308, (a + b) + c = Inf.
C’est en particulier ce qui se produit quand on ajoute deux nombres
de signes opposés et proches en valeur absolue : le résultat d’une telle
opération peut être très imprécis. On appelle ce phénomène perte, ou
annulation, des chiffres significatifs. Par exemple, calculons ((1 + x) −
1)/x (le résultat est évidemment 1 pour tout x = 0) :
