Notation à virgule flottante

Représentation des données: types et valeurs de base

Plan

Une première représentation

Comment noter un nombre décimal en binaire. Nous pourrions décider arbitrairement d’une position de la virgule dans les bits. Par exemple dans le modèle bbbb,bbbb on aurait 1010,0001. On décompose, 10102=23+21=1010 et 0001 serait ? Nous verrons plus loin comment calculer la partie décimale.

Prenons le nombre binaire 1,001. Faisons l’analogie avec un nombre décimal. Dans 7,8325 que signifie le chiffre 8, le chiffre 2 par rapport à notre base ? Pourquoi sont-ils à cette position….c’est le cours de 6ème ! Le 8 est le chiffre des dixièmes car 8 X 10-1 et le 2 ? C’est 2 x 10-3. Bref, le rang après la virgule est l’exposant négatif de la base.

Important: 7,8325 = 78325 / 104. La définition d'un nombre décimal est un nombre pouvant s'écrire sous la forme x / 10n. n est donc le nombre de chiffres après la virgule (x entier).

De binaire à base 10

Ainsi en binaire dans 1,001 ; le dernier chiffre signifie 1 x 2-3 =1/8=0,125.

Et 1,101 revient à 1+2-1+2-3=1,625

Mais si l'on rejoint la définition du nombre décimal en base 10, alors un nombre décimal binaire doit s'écrire sous la forme x/ 2n où n est le nombre de chiffres après la virgule, c'est ce que l'on appelle un nombre dyadique.

1,625 est donc un nombre dyadique puisque l'on peut l'écrire en binaire 1,101. On aurait aussi pu donc effectuer la conversion en disant que 1101=13 et 23=8 donc 1,101=13/8=1,625 !

13/8=(8+4+1)/8 soit 8/8 + 4/8 + 1/8 soit 1 + 1/2 + 1/8=1+1/21+1/23 donc 13/8 s'écrit en biniaire 1,101. Tous les nombres de la forme m/2n où m et n sont entiers sont donc des nombres dyadiques.

Exercice :

Ecrire les nombres binaires de 1,000 à 1,111 en décimal

De base 10 à binaire

Si l’on veut écrire 1,375 ? Dans 0,375 peut-on mettre 2-1=0,5 non. Donc notre écriture commence par 1,0.

Il reste donc 0.375. Est-ce que 2-2=0.25 rentre dedans ? Oui, notre écriture est donc 1,01 et il reste 0.375-0.25=0.125.

Est-ce que 2-3=0.125 rentre dedans ? Oui, notre écriture est donc 1,011 et il reste 0.

Une deuxième méthode consiste à multiplier par deux, garder la partie décimale pour recommencer et la partie entière forme la partie décimale du nombre binaire.

0.375 x 2 = 0,750 on en est donc à 1,0 et on travaille avec 0,750

0,750 x 2 = 1,5 on en est donc à 1,01 et on travaille avec 0,5

0,5 x 2 = 1 on en est donc à 1,011 et il n’y a plus rien à faire puisqu’il nous reste 0.

Entrainez vous avec la méthode de votre choix sur :

13,29687 et 4,515625

Tapez ce calcul: 0,1+0,2 dans l’idle de python, surprenant non ? Vous allez pouvoir l’expliquer !

Chercher l'écriture binaire de (0,1)10 (le nombre décimal 0,1 !) puis (0,2)10 et (0,3)10. Comparez 0,1+0,2.

Les nombres décimaux n'ont pas forcément de développement dyadique!

Donner l'écriture biniare de 1/3.

Cette notation a sa position de virgule 'fixe'. Si je dois écrire 0,0000000001235 ou 35 000 000 000 en binaire j'aurais des tonnes de zéros inutiles. L’écriture à virgule flottante va éviter ce problème.

L'écriture IEEE 754

L’écriture à virgule flottante va éviter ce problème en adoptant un modèle inspiré de la notation scientifique.

C'est pour cela que les nombres à virgule sont de type float en informatique. Voir ici pour plus de types de variables.. Vous pouvez vérifier en tapant type(3.2) dabs l'idle de python.

L’idée et d’écrire les nombres sous la forme 1,- - - - - x 2- - - - - - exactement comme pour l’écriture scientifique de 7892,3= 7,8923 x 103. Les pointillés seront les parties binaires à trouver.

Souvenez vous de cette remarque importante : en base 10, multiplier par 10 ou diviser par 10 revient à décaler la virgule de n rangs vers la droite ou la gauche. Il en est de même en base 2 ! Multiplier, diviser par 2 revient à déplacer la virgule vers la droite ou la gauche.

Pas convaincu ? Reprenez vos calculs précédents et comparer les valeurs décimales des nombres binaires 0,1 et 0,01 et 0,001.

Du coup : 0,001 = 1 x 2-3, logique et 10,11=0,1011 x 2-2

Puisqu’en binaire nous n’avons que deux chiffres, en ‘notation scientifique binaire’ nous aurons toujours 1 virgule et des 0 ou 1 ensuite. Puisque l’on sait que tous nombres sont de la forme 1, - - - - ; il est inutile de le noter ! C’est toujours un bit de gagné.

Le modèle Format IEEE 754-1985 Réels Normalisés, est de la forme :

S E E E E E E E E M….M sur 32 bits. (simple precision, la double précision c’est sur 64 bits)

