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