CHAPITRE 5 : LA VIRGULE FIXE

Jusqu'ici nous n'avons codé que des entiers. Mais un programme doit aussi manipuler 5,25 : un prix, une température, une coordonnée. Le premier format inventé pour cela est le plus simple : on décide une fois pour toutes où se trouve la virgule, et on n'en parle plus. C'est la virgule fixe, le format des premières machines.

L'idée : prolonger les poids vers la droite

En base dix, 54,25 se lit 5×101 + 4×100 + 2×10−1 + 5×10−2. Les positions après la virgule portent des puissances négatives : les dixièmes, les centièmes.

En base deux, exactement pareil, avec des puissances de deux. Après la virgule on trouve les demis, les quarts, les huitièmes…

Position2322 2120, 2−12−2 2−32−4
Poids8421, 0,50,250,1250,0625

Prenons 101,01 en base deux :

1×4 + 0×2 + 1×1 + 0×0,5 + 1×0,25 = 4 + 1 + 0,25 = 5,25

Le nombre 101,01 en base deux, position par position : les poids 4, 2 et 1 avant la virgule, 0,5 et 0,25 apres. La somme des positions a un vaut 5,25.

La définition formelle

Dans une base b, un nombre X s'écrit en virgule fixe sous la forme :

X = an−1an−2…a1a0 , a−1a−2…a−p

  • n est le nombre de chiffres avant la virgule ;
  • p est le nombre de chiffres après ;
  • an−1 est le chiffre de poids fort (MSB), a−p celui de poids faible (LSB) ;
  • la valeur vaut la somme des ai×bi, pour i allant de −p à n − 1.

Le mot « fixe » dit l'essentiel : la position de la virgule est décidée à l'avance et ne bouge jamais. Elle n'est d'ailleurs pas stockée en mémoire. Un registre de 16 bits en format 8.8 contient simplement seize bits ; c'est le programme qui sait que les huit premiers sont la partie entière et les huit derniers la partie fractionnaire.

Convertir du décimal vers le binaire

La méthode se fait en deux temps, un pour chaque côté de la virgule.

  • Partie entière : divisions successives par 2, restes lus de bas en haut. C'est la méthode du chapitre 1.
  • Partie fractionnaire : multiplications successives par 2. À chaque tour, le chiffre qui apparaît avant la virgule est le bit suivant ; on le retire et on recommence avec ce qui reste. On s'arrête quand il ne reste rien, ou quand on a atteint le nombre de bits dont on dispose.

Exemple : 4,25

Partie entiere : 4 = 100

Partie fractionnaire :
0,25 x 2 = 0,5  ->  0   il reste 0,5
0,5  x 2 = 1,0  ->  1   il reste 0   on s'arrete

4,25 = 100,01  en base 2

Contrôle : 4 + 0,25 = 4,25. C'est juste.

Exemple : 45,125

Partie entiere : 45 = 101101

Partie fractionnaire :
0,125 x 2 = 0,25 ->  0   il reste 0,25
0,25  x 2 = 0,5  ->  0   il reste 0,5
0,5   x 2 = 1,0  ->  1   il reste 0

45,125 = 101101,001  en base 2

On remarque que les bits se lisent de haut en bas, dans l'ordre où ils sortent : à l'inverse de la partie entière. C'est l'erreur la plus fréquente dans les copies : inverser l'un des deux sens.

Quelles fractions tombent juste ? Une fraction a une écriture binaire finie si, et seulement si, son dénominateur réduit est une puissance de 2. Ainsi 0,5, 0,25, 0,125, 0,625 ou 0,8125 s'écrivent exactement ; 0,1, 0,2, 0,3 et 0,7 ne s'écrivent pas. Nous consacrerons tout le chapitre 8 à cette question, parce qu'elle est à l'origine de la plupart des surprises que réserve le calcul en machine.

Ce que la virgule fixe sait très bien faire

Ne la rangez pas trop vite au musée. La virgule fixe a trois qualités sérieuses :

  • L'arithmétique est celle des entiers. Un nombre en virgule fixe n'est qu'un entier qu'on interprète divisé par une puissance de deux. L'addition et la soustraction sont donc exactement celles du complément à 2 : mêmes circuits, même vitesse.
  • Le pas est constant. Entre deux valeurs consécutives, l'écart est toujours le même : 2−p. C'est une propriété précieuse pour le traitement du signal ou la régulation.
  • C'est bon marché. Un microcontrôleur sans unité flottante calcule en virgule fixe, et c'est encore aujourd'hui la norme dans l'embarqué à bas coût.

Les deux limites qui ont imposé autre chose

