TD Flottants
TD Flottants
TD Flottants
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
1 Nombres flottants<br />
1.1 Exemple<br />
Arithmétique flottante<br />
Déterminer et représenter graphiquement sur un axe l’ensemble F(2, 3, −2, 1).<br />
Un flottant normalisé avec β = 2, p = 3, emin = −2 et emax = 1 s’écrit ±1, d1 d2 2 e où (d1, d2) ∈<br />
{0, 1} 2 et e ∈ {−2, −1, 0, 1}. Il y a donc 33 flottants normalisés dans F(2, 3, −2, 1) : 16 strictement<br />
positifs, 16 strictement négatifs et le zéro.<br />
Le plus petit flottant strictement positif de F(2, 3, −2, 1) est m = 1, 00 2 −2 = 1<br />
4 ·<br />
Le plus grand flottant de F(2, 3, −2, 1) est M = 1, 11 2 1 = 1 + 1 1<br />
7<br />
+ × 2 =<br />
2 4 2 ·<br />
Le plus petit écart entre deux flottants successifs non nuls de F(2, 3, −2, 1) est<br />
ulpmin = 0, 01 2 −2 = 1 1 1<br />
× =<br />
4 4 16 ·<br />
On remarque :<br />
ulpmin = ulp 1 5 3 7 <br />
= ulp = ulp = ulp .<br />
4 16 8 16<br />
Le plus grand écart entre deux flottants successifs non nuls de F(2, 3, −2, 1) est<br />
On remarque :<br />
ulpmax = 0, 01 2 1 = 1 1<br />
× 2 =<br />
4 2 ·<br />
ulpmax = ulp(2) = ulp 5 <br />
= ulp(3).<br />
2<br />
On représente sur un axe les éléments positifs de F(2, 3, −2, 1) ; les éléments négatifs s’en déduisent<br />
par symétrie.<br />
− 1<br />
4<br />
1.2 ulp<br />
1<br />
1<br />
0 4 2 1 2<br />
Quelle est la valeur d’un ulp dans F(β, p, emin, emax)<br />
1. au voisinage du plus petit flottant strictement positif ?<br />
2. au voisinage du plus grand flottant ?<br />
1. Le plus petit flottant strictement positif de F(β, p, emin, emax) est m = β emin . Le flottant immédiatement<br />
supérieur est (1 + β −(p−1) ) β emin . Donc :<br />
ulpmin = ulp(m) = β emin−(p−1) .<br />
7<br />
2
2. De même le plus grand flottant de F(β, p, emin, emax) est<br />
Le flottant immédiatement inférieur est<br />
Donc :<br />
M = (β − 1)(1 + β −1 + β −2 + · · · + β −(p−1) ) β emax .<br />
M ′ = M − β −(p−1)+emax .<br />
ulpmax = ulp(M ′ ) = β emax−(p−1) .
2 Standard IEEE 754<br />
2.1 <strong>Flottants</strong> normalisés<br />
1. Déterminer les valeurs du plus petit et du plus grand flottant positifs, des ulp minimum et maximum<br />
dans les formats simple et double de l’IEEE 754.<br />
2. Quelle est la valeur de ulp(1), c’est-à-dire quel est le plus petit nombre strictement positif qui,<br />
ajouté à 1, donne un résultat différent de 1 ?<br />
3. Montrer que le rapport ulp(x)<br />
est borné et déterminer ses bornes.<br />
x<br />
1. (a) Format simple<br />
Le plus petit flottant strictement positif est : 2 −126 ≈ 1, 1755 10 −38 .<br />
Le plus grand flottant est :<br />
1 + 1<br />
2<br />
D’après la question 1.2 on a<br />
1 1<br />
+ + · · · +<br />
22 223 127 1<br />
2 = 1 −<br />
224 128 38<br />
2 ≈ 3, 4028 10 .<br />
ulpmin = 2 −126−23 = 2 −149 ≈ 1, 4013 10 −45 ,<br />
ulpmax = 2 127−23 = 2 104 ≈ 2, 0282 10 31 .<br />
(b) Format double<br />
Le plus petit flottant strictement positif est : 2 −1022 ≈ 2, 2251 10 −308 . Dans Mathematica<br />
ce nombre s’appelle $MinMachineNumber.<br />
Le plus grand flottant est :<br />
1 + 1<br />
2<br />
1 1<br />
+ + · · · +<br />
22 252 1023 1<br />
2 = 1 −<br />
253 1024 308<br />
2 ≈ 1, 7977 10 .<br />
Dans Mathematica ce nombre s’appelle $MaxMachineNumber.<br />
D’après la question 1.2 on a<br />
ulpmin = 2 −1022−52 = 2 −1074 ≈ 4, 9407 10 −324 ,<br />
ulpmax = 2 1023−52 = 2 971 ≈ 1, 9958 10 292 .<br />
2. Dans F(β, p, emin, emax) on a ulp(1) = β −(p−1) .<br />
(a) Format simple ulp(1) = 2 −23 ≈ 1, 1921 10 −7 .<br />
(b) Format double ulp(1) = 2 −52 ≈ 2, 2204 10 −16 . Dans Mathematica ce nombre s’appelle<br />
$MachineEpsilon.<br />
3. On peut restreindre l’étude aux flottants strictement positifs. Le rapport ulp(x)<br />
x<br />
pour x = βe et ulp(βe )<br />
= β−(p−1) .<br />
β e<br />
est maximum<br />
Le rapport ulp(x)/x est minimum lors d’un changement d’exposant, c’est-à-dire lorsque x<br />
s’écrit x = (β − 1)(1, 11 . . . 1 β e ) ; on a alors<br />
Donc :<br />
ulp(x)<br />
x =<br />
β e−(p−1)<br />
(β − 1) 1 + β −1 + β −2 + · · · + β −(p−1) β<br />
β−p ulp(x)<br />
≤<br />
1 − β−p x ≤ β−(p−1) .<br />
β−p<br />
= ·<br />
e 1 − β−p
(a) Format simple<br />
(b) Format double<br />
2.2 <strong>Flottants</strong> dénormalisés<br />
5, 9605 10 −8 ≈ 2−24 ulp(x)<br />
≤<br />
1 − 2−24 x ≤ 2−23 ≈ 1, 1921 10 −7 .<br />
1, 1102 10 −16 ≈ 2−53 ulp(x)<br />
≤<br />
1 − 2−53 x ≤ 2−52 ≈ 2, 2204 10 −16 .<br />
1. Déterminer le nombre de flottants dénormalisés que l’on peut ajouter à F(β, p, emin, emax).<br />
2. Déterminer le plus petit flottant dénormalisé positif, puis le plus grand.<br />
3. Déterminer la valeur d’un ulp pour un flottant dénormalisé.<br />
1. Un flottant dénormalisé que l’on ajoute à F(β, p, emin, emax) a pour valeur<br />
±0, d1d2 . . . dp−1 × β emin ,<br />
la mantisse étant non nulle (sinon le nombre représenté est +0 ou −0).<br />
Il y en a donc : 2(β p−1 − 1).<br />
Pour les formats IEEE 754 cela donne<br />
– en simple : 2(2 23 − 1) = 16 777 214 ;<br />
– en double : 2(2 52 − 1) = 9 007 199 254 740 990 ≈ 9 10 15 .<br />
2. Le plus petit flottant dénormalisé strictement positif ajouté à F(β, p, emin, emax) est β emin−(p−1) ;<br />
on remarque qu’il est égal à ulpmin.<br />
Le plus grand est (β − 1)(β −1 + β −2 + · · · + β −(p−1) )β emin = (1 − β −(p−1) )β emin .<br />
Pour les formats IEEE 754 cela donne<br />
– en simple<br />
– plus petit : 2 −126−23 = 2 −149 ≈ 1, 4013 10 −45 ;<br />
– plus grand : (1 − 2 −23 )2 −126 ≈ 1, 1755 10 −38 . Il est, évidemment, peu différent du plus<br />
petit flottant normalisé strictement positif.<br />
– en double<br />
– plus petit : 2 −1022−52 = 2 −1074 ≈ 4, 9407 10 −324 ;<br />
– plus grand : (1 − 2 −52 )2 −1022 ≈ 2, 2251 10 −308 . Même remarque que ci-dessus.<br />
3. La fonction ulp est constante et égale à ulp(x) = β emin−(p−1) sur l’ensemble des flottants<br />
dénormalisés, c’est-à-dire qu’elle est égale au plus petit flottant dénormalisé positif : les flottants<br />
dénormalisés remplissent régulièrement le « gouffre » entre zéro et les flottants normalisés non<br />
nuls qui ont la plus petite valeur absolue.<br />
Illustration : flottants dénormalisés ajoutés à F(2, 3, −2, 1) ; il y en a 6 qui remplissent régulièrement<br />
le « gouffre » autour de zéro.<br />
− 1<br />
4<br />
1<br />
0 4<br />
1 2 3<br />
7<br />
2
2.3 <strong>Flottants</strong> sur 8 bits<br />
Étudier l’ensemble des flottants que l’on peut représenter sur 8 bits avec un bit de signe, 3 bits pour<br />
l’exposant et 4 bits pour la mantisse et un biais de l’exposant égal à 4. On précisera<br />
1. le nombre de valeurs représentées, le nombre de flottants normalisés et dénormalisés, les cas<br />
particuliers ;<br />
2. le plus petit flottant normalisé positif, le plus grand, les valeurs minimale et maximale de l’ulp,<br />
un encadrement du rapport ulp(x)<br />
;<br />
x<br />
3. les valeurs des flottants dénormalisés.<br />
On représentera l’ensemble des flottants normalisés et dénormalisés sur un axe.<br />
1. Avec 8 bits il est possible de représenter 256 valeurs. La représentation choisie est de la forme :<br />
s e1 e2 e3 d1 d2 d3 d4<br />
<br />
signe<br />
<br />
exposant<br />
<br />
mantisse<br />
La base est β = 2.<br />
La mantisse étant représentée sur 4 bits nous avons 4 décimales et donc p = 5.<br />
Un nombre codé sur trois bits peut prendre 8 valeurs ; si c’est un entier non signé il prend les<br />
valeurs de 0 à 7. Le biais étant choisi égal à 4 l’exposant peut donc prendre les valeurs de −4<br />
à 3. Les valeurs extrêmes étant réservées aux cas particuliers nous aurons donc emin = −3 et<br />
emax = 2.<br />
Les flottants normalisés forment donc l’ensemble F(2, 5, −3, 2) ; il y en a<br />
2<br />
<br />
signe<br />
× 6<br />
<br />
exposant<br />
× 16<br />
mantisse<br />
= 192<br />
non nuls, auxquels il faut ajouter les valeurs +0 et −0 : il y a donc 194 flottants normalisés.<br />
Les flottants dénormalisés ont une représentation où l’exposant est égal à emin − 1 = −4, les 3<br />
bits étant à 0, et la mantisse est non nulle ; ils sont de la forme :<br />
s 0 0 0 d1 d2 d3 d4<br />
<br />
non nulle<br />
Le nombre de flottants dénormalisés est donc égal à : 2<br />
<br />
signe<br />
× 1<br />
<br />
exposant<br />
× 15<br />
mantisse<br />
= 30.<br />
Les « non-nombres » sont représentés avec un exposant égal à emax + 1 = 3, les 3 bits étant à 1,<br />
et la mantisse est non nulle ; ils sont de la forme :<br />
s 1 1 1 d1 d2 d3 d4<br />
La valeur NaN peut donc être représentée de 2<br />
(quel gaspillage insensé !).<br />
<br />
non nulle<br />
<br />
signe<br />
Il reste enfin les valeurs +∞ et −∞ représentées par :<br />
× 1<br />
<br />
exposant<br />
× 15<br />
mantisse<br />
= 30 façons différentes<br />
0 1 1 1 0 0 0 0 et 1 1 1 1 0 0 0 0
On trouve bien au total : 194 + 30 + 30 + 2 = 256 : le compte est bon !<br />
2. Le plus petit élément strictement positif de F(2, 5, −3, 2) est représenté par :<br />
Il est égal à : 2 −3 = 1<br />
8 .<br />
0 0 0 1 0 0 0 0<br />
Le plus grand élément de F(2, 5, −3, 2) est représenté par :<br />
Il est égal à : 1 + 1 1 1 1 2 31<br />
+ + + 2 =<br />
2 4 8 16 4 ·<br />
D’après la question 1.2 on a<br />
0 1 1 0 1 1 1 1<br />
ulpmin = β emin−(p−1) = 2 −3−4 = 2 −7 = 1<br />
128 ,<br />
ulpmax = β emax−(p−1) = 2 2−4 = 2 −2 = 1<br />
4 ·<br />
D’après la question 2.1 on a 1 ulp(x) 1<br />
≤ ≤<br />
31 x 16 ·<br />
2 −3 , les di n’étant pas tous<br />
3. Les flottants dénormalisés ont pour valeurs ± d1 d2 d3 d4<br />
+ + +<br />
2 22 23 24 nuls, soit ± i <br />
128 1≤i≤15 .<br />
On représente sur un axe les flottants normalisés et dénormalisés ; les variations importantes de ulp(x)<br />
obligent à utiliser deux échelles. Les flottants négatifs n’ont pas tous été représentés.<br />
− 1<br />
8<br />
1<br />
1<br />
1<br />
0 8 4<br />
2<br />
1 2<br />
1 2 4<br />
31<br />
4
3 Arrondi<br />
3.1 Propriétés<br />
Effectuer les opérations suivantes dans F(2, 3, −2, 1) ; que peut-on en conclure ?<br />
i) 3 ⊕ 5 3<br />
<br />
5<br />
⊕ (− ) et 3 ⊕<br />
16 2 16 ⊕ − 3<br />
2<br />
<br />
;<br />
ii) 3 ⊗ 5 7<br />
⊗<br />
16 8 et 3 ⊗ 5 7<br />
⊗ ;<br />
16 8<br />
iii) 5 5 5 7 5 1 3<br />
⊕ ; ⊖ ; ⊗ 3 ; ⊗<br />
2 2 16 16 2 4 8 ·<br />
On représente l’ensemble des flottants normalisés positifs de F(2, 3, −2, 1) :<br />
0<br />
1<br />
4<br />
5<br />
16<br />
3<br />
8<br />
7<br />
16<br />
1<br />
2<br />
5<br />
8<br />
3<br />
4<br />
7<br />
8 1<br />
5<br />
4<br />
3<br />
2<br />
7<br />
4 2<br />
i) 3 ⊕ 5 7<br />
= A53 = et<br />
16 16 2<br />
7<br />
2 ⊕ − 3<br />
5<br />
16<br />
<br />
= A(2) = 2.<br />
2<br />
⊕ − 3<br />
19<br />
5<br />
= A − = −<br />
2 16 4<br />
et 3 ⊕ − 5<br />
7 7<br />
= A =<br />
4 4 4 ·<br />
L’addition dans F(2, 3, −2, 1) n’est donc pas associative.<br />
ii) 3 ⊗ 5 <br />
= A15 = 1<br />
16 16<br />
et<br />
7 7<br />
1 ⊗ = A7 =<br />
8 8 8 ·<br />
5 7 35 1<br />
⊗ = A =<br />
16 8 128 4<br />
et 3 ⊗ 1 3 3<br />
= A =<br />
4 4 4 ·<br />
La multiplication dans F(2, 3, −2, 1) n’est donc pas associative.<br />
5<br />
2 3<br />
iii) 5 5<br />
⊕ = A(5) : overflow.<br />
2 2<br />
5 7<br />
⊖<br />
16 16 = A− 1<br />
: underflow dans F(2, 3, −2, 1).<br />
8<br />
En utilisant les flottants dénormalisés le résultat est − 1<br />
.<br />
8<br />
5<br />
<br />
⊗ 3 = A15 : overflow.<br />
2 2<br />
1 3<br />
⊗<br />
4 8 = A 3 <br />
: underflow dans F(2, 3, −2, 1).<br />
32<br />
Après application de la règle de l’arrondi et en utilisant les flottants dénormalisés le résultat est 1<br />
8 .<br />
7<br />
2
3.2 Somme d’une série<br />
On cherche à évaluer une valeur approchée dans l’ensemble de flottants F(10, 3, −6, 5) de π2<br />
≈ 1, 645<br />
6<br />
∞ 1<br />
comme somme de la série · Comparer les résultats obtenus en effectuant les calculs<br />
n2 n=1<br />
1. par indices croissants, c’est-à-dire en commençant par les plus grands termes ;<br />
2. par indices décroissants à partir de n = 1000. Justifier la valeur initiale n = 1000.<br />
1. On suppose que, pour chaque valeur de n, le terme général 1<br />
est calculé exactement puis<br />
n2 arrondi dans F(10, 3, −6, 5) ; il est ensuite ajouté exactement à la somme partielle et le résultat<br />
est arrondi. On obtient successivement :<br />
n un A(un) A(Sn)<br />
1 1 1 1<br />
2 1/4 0, 250 1,25<br />
3 1/9 0, 111 1,36<br />
4 1/16 0, 0625 1,42<br />
5 1/25 0, 040 1,46<br />
6 1/36 0, 0278 1,49<br />
7 1/49 0, 0204 1,51<br />
8 1/64 0, 0156 1,53<br />
9 1/81 0, 0123 1,54<br />
10 1/100 0, 0100 1,55<br />
11 1/121 0, 00826 1,56<br />
12 1/144 0, 00694 1,57<br />
13 1/169 0, 00592 1,58<br />
14 1/196 0, 00510 1,59<br />
15 1/225 0, 00444 1,59<br />
La suite des flottants représentant les sommes<br />
partielles est stationnaire et égale à 1, 59 à<br />
partir de n = 15. La somme de la série, égale<br />
à π 2 /6, est représentée par le flottant 1, 64 ;<br />
l’erreur commise est loin d’être nulle dans<br />
l’ensemble de flottants utilisé.<br />
2. Le plus petit flottant de F(10, 3, −6, 5) est 10 −6 : pour n > 1000 le terme général est donc<br />
représenté par zéro (avec un underflow). Nous commencerons donc la sommation à n = 1000,<br />
puis nous prendrons les indices décroissants. Le calcul est (très !) fastidieux à la main ; avec<br />
Mathematica on obtient aisément le résultat avec trois instructions :<br />
Needs["NumericalMath‘ComputerArithmetic‘"]<br />
SetArithmetic[3,10,ExponentRange -> {-6,5}]<br />
Fold[Plus,0,Table[ComputerNumber[1/n^2],{n,1000,1,-1}]]<br />
On obtient le flottant 1, 64 qui est l’exacte représentation de la somme de la série.<br />
On peut remarquer, a posteriori, qu’en raison des arrondis cette valeur est en fait donnée par la<br />
somme des termes de 1 à 90 comme le montre :<br />
Fold[Plus,0,Table[ComputerNumber[1/n^2],{n,90,1,-1}]]
4 Élimination catastrophique, absorption<br />
4.1 Élimination catastrophique<br />
Calculer la valeur de l’expression A = 9x 4 − y 4 + 2y 2 pour les valeurs x = 10864 et y = 18817 en<br />
arithmétique flottante dans F(10, 15, −25, 25) puis dans F(10, 18, −25, 25).<br />
Quelle conclusion peut-on tirer ?<br />
Un calcul exact donne<br />
Dans F(10, 12, −25, 25) on obtient :<br />
x 4 = 13 930 253 758 038 016<br />
9 x 4 = 125 372 283 822 342 144<br />
y 4 = 125 372 284 530 501 121<br />
y 2 = 354 079 489<br />
2y 2 = 708 158 978<br />
9 x 4 − y 4 + 2 y 2 = 1<br />
A(x 4 ) = 1, 393 025 375 80 10 16<br />
A(9 x 4 ) = 1, 253 722 838 22 10 17<br />
A(y 4 ) = 1, 253 722 845 31 10 17<br />
A(9 x 4 − y 4 ) = −0, 000 000 007 09 10 17 = −7, 09 10 8<br />
A(y 2 ) = 3, 540 794 89 10 8<br />
A(2 y 2 ) = 7, 081 589 78 10 8<br />
A(9 x 4 − y 4 + 2 y 2 ) = −0, 008 410 22 10 8 = −8, 410 22 10 5 = −841 022<br />
Dans F(10, 15, −25, 25) on obtient :<br />
A(x 4 ) = 1, 393 025 375 803 80 10 16<br />
A(9 x 4 ) = 1, 253 722 838 223 42 10 17<br />
A(y 4 ) = 1, 253 722 845 305 01 10 17<br />
A(9 x 4 − y 4 ) = −0, 000 000 007 081 59 10 17 = −7, 081 590 00 10 8<br />
A(y 2 ) = 3, 540 794 89 10 8<br />
A(2 y 2 ) = 7, 081 589 78 10 8<br />
A(9 x 4 − y 4 + 2 y 2 ) = −0, 000 000 22 10 8 = −2, 2 10 1 = −22<br />
Dans F(10, 18, −25, 25) on obtient :<br />
A(x 4 ) = 1, 393 025 375 803 801 6 10 16<br />
A(9 x 4 ) = 1, 253 722 838 223 421 44 10 17<br />
A(y 4 ) = 1, 253 722 845 305 011 21 10 17<br />
A(9 x 4 − y 4 ) = −0, 000 000 007 081 589 77 10 17 = −7, 081 589 77 10 8<br />
A(y 2 ) = 3, 540 794 89 10 8<br />
A(2 y 2 ) = 7, 081 589 78 10 8<br />
A(9 x 4 − y 4 + 2 y 2 ) = 0, 000 000 01 10 8 = 1<br />
Le résultat dépend très fortement de la taille de la mantisse.
4.2 Absorption<br />
Déterminer deux nombres x et y tels que y soit non nul et que la somme x + y soit égale à x en<br />
arithmétique flottante (préciser sur quel ensemble de flottants).<br />
Dans F(2, 3, −2, 1) on a<br />
2 ⊕ 1 <br />
= A9 = 2.<br />
4 4<br />
On rappelle la convention d’arrondi : en cas d’ambiguïté on arrondit de sorte que le chiffre le moins<br />
significatif soit pair.