Le S est le bit de signe. S’il vaut 1 le signe est négatif.

Les 8 chiffres E forment l’exposant

Les 23 M sont la mantisse. Ils représentent les chiffres après la virgule.

Vous notez que l’exposant n’a pas de bit de signe…ce qui pourrait être utile ! Une autre solution a été adoptée : le biais.

Pour pouvoir avoir des exposants négatifs, on soustrait 127 à la valeur de l’exposant. Puisque l’on est sur 8 bits, on a 256 valeurs de 0 à 255. Les valeurs de l’exposant iront donc de 255-127 à 0-127 soit 128 à -127 mais le 128 et le -127 seront réservés à des cas spéciaux. L’exposant ira donc de -126 à +127. De ce fait la précision est de 2-126, le plus petit nombre positif normalisé sera 2-126 = 10-13 (environ)

L'écriture IEEE 754: binaire vers réel

Exemple 1. Quelle est l’écriture décimale de

1 10000011 10111000000000000000

a) Correction 1ere méthode.

Le premièr 1 indique que l’on a un négatif.

Le 10000011 indique la valeur 28+21+20=131. On retranche 127 cela fait 4 pour l’exposant.

1, 10111000000000000000000 doit donc être décalé de 4 rangs :

11011, 1000000000000000000 = 24+23+21+20+2-1=27,5

Donc -27.5

b) Correction 2eme méthode

Le première 1 indique que l’on a un négatif.

Le 1001 indique la valeur 28+21+20=131. On retranche 127 cela fait 4 pour l’exposant.

La partie décimale est : 1, 10111000000000000000000=1+2-1+2-3+2-4+2-5=1,71875

1,71875 x 24 = 27,5

Avec le signe : -27.5.

c) Remarque : la soustraction de 127 peut être fait en binaire car 127 = 01111111. Ici on a :

 10000011
-01111111
00000100 qui fait bien 4.

L'écriture IEEE 754: réel vers binaire

Exemple 2

Ecrire 7,305 en virgule flottante. Le 7 c’est 4+2+1 donc 111

Le 0,305 :

0,305 x 2 = 0,610 donc 0,0
0,61x2=1,22 donc 0,01
0,22x2=0,44 donc 0,010
0,44x2=0,88 donc 0,0100
0,88x2=1,76 donc 0,01001
0,76x2=1,52 donc 0,010011
0,52x2=1,04 donc 0,0100111
0,04 x2 = 0,08 donc 0,01001110

Etc, on va s’arrêter là

On a donc une valeur approchée: 111, 01001 110000000000000000000
Soit 111, 01001 110000000000000000000x 22
2+127=129=10000001
L’écriture en virgule flottante de 7,305 est environ : 0 10000001 11010 011 000 000 000 000 000

Remarques

Si l’on avait calculé 0,305 qu’avec 4 chiffres binaires pour ne pas faire trop de calculs : on aurait 0,305 =0,0100. Faire attention on va compléter avec des zeros à droite. Alors que si l’exposant avec biais est 3=11, il faudra écrire 00000011 (on complète à gauche ! Soyez vigilants).

0,01000 0000 0000 0000 0000 donc cela donne 111, 01000 0000 0000 0000 0000 soit

1,11010 0000 0000 0000 0000

Au final :

0 10000001 11010 0000 0000 0000 000

La notation virgule flottante à double précision s'effectue sur 64 bits. L’exposant utilise 11 bits et la mantisse 52.

Le format IEEE754 rajoute des exceptions qui permettent d’écrire le dépassement (division par 0), un nombre plus ou moins infini et permet de gagner encore un chiffre après la virgule si le nombre est très petit par rapport à 0 ( Standard IEEE 754-1985 Échappements des formats)

Le standard spécifie pour les simple précision :

1) Si e = 255 et m ≠0 alors v est NaN (Not a Number) (dans ce cas l’exposant est 128 à cause du biais, rappelez vous cette valeur 128 interdite plus haut). Exemple de calculs qui donnent NaN ∞ − ∞ , 0 × ∞ , 0 0 , 1 , ∞ 0 .
2) Si e = 255 et m = 0 alors v est (-1)sx ∞
3) Si 0 < e < 255 alors v = (-1)s x 2 e-127 (1,m) notation normalisée vue plus haut
4) Si e = 0 et m ≠0 alors v = (-1)sx 2 x e-126 (0,m) (dénormalisé)
5) Si e = 0 et m = 0 alors v = (-1)s 0 (il y a deux écritures du zéro).
Lorsque e=0 alors l’exposant réel est -127 qui a été interdit dans la notation vue plus haut pour pouvoir être utilisé à ces nombres extrêmement petits.

 

Exercices

  1. Donner si possible l'écriture dyadique des nombres décimaux suivants: 3,25; 126/16; 4,5.
  2. Donner l'écriture décimale de (1,11001)2; (101,101101)2.
  3. Comment s'appelle la méthode qui permet d'écrire les très grands nombres, ou les nombres proches de zéro?
  4. Donner la valeur décimale du nombre écrit en IEEE 754: 0 01110110 11001010000000000000000
  5. Dans 0 01110110 11001010000000000000000, le premier 0 est? la partie 011110110 est? le reste est?

Android

De la programmation pour pc à la programmation pour téléphone.

A finir

Pas eu le temps de tout faire.....