Première limite : l'étendue est étriquée. Avec 16 bits en format 8.8, on couvre de 0 à 255,996 par pas de 1/256. Impossible d'y écrire la masse d'un électron (9×10−31 kg) ou la distance Terre-Soleil (1,5×1011 m). Pour couvrir les deux, il faudrait des centaines de bits, alors que chaque nombre pris séparément n'a besoin que de quelques chiffres significatifs.

Seconde limite : la précision est mal répartie. Le pas est constant, donc pour les petits nombres il est trop grossier et pour les grands il est inutilement fin. En format 8.8, la valeur 0,004 est indiscernable de zéro, pendant qu'on gaspille huit bits de décimales sur la valeur 200.

Ce qui compte dans un nombre réel, ce n'est pas le nombre de décimales : c'est le nombre de chiffres significatifs. La virgule fixe se trompe de grandeur à conserver.

La solution est celle que les scientifiques emploient depuis toujours avec la notation 1,5×1011 : séparer les chiffres significatifs de l'ordre de grandeur, et laisser la virgule se déplacer. C'est le sujet du chapitre suivant.

Ce qu'il faut retenir

  • Après la virgule, les positions portent les poids 0,5 ; 0,25 ; 0,125…
  • Partie entière : divisions par 2, restes de bas en haut. Partie fractionnaire : multiplications par 2, bits de haut en bas.
  • La virgule n'est pas stockée : sa position est une convention du programme.
  • Une fraction tombe juste en binaire si et seulement si son dénominateur est une puissance de 2.
  • Avantages : arithmétique entière, pas constant, circuits simples. Limites : étendue étroite et précision mal répartie.

Exercices d'application

Exercice 1

Convertissez 12,75 en binaire à virgule fixe.

Voir le corrigéMasquer le corrigé
Partie entiere : 12 = 1100

Partie fractionnaire :
0,75 x 2 = 1,5  ->  1   il reste 0,5
0,5  x 2 = 1,0  ->  1   il reste 0

Résultat : 1100,11.

Contrôle : 8 + 4 + 0,5 + 0,25 = 12,75. C'est juste.

Exercice 2

Que vaut 11010,1101 en base dix ?

Voir le corrigéMasquer le corrigé

Partie entière : 16 + 8 + 2 = 26.

Partie fractionnaire : 0,5 + 0,25 + 0 + 0,0625 = 0,8125.

Total : 26,8125.

Un repère pour contrôler ses calculs : les quatre bits 1101 valent 13, et 13/16 = 0,8125. Lire la partie fractionnaire comme un entier divisé par 2p est souvent plus rapide que d'additionner les poids un à un.

Exercice 3

Un capteur de température est codé en virgule fixe sur 12 bits, au format 8.4 (huit bits entiers, quatre bits fractionnaires). Quelle est l'étendue mesurable et quelle est la plus petite variation détectable ?

Voir le corrigéMasquer le corrigé

La partie entière, sur 8 bits non signés, couvre 0 à 255.

La partie fractionnaire, sur 4 bits, prend les valeurs 0 à 15 seizièmes, soit un pas de 1/16 = 0,0625.

L'étendue est donc 0 à 255,9375, par pas de 0,0625 °C.

Une variation de 0,03 °C est invisible pour ce capteur : elle est inférieure au pas. Et ce pas est le même à 2 °C qu'à 200 °C, c'est exactement la rigidité que la virgule flottante viendra corriger.

Exercice 4

Essayez de convertir 0,3 en binaire. Que constatez-vous après six multiplications ?

Voir le corrigéMasquer le corrigé
0,3 x 2 = 0,6  ->  0   reste 0,6
0,6 x 2 = 1,2  ->  1   reste 0,2
0,2 x 2 = 0,4  ->  0   reste 0,4
0,4 x 2 = 0,8  ->  0   reste 0,8
0,8 x 2 = 1,6  ->  1   reste 0,6  ← deja vu
0,6 x 2 = 1,2  ->  1   reste 0,2

Au cinquième tour, le reste 0,6 réapparaît. Or le reste détermine entièrement la suite : à partir de là, les quatre bits 1001 vont se répéter indéfiniment.

0,3 = 0,0(1001) en base deux, la parenthèse indiquant la période. Le développement ne se termine jamais.

Puisque la mémoire est finie, il faudra couper quelque part, donc arrondir. C'est le sujet du chapitre 8.

Posez le calcul sur une feuille avant d'ouvrir le corrigé : le codage s'apprend au crayon, pas en lecture.

Questions / Réponses

Aucune question. Soyez le premier à poser une question.
★ ★ ★ ★ ★
2 votes. Moyenne 5 sur 5.

Ajouter un commentaire

Anti-spam