Académique Documents
Professionnel Documents
Culture Documents
Donc la représentation d’un nombre décimal en binaire sur 8 bits est simple et le même
calcul pourra s’appliquer pour un nombre entier « int » de 32 bits ou plus.
Les « float et double » : Même si un « float » occupe 32 bits ou 4 octets et qu’un « double » occupe
64 bits ou 8 octets en mémoire, leur représentation sera complètement
différente des entiers.
Les « float » en mode simple précision soit sur 32 bits se décline comme suit :
S S 8 bits 23 bits
S 11 bits 52 bits
Avant d’expliquer comment un nombre en point flottant peut être exprimé sous forme binaire dans le
format présenté à la page précédente, il serait bon de voir comment nous en sommes parvenus à
employer cette notation.
tandis que 011 se trouvant après le point vaut sous forme détaillée le calcul suivant :
Pourquoi alors ne pas utiliser cette forme dans la représentation en mémoire ? Pour la simple et bonne
raison qu’il n’y a aucun bit dans cette suite de code binaire permettant d’établir quelle est la position du
point ou de la virgule dans le nombre que j’exprime en plus, le point peut changer de place en fonction
du nombre à représenter comme 1725.25 ou 4.625 etc..
Finalement si nous exprimons en hexadécimal ce que représente ce nombre en point flottant, nous
obtenons 0x451E6A00
S exposant mantisse
Il est facile de faire le calcul à partir du code binaire, mais comment faire dans le cas contraire, soit de
partir de la valeur décimale fractionnaire. Il suffit de prendre le nombre fractionnaire, ici 0.9375 et de le
multiplier par 2, si le résultat donne un chiffre fractionnaire supérieur à 1 alors on conserve le 1 puis on
multiplie la nouvelle partie fractionnaire par 2 mais sans le 1. Si par contre le résultat de la
multiplication donne un nombre inférieur à 1, alors on conserve le 0 et ainsi de suite jusqu’à ce que le
calcul donne 1.0 ce qui mettra fin à l’itération. Voici comment ça fonctionne.
On veut traduire 0.9375 en binaire :
0.9375 X 2 = 1.875 on conserve le 1
0.875 X 2 = 1.750 on conserve le 1
0.750 X 2 = 1.500 on conserve le 1
0.500 X 2 = 1.000 on conserve le 1
0.000 on arrête ici. Donc le nombre binaire fractionnaire représentant 0.9375 est 0.1111
Effectuons maintenant le calcul avec l’exemple complet de la page 4 soit celui avec 35.3467
Commençons avec la partie fractionnaire soit 0.3467 :
Nombres particuliers :
Le chiffre 0 sera exprimé de deux manières soit ±0 lorsque le bit de signe est 0 ou 1 et que tous les
autres bits sont à 0. Comme le montre le code suivant :
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
S exposant mantisse
Ou
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
S exposant mantisse
0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
S exposant mantisse
et : Est exprimé par le code 0xFF800000
1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
S exposant mantisse
Le plus gros nombre positif : Tous les bits sont à 1 sauf le bit de signe à 0 donne le code 0x7FFFFFFF
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
S exposant mantisse
Calcul :
Le plus gros nombre négatif : Tous les bits sont à 1 ainsi que le bit de signe donne le code 0xFFFFFFFF
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
S exposant mantisse
Calcul :
Voir le texte « Aide mémoire et base du langage C » à la page 4 où le tableau indique les valeurs
maximales positives et négatives pour les types de variables.
0 1 0 0 0 1 1 0 1 0 1 1 1 0 1 0 1 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0
S exposant mantisse
Donc si mon nombre est 1.111 1111 1111 1111 1111 1111 X 223 nous aurons donc le code binaire
suivant : 1111 1111 1111 1111 1111 1111 ce nombre binaire exprimé en décimal donne 16 777 215 soit
le plus gros nombre pouvant être fait avec 24 bits. On voit que si la partie entière de mon nombre
occupe toute la mantisse je ne pourrai être en mesure de lui ajouter des chiffres après la virgule. Le
nombre en hexadécimal est 0x4b 7f ff ff
0 1 0 0 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
S exposant mantisse
Ici « l’exposant » vaut 0x96 soit 150 en décimal car
Si mon nombre est 16 777 215.5 nous aurions sous forme binaire à virgule fixe le code suivant :
16 777 215.5 --> 1111 1111 1111 1111 1111 1111.1
23
Ce qui se traduit par 1.111 1111 1111 1111 1111 1111 X 2 = 1 1111 1111 1111 1111 1111 111
La valeur finale donne 16 777 215 au lieu de 16 777 215.5. Il se peut que lors de l’impression du
nombre, la fonction comme « printf » fera un arrondi si la valeur du chiffre après la virgule est
supérieure à 0.5. Donc l’affichage de 16 777 215.5 donnera 16 777 216.0
Quelle sera alors le nombre maximal que l’on peut écrire tout en pouvant obtenir une valeur après la
virgule. Étant donné que le premier bit après la virgule vaut 0.5 il nous faudra donc retrancher un bit de
notre fameux nombre, nous prendrons le bit le plus significatif ce qui va couper notre plage en deux, ce
qui donne 8 388 607 qui correspond en binaire à la valeur 0111 1111 1111 1111 1111 1111 , exprimée
22
en notation scientifique binaire nous avons 1.11 1111 1111 1111 1111 1111 X 2 . Il nous reste alors un
bit de libre dans la mantisse nous pourrons donc l’utiliser pour notre 0.5.
Si j’écris le nombre 8 388 607.5 celui-ci sera alors représenté en notation binaire à virgule fixe comme
0111 1111 1111 1111 1111 1111.1 et ce dernier traduit en notation scientifique binaire nous donne le
code 1.111 1111 1111 1111 1111 1111 X 222 . Donc avec le nombre 8 388 607 nous ne pourrons ajouter
qu’un seul chiffre après la virgule et si celui-ci est inférieur à 0.5 le résultat sera arrondi vers le bas par
exemple 8 388 607.25 la réponse sera 8 388 607.0 tandis que si le nombre est 8 388 607.75 nous aurons
8 388 608.0 donc arrondi vers le haut.
0 0 1 1 1 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
S exposant mantisse
Nombres particuliers :
Le chiffre 0 sera exprimé de deux manières soit ±0 lorsque le bit de signe est 0 ou 1 et que tous les
autres bits sont à 0. Comme le montre le code suivant :
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . 0 0 0 0 0 0 0 0
S exposant mantisse
Ou
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . 0 0 0 0 0 0 0 0
S exposant mantisse
0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 . . . 0 0 0 0 0 0 0
S exposant mantisse
et : Est exprimé par le code 0xFFF0000000000000
1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 . . . 0 0 0 0 0 0 0
S exposant mantisse
Le plus gros nombre positif : Tous les bits à 1 sauf le bit de signe à 0 donne le code 0x7FFFFFFF
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . 1 1 1 1 1 1 1
S exposant mantisse
Calcul :
Le plus gros nombre négatif : Tous les bits sont à 1 ainsi que le bit de signe, donne le code 0xFFFFFFFF
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . 1 1 1 1 1 1 1 1
S exposant mantisse
Calcul :
Voir le texte « Aide mémoire et base du langage C » à la page 4 où le tableau indique les valeurs
maximales positives et négatives pour les types de variables.
Tous les calculs et la démarche pour déterminer les codes binaires fractionnaires ou les valeurs entières
se font de la même manière. Donc il n’est pas pertinent ici de vous refaire ce qui a été expliqué
précédemment. Voici quelques questions qui vous permettront de vous faire la main à ce sujet.
Exercices
1) Exprimez le nombre 42.75 sous la forme d’un nombre en hexadécimal du type point flottant simple
précision.
2) Idem mais pour le nombre -315.8525
3) Si j’ai la représentation en hexadécimal suivante 0x3D800000 d’un nombre en point flottant 32 bits,
quelle alors sa vraie valeur en décimal.
4) Si j’ai la représentation en hexadécimal suivante 0x44846800 d’un nombre en point flottant 32 bits,
quelle alors sa vraie valeur en décimal.
5) Quel est le code hexadécimal sur 32 bits du nombre en point flottant -0.2356
6) Exprimer sous la forme hexadécimale le nombre suivant en point flottant double précision sur 64
bits, 50.1875
7) Quel est le nombre représenté par le code hexadécimal de 64 bits en point flottant double précision
suivant : 0x40A0D9C020C49BA6
8) Faites l’addition en point flottant de ces deux nombres exprimés sur 32 bits simple précision.
0x42FB8000 et 0x4242147B effectuez votre calcul en transformant vos deux nombres en
représentation scientifique en base 2. Par exemple 100110.010111 + 111101.11101 Ensuite vous
pourrez retraduire en dans la forme finale comme le sont les deux nombres du début.
Vous avez sur LÉA le programme exécutable « point_flottant.exe » pour valider vos réponses et si vous
voulez voir le fichier source ouvrez-le avec CodeBlocks. Ce programme ce nomme « point_flottant.c »