Nombres à virgule flottante

publicité
Classe de TS
Cours
IEEE754
Nombres à virgule flottante
1
LE STANDARD IEEE 754
A la fin des années 1970 chaque ordinateur avait sa propre représentation interne pour les nombres à virgule
flottante. Or, l'arithmétique à virgule flottante possède certaines subtilités que le constructeur moyen ne maîtrisait
pas forcément et certaines machines effectuaient certaines opérations de manière incorrecte. Pour remédier à cette
situation, l'IEEE (Institut of Electrical & Electronics Engineers) proposa un standard non seulement pour permettre
les échanges de données en virgule flottante entre ordinateurs, mais aussi pour fournir un modèle rodé aux
constructeurs, dont le fonctionnement était correct et maîtrisé. De nos jours, pratiquement tous les constructeurs
ont des processeurs ou des coprocesseurs dédiés qui effectuent des calculs en virgule flottante et qui emploient la
représentation au standard IEEE 754.
Le standard IEEE 754 définit trois formats :
simple précision sur 32 bits
double précision sur 64 bits
représentation sur 80 bits
•
•
•
La représentation sur 80 bits est principalement utilisée en interne par les processeurs pour minimiser les erreurs
d'arrondi.
2 SIMPLE PRÉCISION IEEE 754
2.1
PRINCIPE
La représentation standard IEEE 754 en simple précision utilise le bit de poids fort pour le signe, suivi par un
exposant sur 8 bits et 23 bits pour la mantisse :
signe
exposant
mantisse
1
8
23
Signe (1 bit)
Le bit est à zéro, le nombre est positif,
Le bit est à un, le nombre est négatif.
Exposant : (8 bits)
•
code relatif à 127. (on ajoute 127, par exemple un exposant de valeur 2 sera codé 2+127 soit 129)
Mantisse (23 bits)
•
elle utilise la base 2.
•
Une mantisse normalisée commence toujours par un bit 1, suivi par la virgule, puis par le reste de la
mantisse. Le bit initial, toujours présent et toujours à 1 dans une mantisse normalisée est implicite et
non représenté.
•
•
Si les 23 bits qui représentent la mantisse sont à 0, la valeur de celle-ci est 1 (cf. le bit implicite de poids
fort à 1). Si les 23 bits sont à 1, le valeur de la mantisse est presque 2 (en fait 2-2 -23). La valeur de la
mantisse est appelée le significande. Tous les nombres normalisés IEEE 754 ont un significande compris
dans l'intervalle [1,2[.
1,
2-1 2-2 2-3 2-4 2-5 2-6
1
1
1
1
1
1
2-23
1
1
1
1
1
1
1
1
1
1
1
23 bits dont la somme s'ils sont tous à 1 = ~1
IEEE 754.odt
Page 1/4
1
1
1
1
1
1
Classe de TS
Cours
Nombres à virgule flottante
2.2
CARACTÉRISTIQUES IEEE 754 SIMPLE PRÉCISION
•
exposant
•
-126 à +127
•
mantisse
•
1 à presque 2 (en fait 2-2-23)
•
plus petit nombre normalisé
•
2-126
•
plus grand nombre normalisé
•
presque 2128
•
2.3
IEEE754
intervalle utile
•
approximativement 10-38 à 1038
EXEMPLES
Soit à coder le nombre 1---> (20)
Le bit de signe sera 0, l'exposant, en code relatif à 127 sera représenté par 127 = 01111111, et le significande vaut
1, ce qui résulte en une mantisse dont tous les bits sont à O. La représentation IEEE simple précision IEEE 754 du
nombre 1 est donc :
Code(1) = 0011 1111 1000 0000 0000 0000 0000 0000 = 3F800000
seee eeee emmm mmmmm.......................m
Soit à coder le nombre 0.5 ---> ( 2-1)
Le bit de signe est 0, l'exposant, en code relatif à 127 est représenté par 127 - 1 = 01111110, et le significande vaut
1, ce qui résulte en une mantisse dont tous les bits sont à 0. La représentation IEEE simple précision IEEE 754 du
nombre 0.5 est donc :
Code(0.5) = 0011 1111 0000 0..............................0 = 3F000000
seee eeee emmm ….........................m
Soit à coder le nombre 1.5 ---> (20 + 2-1)
Le bit de signe est 0, l'exposant, en code relatif à 127 est représenté par 127 = 01111111, et le significande vaut
1.1, ce qui résulte en une mantisse dont le premier bit est à 1 et les 22 suivants à 0. La représentation IEEE simple
précision IEEE 754 du nombre 1.5 est donc :
Code(1.5) = 0011 1111 1100 0.................0 = 3FC00000
seee eeee emmm …...........m
2.4
NOMBRES IEEE 754 SPÉCIAUX
En arithmétique à virgule flottante on peut obtenir un résultat valable, ou alors rencontrer un problème de
dépassement par valeur supérieure (overflow) lorsque le résultat est trop grand pour pouvoir être représenté, ou par
valeur inférieure (underflow) lorsque le résultat est trop petit.
2.4.1
Dépassement par valeur inférieure
Cette situation arrive lorsqu'un résultat est trop petit pour pouvoir être représenté. Le standard IEEE 754 résout
partiellement le problème en autorisant dans ce cas une représentation dénormalisée. Une représentation
dénormalisée est caractérisée par le fait d'avoir un code d'exposant complètement nul, ce qui est interprété comme
une indication du fait que le bit de poids fort de la mantisse, implicite, est cette fois à 0 au lieu d'être à 1. De cette
façon, le plus petit nombre "exprimable" est : 2 -127 x 2-23 = 2-150 ~ 10-45
Cependant, il faut remarquer que plus le nombre représenté est petit, moins sa mantisse comportera de bits
significatifs. Ce schéma permet une approche "douce" du phénomène de dépassement par valeur inférieure, en
sacrifiant la précision lorsqu'un résultat est trop petit pour admettre une représentation normalisée.
IEEE 754.odt
Page 2/4
Classe de TS
Nombres à virgule flottante
2.4.2
Cours
IEEE754
Zéro
Zéro est représenté sous la forme d'un nombre dénormalisé. Ceci résulte en deux représentations possibles pour
zéro : l'une pour +0, l'autre pour -0. Ces représentations sont caractérisées par un bit de signe suivi par 31 0.
2.4.3
Dépassement par valeurs supérieures
Le dépassement par valeurs supérieures ne peut pas être traité comme le dépassement par valeurs inférieures, et est
indiqué par un code d'exposant dont tous les bits sont à 1, suivi par une mantisse dont tous les bits sont à 0. Ceci
est interprété comme représentant l'infini. L'infini peut être positif ou négatif, en fonction de la valeur du bit de
signe. L'infini peut être utilisé dans les calculs et les résultats correspondent au sens commun :
inf + inf = inf
x / inf = 0
x / 0 = inf
2.4.4
Not a Number
Cependant, certaines opérations peuvent ne conduire à aucun résultat exprimable, comme
inf / inf = ?
0 x inf = ?
Le résultat de telles opérations est alors indiqué par un autre code spécial : le code d'exposant a tous les bits à 1,
suivi par une mantisse non nulle. Le "nombre" correspondant est appelé NaN (Not a Number) : c'est un nonnombre.
2.5
3
RÉCAPITULATIF DU STANDARD IEEE 754
Nombre
signe
exposant
mantisse
nombre normalisé
0/1
01 à FE
quelconque
nombre dénormalisé
0/1
00
quelconque
zéro
0/1
00
0
infini
0/1
FF
0
NaN
0/1
FF
tout sauf 0
IEEE 754 DOUBLE PRÉCISION
Toutes les conventions utilisées en simple précision sont également valables pour la double précision. Les seules
différences proviennent du fait que la double précision utilise un exposant sur 11 bits en code relatif à 1023, et une
mantisse sur 52 bits. Ceci conduit aux caractéristiques suivantes :
3.1
IEEE 754 DOUBLE PRÉCISION
exposant
-1022 à +1023
mantisse
1 à presque 2 (2-2-52)
plus petit nombre normalisé
2-1022
plus grand nombre normalisé
presque 21024
intervalle utile
approximativement 10-308 à 10308
plus petit nombre dénormalisé
2-1074 ~ 10-324
4 EXERCICES
Quelle est la valeur du nombre représenté par le code hexadécimal 40490FD8 ?
Coder - 20 (simple précision)
IEEE 754.odt
Page 3/4
Classe de TS
Cours
Nombres à virgule flottante
IEEE754
5 CODAGE EN BINAIRE
4.1
CODAGE D'UN NOMBRE DÉCIMAL EN BINAIRE
On va traiter le problème en deux temps : codage de la partie entière puis codage de la partie décimale
4.1.1 Codage partie entière
La partie entière (E) peut se représenter sous la forme E = an.2n + an-1.2n-1 + an-2.2n-2+……. a1.21+a0.20
(a prend la valeur 0 ou 1)
On peut mettre 2 en facteur
E= 2Q0+R0= 2(an.2n-1 + an-1.2n-2 + an-2.2n-3+……. a1.20) +a0.20
(Q : quotient; R : reste)
Par identification on peut dire que :
R0=a0.20
Q0= an.2n-1 + an-1.2n-2 + an-2.2n-3+……. a1.20
On peut mettre 2 en facteur
Q0= 2Q1+R1= 2(an.2n-2 + an-1.2n-3 + an-2.2n-4+……. a2.20)+a1.20
Par identification on peut dire que :
R1=a1.20
Q1= an.2n-2 + an-1.2n-3 + an-2.2n-4+……. A2.20
et ainsi de suite jusqu'à déterminer tous les coefficients jusqu'à a n
Une suite de divisions par 2 nous permet donc de représenter la partie entière par un nombre binaire.
4.1.2 Codage partie décimale
La partie décimale (0, D0) peut se représenter sous la forme à 0,D0 = a-1.2-1+ a-2.2-2 +a-2.2-2+……….. + a-n.2-m
On multiplie les deux termes de l'égalité par deux
0, 2D0 = 2( a-1.2-1+ a-2.2-2 +a- 3.2-3+……….. + a-m.2-m)
Que l'on écrit sous la forme :
E1, D1 = a-1 + a-2.2-1 +a-3.2-2+……….. + a-n.2-m+1 (E1 partie entière qui peut prendre la valeur 0 ou 1)
par identification
E1 =a1
D1= a-2.2-1 +a-3.2-2+……….. + a-m.2-m+1
On multiplie les deux termes de l'égalité par deux
E2,D2 = a-2 +a-3.2-1+……….. + a-m.2-m+2
E2 = a-2 …………………………. et ainsi de suite jusqu'à déterminer tous les coefficients jusqu'à a m
exemple
7 ,65
Poids
forts
conversion de 7
7
2
1
3
1
Des poids
forts vers les
faibles
2
1
1
2
0
On effectue des
divisions jusqu’à
obtenir 0
0,65
x2
1, 3
x2
0, 6
x2
1, 2
x2
0, 4
x2
0, 8
x2
1, 6
0,65=0,101001………
On vérifie :
0,65= 2-1+2-3+2-6+……
0,640625=0,5 +0,125+0,015625
On peut constater que la suite se
répète, ce n'est pas utile d'aller
plus loin.
111,1010011001100110011001 (2) =7,649999856
pour effectuer un codage en float sur 32 bits 1,11101001100110011001100 *22 . Le 1 avant la virgule n'est
pas codé 7,65 est représenté par : 010000001 11101001100110011001100 soit 40F4CCCC en hexa
IEEE 754.odt
Page 4/4
Téléchargement