|
Rappelons
ce qu'est la notation scientifique des nombres réels :
En
"notation scientifique" dite "à virgule
flottante"
- 0,006234 s'écrit
- 6.234 e- 3 ou
- 6.234 E- 3
Cette
notation est l'équivalent de :
-
6,234 . 10- 3

|
Observons
bien la manière dont on construit ce format à partir
d'une expression quelconque d'un nombre.
Prenons deux exemples de nombres écrits en base décimale
:
- 0,007123456789
et +54321,123456
- On
retient le signe du nombre.
Et on ne s'interesse d'abord qu'à la valeur absolue.
- On
met le nombre sous forme de deux facteurs.
- Un
nombre de l'intervalle [1,9]
7,123456789
pour le premier
5,4321123456
pour le second
- Une
puissance de 10 ramenant le produit à sa
valeur initiale.
7,123456789
×10-3 pour
le premier.
5,4321123456
×10+4
pour le second.
- On
rétablit le signe.
-7,123456789
×10-3 pour le premier
+5,4321123456
×10+4 pour le second.
- On
remplace, 10 par E (ou e) suivis de la caractéristique.
-7,123456789
E-3 pour le premier
+5,4321123456
E+4 pour le second.
|
Le nombre
intermédiaire de l'intervalle [1,9]
s'appelle la mantisse
.L'exposant
de la puissance de 10 est appelé la caractéristique.
Ce dernier mot tombe actuellement en déssuétude.
Exemple en
binaire.
Nb =
-1010 1101,1011 0110
Mantisse de |Nb| = 1,010 1101 1011 0110
Caractéristique : + 7
Nb = - 1,010 1101 1011 0110 × 2+7 |
|
Notons que
la mantisse comporte une partie entière et
une partie fractionnaire.

Exemple
: -7,123456789 E-3
7 est la
partie entière de la mantisse,
123456789
est sa partie fractionnaire.
|
|
Nombre
zéro en virgule flottante.
Rien
n'interdit de représenter le nombre zéro
par un flottant dont la parties entière et fractionnaire
sont nulles
ainsi que la caractéristique.
n = 0 x 100 = 0 x 1 = 0
Mais
cette forme du zéro pose des problèmes dans les standards
de représentation binaire
des nombres dans les mémoires des machines informatiques.
Notamment dans les formats 32 et 64 bits du standard IEEE.
|
Nous
allons maintenant voir comment on implémente ce format
de notation dans un ordinateur.
|
Quelques
exemples de formats binaires à virgule flottante
à 32, 64 et 80 bits
Respectivement 4, 8 et 10 octets
|
Utilisé
pour le type "float" (simple précision)
Utilisé
pour le type "double" (double précision)

|
Les
formats à 32 et 64 bits ignorent la partie entière de la
mantisse.
Le format à 80 bits mémorise la mantisse avec sa partie
entière
Schéma
de représentation des nombres en virgule flottante et en représentation
binaire

|
Détails
d'implémentation des nombres en virgule flottante
au niveau de leur représentation binaire.
Normes
IEEE
|
Partie
fractionnaire
La partie fractionnaire
du nombre obtenu après avoir déplacé
la virgule du nombre initial,
de manière à ne laisser subsister qu'un seul chiffre
à gauche, différent de zéro.
Pour un nombre écrit en binaire, ce chiffre est invariablement
"1"
Exemple :
Si le nombre écrit en binaire est :
0000 1010,0110
Après déplacement de la virgule de 3 rangs à
gauche : 1,0100110
La partie fractionnaire est : 0100110
Le
"1"
à gauche du zéro est omis de la représentation
IEEE.
Il est "implicite" car en binaire ce chiffre est toujours
le même : "1" pour tous les nombres.
Sauf, me direz-vous le zéro, cas particulier sur lequel
nous reviendrons plus loin.
|
|
Exposant
Attention ! la valeur de l'exposant
dans l'écriture du nombre en virgule flottante
et celle de l'exposant dans le format IEEE,
ne sont pas les mêmes !
L'exposant
permet de déterminer de combien de rangs
il faut déplacer la virgule
se trouvant à gauche de la partie fractionnaire
et dans quel sens (droite ou gauche) après
rétablissement du "1" implicite,
pour obtenir le nombre à représenter.
Pour
mesurer ce déplacement, tantôt
positif tantôt négatif, on
aurait pu penser à écrire l'exposant
dans la
"convention du complément à
2"
Ce n'est pas le cas. Les structures internes des machines numériques
s'accomodent mieux de la convention suivante.
Soit
D le nombre entier algébrique mesurant le déplacement
de la virgule
Soite E la valeur de l'exposant, par définition
on pose :
E = D + B
E
= valeur
de l'exposant considéré comme entier positif
D
= déplacement
algébrique de la virgule
B
= une constante appelée décalage (Bias
en anglais)
ou
D
= E - B
|
B
(le décalage ou bias) est une constante de valeur :
|
Décalage
(ou Bias)
B = 2n-1 - 1
|
Calcul
de B

