Norme IEEE 754 - Nombres binaires à virgule flottante

Dans cette leçon vidéo, le présentateur explique la norme IEEE 754 qui définit la représentation des nombres réels en virgule flottante sur les ordinateurs. Il commence par rappeler la notation scientifique décimale puis montre comment la transposer en base 2, en illustrant avec les nombres 12,625 (1100,101₂ → 1,100101 × 2³) et 0,375 (0,011₂ → 1,1 × 2⁻²). Il décrit ensuite la structure des formats les plus courants de la norme : simple précision (32 bits : 1 bit signe, 8 bits exposant, 23 bits mantisse) et double précision (64 bits : 1 bit signe, 11 bits exposant, 52 bits mantisse). Le mécanisme de biais (bias = 127 pour le simple, 1023 pour le double) est détaillé, ainsi que la façon de coder les exposants positifs et négatifs. Des exemples complets d’encodage sont fournis, avec les champs binaires et leurs représentations hexadécimales (12,625 → 0x414A0000 en simple précision, 0,375 → 0x3EC00000, -0,375 → 0xBEC00000, 12,625 en double précision → 0x4029400000000000, -12,625 → 0xC029400000000000). Le cours aborde enfin les valeurs spéciales de la norme : zéro, +∞, -∞, NaN, ainsi que les nombres dénormalisés (exposant = 0, mantisse ≠ 0) et explique leur rôle pour représenter des valeurs très proches de zéro. La vidéo se conclut sur l’importance de maîtriser les nombres normalisés et la structure de la norme IEEE 754 pour tout travail en systèmes numériques.
Chapters
Bonjour à tous et bienvenue dans cette nouvelle vidéo sur les systèmes numériques. Aujourd'hui, nous allons voir la norme IEEE 754 qui décrit la représentation des nombres binaires à virgule flottante. Tout d'abord, penchons-nous sur la représentation des nombres réels dans la base décimale que nous connaissons bien. Supposons que l'on veut représenter la célérité ou vitesse de la lumière qui vaut approximativement 300 millions de mètres par seconde. En général, on préfère représenter cette valeur avec une écriture scientifique comme ceci: 3× 10⁸ m/s. Cette écriture est plus abrégée et en plus, elle permet de simplifier l'évaluation d'un nombre constitué de beaucoup de chiffres. Pareil pour les nombres réels, par exemple, si on veut représenter la masse d'un électron et qui est infiniment petite, on préfère écrire 9,1094× 10⁻³¹ kg au lieu d'écrire 0, une trentaine de zéros, puis 91 094. Dans la base binaire, c'est pratiquement la même histoire. Au lieu d'écrire les nombres réels avec une virgule fixe qui sépare deux blocs de 0 et de 1, on préfère représenter celui-ci avec une écriture semblable à l'écriture scientifique utilisée en base 10. Imaginez que l'on veut représenter le nombre réel 12,625 en binaire. Nous avons déjà vu dans une vidéo précédente comment faire ce genre de conversion. On aura donc 1100,101. Maintenant, on va représenter ce code binaire sous une forme semblable à l'écriture scientifique du décimal. Alors on fait en sorte de mettre un chiffre 1 dans la partie entière et tout le reste dans la partie fractionnaire. Notre code devient 1,100101× 2^3. En effet, nous avons déplacé la virgule de 3 positions vers la gauche, c'est pourquoi nous avons multiplié le nombre binaire résultant par 2 qu'on a élevé à la puissance positive 3. De la même manière, si Si on veut représenter le nombre 0,375 en binaire, on obtiendra 0,011 qui est équivalent à 1,1× 2⁻². En effet, nous avons fait en sorte de laisser le chiffre 1 à gauche de la virgule et tout le reste sur sa droite. Nous avons donc déplacé la virgule de 2 positions vers la droite, ce qui est équivalent à la puissance négative -2. Comme c'est le cas pour les nombres négatifs qui contiennent le signe moins qui est inconnu par les ordinateurs et qu'on a ensuite transformé en nombre signé qui ne contient que des 0 et des 1, un nombre réel représenté avec l'écriture scientifique des symboles autres que des 0 et des 1, ce qui signifie que les ordinateurs auront du mal à l'interpréter. C'est là que la norme IEEE 754 intervient. IEEE signifie Institute of Electrical and Electronics Engineers ou Institut des Ingénieurs Électriciens et Électroniciens, est une organisation qui a pour mission promouvoir la connaissance dans le domaine de l'ingénierie liée à l'électricité et l'électronique y compris les télécommunications et l'informatique. Elle a pour but de fixer les standards ou les normes utilisés dans ces différentes disciplines. Pour ne pas trop s'écarter du sujet, IEEE a établi des règles qu'il faut suivre pour représenter les nombres réels afin que les ordinateurs puissent les comprendre de manière uniforme. Cette norme a été identifiée par le numéro 754, d'où le nom IEEE 754, et elle décrit la virgule flottante. Contrairement à une virgule fixe, la virgule flottante peut se déplacer à droite ou à gauche, et sa position est compensée par la valeur de l'exposant qui change par conséquent. IEEE 754 décrit de nombreux formats pour représenter un nombre à virgule flottante, Les plus connues sont la simple précision et la double précision. Commençons par la simple précision. Le nombre binaire résultant est codé sur 32 bits. Cette séquence de 32 bits est divisée en 3 blocs: à gauche le bit de signe, au milieu l'exposant codé sur 8 bits et à droite la mantisse codée sur 23 bits. Le bit de signe peut avoir soit la valeur 0 ou 1. 0 signifie que le nombre est positif et 1 signifie qu'il est négatif. Notez que l'on parle ici de nombres réels et non pas de nombres entiers signés complémentés à 2 qu'on a vu dans des vidéos précédentes. L'exposant contient la valeur de la puissance qui élève le nombre 2 résultant du déplacement de la virgule, et la mantisse contient la partie fractionnaire du nombre écrit avec la notation scientifique. Notez que le chiffre 1 de la partie entière est implicite, donc il n'est pas inclus dans la représentation du nombre avec la norme IEEE 754. Prenons l'exemple du nombre réel 12,625. Sa représentation réelle en virgule fixe donne 1100,101. Sa représentation scientifique correspond à 1,100101× 2^3. N'oublie pas qu'il faut toujours laisser le chiffre 1 dans la partie entière. Si on veut représenter le nombre résultant à l'aide de la norme IEEE 754, alors on procède ainsi: puisque le nombre est positif, alors on place 0 dans le bit de signe. L'exposant vaut 3. On le code en binaire sur 8 bits et on obtient 00000011. Cette valeur devrait constituer l'exposant. Mais il faut lui appliquer une petite transformation avant. En tout cas, laissons l'exposant de côté et on y reviendra après. Pour la mantisse, elle est constituée de 23 bits. On y place la partie fractionnaire de notre nombre binaire représenté en notation scientifique, puis on complète par des 0. Maintenant, imaginez que le nombre binaire que l'on veut représenter en IEEE 754 vaut 1,1× 2⁻². Bien entendu, on l'a représenté avec la notation scientifique. Remarquez que l'exposant cette fois est négatif. Alors, comment faire pour représenter un exposant négatif sur 8 bits? Avec un peu de recul, on penserait sûrement à complémenter à 2 le nombre binaire résultant pour générer un nombre signé comme on l'a vu avant. Bien que ce soit une idée tentante, la norme IEEE 754 propose une méthode différente et toute simple. Nous avons vu que l'exposant est codé sur 8 bits, donc la valeur minimale que l'on peut y placer vaut 0000. Ce qui correspond à 0 en décimal, et la valeur maximale vaut 81 qui correspond à 255 en base 10. Vous avez vu qu'il n'y a pas de nombre négatif là. L'idée consiste à diviser l'intervalle en 2. Tous les nombres qui se trouvent à droite sont considérés positifs et ceux qui se trouvent à gauche sont considérés négatifs. La valeur du milieu de l'intervalle est calculée à l'aide de cette formule: D= 2 à la puissance n- 1, le tout moins 1. n représente le nombre de bits de l'exposant. Dans notre cas il vaut 8, alors la valeur de D vaut 127. On appelle cette valeur décalage. En effet, elle représente la valeur de notre nouveau zéro. Tout ce qui est au-dessus de 127 est positif et tout ce qui est en dessous est négatif. Donc la nouvelle valeur de 1 vaut 128, 2 vaut 129, -1 vaut 126 et ainsi de suite. Revenons maintenant à notre nombre initial 12,625 en base 10 qui correspond à 1,100101× 2^3. Désormais, la nouvelle valeur de l'exposant sera décalée de 127. Autrement dit, on prend la valeur initiale 3 et on lui ajoute 127, cela donne 130. On code 130 en binaire et on obtient 10000010. C'est cette valeur que l'on mettra dans le champ consacré à l'exposant dans la représentation IEEE 754. Donc, la représentation du nombre réel 12,625 vaut 01000010. 00010100101 et quelques 0 en plus afin de compléter les 32 bits consacrés à cet effet. Vu que le code binaire résultant est trop long, alors il serait mieux d'abréger son écriture en le convertissant en hexadécimal comme on l'a vu dans une vidéo précédente. Cela donne 414A0000. Codons maintenant le nombre 0,375 en binaire. On obtiendra 0,011 qui est équivalent à 1,1× 2⁻² en notation scientifique. Le nombre est positif donc le bit de signe vaut 0. L'exposant cette fois est négatif et il vaut -2. Comme on l'a fait pour l'exposant positif, il suffit de le décaler de 127. On obtient donc -2+ 127 ce qui donne 125. On code 125 en binaire et on obtient 01111101. La mantisse vaut 1 suivie de 22 zéros. Alors la représentation IEEE 754 du nombre réel 0,375 vaut: 0111110111 et une série de 0 jusqu'à ce que l'on remplisse les 32 bits de la représentation de la simple précision. En hexadécimal, cela donne 3EC00000. Si le nombre à représenter est -0,375, alors il suffit de remplacer le bit de signe par 1. La représentation hexadécimale du code résultant vaut BEC00000. J'ai mentionné il y a quelques instants que la norme IEEE 754 propose de nombreuses représentations. Les plus connues sont la simple précision et la double précision. La simple précision, comme on l'a vu, permet de coder les nombres réels sur 32 bits alors que la double précision le fait sur 64 bits. Bien entendu, l'écriture en double précision permet de représenter des nombres réels plus grands et avec plus de chiffres après la virgule, donc c'est plus précis que la simple précision. Maintenant, représentons le nombre réel 12,625 en double précision. La représentation en double précision se fait sur 64 bits divisés en 3 blocs: un bit de signe, un exposant codé cette fois-ci sur 11 bits et une mantisse constituée de 52 bits. La notation scientifique du nombre 12,625 en binaire donne 1,100101× 2^3. Puisque le nombre est positif, alors le bit du signe vaut 0. L'exposant 3 doit être décalé cette fois de 1023. En effet, la valeur de décalage D vaut 2^n-1- 1. On remplace n par 11 qui représente le nombre de bits consacrés à l'exposant et on obtient D= 1023. On ajoute 1023 à 3 et on obtient 1026 que l'on code en binaire. Cela donne 1 suivi de 8 0 1 0 que l'on place dans le bloc consacré à l'exposant. La mantisse est tout ce qui est à droite de la virgule. Donc il vaut 100101 que l'on complète par des 0 jusqu'à ce que le code de 64 bits soit constitué. Alors, la représentation du nombre 12,625 en IEEE 754 double précision est le code affiché à l'écran. Vu que c'est trop long comme séquence binaire, alors on va le convertir en hexadécimal et on obtient 402940 suivi de 10 0. Et si on veut représenter le nombre négatif -12,625 en IEEE 754, alors seul le bit de signe changera et deviendra 1. Représentation binaire devient donc comme ceci et la représentation en hexadécimal devient C02940 suivi de 10 zéros. Notez qu'il existe des valeurs que l'on peut représenter avec la norme mais dont la représentation n'est pas calculée de la manière qu'on a vue. En effet, leurs valeurs ont été fixées depuis le début comme c'est le cas pour le nombre 0 où tous les bits sont mis à 0, que ce soit en simple précision ou en double précision,+∞ représenté par le signe 0 et l'exposant dont tous les bits valent 1 et la mantisse dont tous les bits valent 0, et moins l'infini dont seul le bit de signe change et devient 1. Il existe un nombre spécial nommé NaN pour Not a Number qui représente le code assigné à une valeur qui n'est pas un nombre et que l'on cherche quand même à représenter en tant que nombre réel à l'aide de la norme IEEE 754. C'est ce qui arrive par exemple quand vous essayez de coder un caractère alphabétique qui n'est naturellement pas un nombre, donc sa représentation à l'aide de la norme vaut NaN. Qui est représenté de différentes manières dont la plus utilisée consiste à mettre le bit de signe à 0 et tous les bits restants à 1. Finalement, sachez que pour représenter les nombres qui sont très proches de 0 tout en garantissant une précision élevée, que ce soit en simple précision ou en double précision, on utilise les nombres dénormalisés. En effet, les nombres que nous avons calculés avant sont tous des nombres normalisés. En revanche, les nombres dénormalisés sont représentés de telle sorte à ce que l'exposant soit égal à 0 et la mantisse différente de 0. Comme c'est le cas du nombre dont le premier bit à droite est mis à 1 et tous les autres bits sont à 0 et qui représente le nombre en base 10 1,4 × 10⁻⁴⁵. En tout cas, le plus important c'est de savoir représenter les nombres normalisés à l'aide de la norme IEEE 754. J'espère que vous avez apprécié cette leçon. Merci pour votre attention et à la vidéo prochaine.
More from Yamossoun

Algorithme de calcule de la racine carrée par dichotomie #dichotomy #squareroot #algorithm









