06.07.2013 Views

TD Flottants

TD Flottants

TD Flottants

SHOW MORE
SHOW LESS

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.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!