|
Pour
éclairer cette définition.
nous vous proposons deux exemples.
Traduisons
en binaire format flottant simple précision 32 bits
( float )
le nombre : - 1039,0 (écrit ici en décimal)
Occupons-nous
d''abord de sa valeur absolue 1039,0.
Pour traduire ce nombre (il est entier dans ce premier exemple)
en binaire
nous passons par son écriture hexadécimale :
1039
décimal = 40F héxadécimal
= 0000 0100 0000 1111binaire
Nous
constituons la partie fractionnaire : 1, partie fractionnaire
0000
0100 0000 1111 = 1,00 0000 1111 . 210
( 210 décale la virgule de dix chiffres
vers la droite )
Nous
étendons la partie fractionnaire à 23 bits
|
1,00
0000 1111 =
1,00
0000 1111 0000 0000 0000 0
Rangé autrement :
1,000
0001 1110 0000 0000 0000
Partie fractionnaire sur 23 bits =
000 0001 1110
0000 0000 0000
(on ne mémorise pas le 1 implicite d'avant
la virgule)
|
Nous
constituons le décalage IEEE en simple précision
8 bits : 28 - 1 - 1 = 127
Nous
constituons l'exposant : exposant = 10 + décalage
= 137
137
décimal = 1000 1001 binaire
Voici
le résultat : bit de signe - exposant - partie fractionnaire
|
Bits
|
31
|
30
|
29
|
28
|
27
|
26
|
25
|
24
|
23
|
22
|
21
|
20
|
19
|
18
|
17
|
16
|
15
|
14
|
13
|
12
|
11
|
10
|
9
|
8
|
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
| |
1
|
1
|
0
|
0
|
0
|
1
|
0
|
0
|
1
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
1
|
1
|
1
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
En
héxadécimal C4 81 E0 00
Le
bit de signe (bit b31) positionné à 1 indique un nombre réel négatif
!
L'opposé
de -1039,0, soit 1039,0, s'obtient en mettant le bit de signe
b31 à 0
+
1039,0 se code 44 81 E0 00 en héxadécimal
|
|
Second
exemple
Traduisons
en binaire format flottant simple précision 32 bits (
float )
le nombre : x = - 6,625 (écrit ici en décimal)
Occupons-nous
d''abord de sa valeur absolue 6,625
Traduisons ce nombre en binaire :
6,625 décimal = 110,1010 binaire
c.f. " Virgule fixe" :
Nous
mettons ce nombre sous la forme : 1, partie fractionnaire
110,1010
= 1,101010 . 22
( 22 décale la virgule de 2 chiffres vers la
droite)
Nous
étendons la partie fractionnaire à 23 bits
1,101010
= 1,1010 1000 0000 0000 0000 000
partie fractionnaire sur 23 bits = 101 0100 0000 0000 0000 0000
(on ne mémorise pas le 1 implicite d'avant la virgule)
Nous
rappelons le décalage IEEE en simple précision 8 bits
: 28 - 1 - 1 = 127
Nous
constituons l'exposant : exposant = 2+ décalage =
129
129
décimal = 1000 0001 binaire
Voici
le résultat : bit de signe - exposant - partie fractionnaire
|
Bits
|
31
|
30
|
29
|
28
|
27
|
26
|
25
|
24
|
23
|
22
|
21
|
20
|
19
|
18
|
17
|
16
|
15
|
14
|
13
|
12
|
11
|
10
|
9
|
8
|
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
| |
1
|
1
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
1
|
0
|
1
|
0
|
1
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
En
héxadécimal C0 D4 00 00
Le
bit de signe (bit b31) positionné à 1 indique un nombre réel négatif
!
L'opposé
de - 6,625, soit + 6,625, s'obtient en mettant le bit de signe b31
à 0
+
6,625 se code 40 D4 00 00 en héxadécimal
|
Correspondance
Exposant - Décalage - Déplacement
E
= valeur de l'exposant dans l'implémentation IEEE
D = déplacement
de la virgule pour rétablir le nombre.
B =
2n-1-1
= Décalage (bias)
En
rouge les diverses valeurs numériques décimales
pour n = 8 bits
valeur pour laquelle le décalage (bias) est B
= 28-1-1=127 .
Seules quelques valeurs sont affichées.
|
E
|
0
|
1
|
... |
B
|
B+1
|
... |
2n-2
|
2n-1
|
|
E
|
0
|
1
|
... |
127
|
128
|
... |
254
|
255
|
|
D
|
-
B
|
-B+1

|
... |
0
|
1
|
... |
2n-1-1
|
2n-1
|
|
D
|
-127
|
-126
|
... |
0
|
1
|
... |
127
|
128
|
|
2D
|
2-B
|
2-(B-1)
|
... |
0
|
2
|
... |
2 ^ (2n-1-1)
|
2 ^ (2n-1)
|
| |
|
128
valeurs D > 0
|
Comme nous allons le voir, les colonnes extrêmes grisées
de ce taleau
correspondent à des nombres d'exception.
|
|
Exceptions
|
Représentation
du zéro.
La
règle de formation de la partie fractionnaire dans le format IEEE
impose que l'on déplace la virgule à droite du
bit à "1" le plus signifiant (de plus grand
poids)
dans le nombre binaire initial.
Exemple : 0,001 0000 1110 sera transformé
en:1,
0000 1110 x 2-3
Cette
méthode est inopérante pour un nombre nul.
C'est la raison pour laquelle on est convenu d'attribuer aux positions
extrêmes du tableau précédent
des interprétations particulières.
|
Le
zéro sera représenté
par un exposant E nul et une partie fractionnaire F nulle.
E = 0 ; F = 0
|
L'ennui
est que si on en reste là, ces valeurs représentent
déjà un autre nombre.
En effet, suivant notre règle de formation du format IEEE,
on rétablit le "1" implicite
et le tableau précédent vous indique un déplacement
de - B.
Ce n'est autre que : 1,000...x 2-B
D'où
la règle : (
F étant la partie fractionnaire)
|
E
= 0
|
|
F
= 0
|
représente les deux zéros ± 0 (n'oubliez
pas le bit de signe) |
|
F # 0
|
sont
déclarés nombres hors norme, dénormalisés |
C'est
la raison pour laquelle nous avons grisé la colonne la
plus à gauche du précédent tableau.
|
Autres
réattributions
Il
est indispensable que le format d'enregistrement d'un nombre
puisse mémoriser une impossibilité de calcul ou
un résultat infini
survenus lors de son calcul..
On
se sert pour cela des nombres correspondant à la colonne
la plus à droite du tableau précédent.
C'est-à-dire
pour : E = 2n-1
E
= 2n-1 (Max
de E) 
|
|
F
= 0
|
Nombres
infinis (±) Nommés INFINITY
en informatique. |
|
F
# 0
|
Non-Nombres,
notés NaN
(Not a Number, voir ci-dessous) |
Remarquez
que les NaN et les INFINITY n'ont que des "1" dans leur
exposant.
N'oublions
pas que ces représentations binaires
sont directement traitées par des ordinateurs qui n'éprouvent
aucune difficulté à déceler
et traiter ces exceptions.
Le format NaN est souvent utilsé
pour les programmes
pour enregistrer une mauvaise saisie d'un nombre comme par exemple
: 12,45U.
Le format INFINITY est souvent utilisé pour enregistrer
le résultat d'une opération
telle qu'une division par zéro.
|
|
Les
nombres ne faisant pas exception
(normalisés IEEE)
1
< E < 2n -2 
|
|
Partie
fractionnaire F quelconque.
|
Tableau
des nombres normalisés IEEE
(le précédent sans les colonnes extrêmes)
Seules
quelques valeurs sont affichées.
|
E
|
1
|
2
|
... |
B
|
B+1
|
...
|
2n-3
|
2n-2
|
|
E
|
1
|
2
|
...
|
127
|
128
|
...
|
253
|
254
|
|
D
|
-B+1
|
-B+2
|
...
|
0
|
1
|
...
|
2n-1-2
|
2n-1-1
|
|
D
|
-126
|
-125
|
...
|
0
|
1
|
...
|
+126
|
+127
|
|
2D
|
2-(B-1)
|
2-(B-2)
|
...
|
0
|
2
|
...
|
2 ^(2n-1-2)
|
2 ^(2n-1-1)
|
|
Les
nombres normalisés les plus proches de zéro
En valeur absolue :
Obtenus pour
E = 1
D
= 2 -2n-1
et F
= 0
nombres
= ± 1,0 x 2D

|
Les
nombres normalisés ayant la plus grande valeur absolue
Obtenus
pour E
= 254
D
= 2n-1-1
et F
= 1111....1111
nombres
= ± 1,1111...1111 x 2D

|
Les
nombres dénormalisés
Comme lindique
un tableau précédent, ils correspondent à
E = 0
et F
# 0
On doit interpréter
ces nombres comme ayant une partie entière égale
à zéro
et une partie fractionnaire F non nulle.
Même le déplacement D est réattribué.
On ne prendra pas la valeur D = -
B = - ( 2n-1-1 )
comme
on aurait pu l'induire de l'observation du tableau,
mais la valeur D
= -B+1
= -2n-1 +2
par mesure de continuité avec les nombres normalisés.:
±
0,F
× 2-D
avec
F#0 et D = -2n-1+2
= 2-2n-1
Exemple
du format IEEE 32 bits
L'exposant a
n = 8 bits, et D = -126
---
Valeur absolue maxima d'un nombre dénormalisé :
Val. abs. max. = 0,1× 2 -126 = 2 -127
=
5,8774717541114375398436826861112e-39
---
Valeur absolue minima d'un nombre dénormalisé :
Val. abs. min. = 0,000...001 × 2 -126
La partie fractionnaire ayant 23 bits dans ce format,
0,000...001 = 2 -23
Val.
abs. min. = 2 -23 × 2 -126 = 2 -149
=
1,4012984643248170709237295832899e-45
J'arrête
là pour aujourd'hui


|
|