Des notes destinées à éclaircir certains points
ou à apporter d'intéressants suppléments d'information
sont programmées pour apparaître lorsqu'on passe le curseur de souris
sur des icônes telles que
          
Pour des raisons de sécurité, certains navigateurs
bloquent l'apparition de ces notes (programmées en JavaScript) .
Des précieuses informations, exercices, réponses, aidant à comprendre,
à se repérer, à étendre ses connaisances sont alors perdues.

AUTORISEZ DONC VOTRE NAVIGATEUR A OUVRIR CES SCRIPTS !

Ce site n'a aucun but commercial !

Sommaire de la page
Sujets traités dans cette page
Lien local
Ecriture binaire des nombres réels à virgule fixe
Ecriture binaire des nombres réels à virgule flottante (Floating Point)
Formats utilisés en virgula flottante
Caractéristique - Mantisse
Représentation du zéro
Nombres particuliers INFINITY NaN (Not a Number)
Normes IEEE - Exceptions -
FLOPS - pétaFLOPS - hexaFLOPS

Pour revenir, cliquer sur
en haut ou bas de pge.

Représentation binaire
des Nombres Réels
Accueil

du site

Choix par Menu ou Parcours Séquentiel
Entiers Relatifs
  
Fin de cycle

 

Représentation des nombres réels dite "à virgule fixe"

En notation décimale, les nombres réels s'écrivent sous forme d'une partie entière et d'une partie décimale
séparées par une virgule: -1.106,578 par exemple.

Attention !
Dans la notation anglosaxonne les rôles des points et de la virgule sont intervertis.

-1.106,578 s'écrit -1,106.578  
(et même : 0,7
peut s'écrire : .7  )

Dans la suite, la notation non anglosaxonne sera préférentiellement utilisée.
Mais dans les exemples qui mettent en jeu des programmes de calcul à exécuter par la machine,
les données introduites et les résultats n'échapperont pas à la notation anglosaxonne...

Je rappelle la signification des décimales : par exemple dans (-1.106,578)

  • Le 5 représente 5 1/10
  • Le 7 représente 7 1/100
  • Le 8 représente 8 1/1000
  • etc

Et en binaire ?

On définit une notation semblable pour tout nombre binaire représentant un réel.

Exemple : le nombre 1010,101 représente la somme suivante :


Ici on divise par des puissances de 2 au lieu des puissances de 10 en décimal.

Soit, en écriture décimale : 8 + 2+ 0,5 + 0,125 = 10,625

Sous une autre forme :

On peut démonter rigoureusement que tout nombre réel positif inférieur à 1
pourrait être écrit de cette manière.
Resterait à décrire le signe, ce qui peut être fait par un bit particulier (bit de signe)
ou par une convention de type "complément à deux".
Beaucoup de ces variantes ont été utilisées dans les calculateurs.

Pour le nombre : 1010,101
1010 est la partie entière,
101  sa partie fractionnaire.

Soyons rigoureux !

Il vaut mieux dire ici "partie franctionnaire" que "partie décimale"
Car cette dernière dénomination ne se justifie que pour les nombres écrits sous forme décimale.
Notez qu'il n'existe pas de "nombres décimaux " mais seulement des "nombres réels écrits sous forme décimale".
Exemple du calcul inverse : traduire en binaire le nombre
78,347décimal

Partie entière : 78

Nous opérons une suite de divisions par 2 et retenons les divers restes.
Ces restes sont repris à l'envers

Partie fractionnaire : 0,347

Voici comment on peut procéder :



Pour plus d'explications cliquer ici :

Résultat final

78,347 (écrit ici sous forme décimale)
est égal à 1001110,0101100011 écrit en binaire.

Représentation binaire des nombres dans les calculateurs

Vu la constitution interne des systèmes informatiques,
les données sont représentées en binaire par des "mots" (words ) d'un certain nombre fixé de bits.
8 bits (rare) ou 16 ou 32 , 64, et même 80 bits (10 octets).
Les 32 bits (en 'simple précision') et 64 bits (en 'double précision')
s'imposent chez les constructeurs de microprocesseurs.


Imaginons que ce soir sur 16 bits pour simplifier.
Pour représenter les nombres réels en binaire on pourrait réserver un espace pour la partie entière du nombre
et un autre espace pour la partie fractionnaire.
Par exemple : XXXXXXXX,XXXXXXXX
C'est cela la représentation en virgule fixe (fixed point ).

Ce mode de représentation n'a que l'avantage de la simplicité !
Il est peu employé. vu ses inconvénients..

Quelques inconvénients...

L'espace réservé à la partie fractionnaire limite le nombre de bits reservés à la partie entière.
Ce qui est gênant pour représenter de très grands nombres,
pour lesquels la partie fractionnaire est généralement peu signifante.

Inversement, la précision sur de très petits nombres est limitée par le manque d'espace dans la partie fractionnaire
alors que pour ces nombres, la partie entière ne contient que des zéros.
Espace mal utilisé dans les deux cas.

La représentation dite "à virgule flottante" - Floating Point -
permet une bien meilleure préservation des chiffres significatifs
autant pour les grands que pour les petits nombres,
comme nous allons le voir ci-après.


Représentation "à virgule flottante"
Etant donné que dans la notation décimale des nombres réels, les anglosaxons inversent le rôle du point et de la virgule,
"virgule flottante" se traduira par "floating point"
Rappelons d'abord ce qu'est la notation scientifique des nombres réels :

En notation dite "scientifique"

-0,006234
s'écrit : -6,234 e-3 ou -6,234 E-3

Cette notation est équivalente à :

-6,234.10-3

Observons bien la manière dont on construit ce format
à partir d'une expression quelconque d'un nombre.

Prenons pour exemples :
-0,0071234567891 et +54321,123456

  1. On retient le signe du nombre.
    Et on ne s'interesse d'abord qu'à sa valeur absolue.

  2. On met le nombre sous forme de deux facteurs.
    1. Un nombre de l'intervalle [1,10 [   (10 non compris) appelé "Mantisse"
      7,1234567891  pour le premier
      5,4321123456 pour le second
    2. Une puissance de 10 ramenant le produit à sa valeur initiale.
      7,1234567891 ×10-3  pour le premier.
      5,4321123456 ×10+4  pour le second.
      La puissance de 10 est nommée"Caractéristique" ou "Exposant"
      ( Ici : -3 et +4 respectivement).

  3. On rétablit le signe.
    -7,1234567891 ×10-3 pour le premier
    +5,4321123456 ×10+4 pour le second.

  4. On remplace, 10 par E (ou e) suivis de la caractéristique.
    -7,1234567891 E-3  pour le premier
    +5,4321123456 E+4  pour le second.

Transposons cette même opération à l'écriture 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


Cet exemple binaire doit être bien compris pour aborder la suite.

Quel en est l'intérêt ?

Puis-je écrire le nombre binaire : 0,000000010110011
(0,005462646484375déc)
en virgule fixe dans un format binaire de 16 bits
(8 pour la partie entière, 8 pour la partie fractionnaire)
???

Bien sûr que non : des chiffres significatifs déborderaient à droite
au-delà de 8 bits après la virgule..
0,000000010110011

Imaginons maintenant un format binaire toujours à 16 bits très différent
où les 8 premiers bits à gauche (en bleu souligné) seraient dévolus à la caractéristique,
les 8 autres à la mantisse (en rouge non souligné).
XXXXXXXXXXXXXXXX

La mantisse (voir définition ) : 1,0110011 (8 bits)
Elle s'obtient ici en faisant glisser la virgule du nombre initial : 0,000000010110011
de 8 rangs vers la droite

La caractéristique doit donc être de -8déc ...
Comment écrit-on -8déc en binaire ?

8déc = 00001000bin
Complément à 1 = 11110111
Complément à 28 (on ajoute 1)= 11111000bin
-8déc = 11111000bin

Le nombre 0,000000010110011 s'écrit 1111100010110011
dans un format 16 bits (8 caractéristique, 8 mantisse) à virgule flottante


Ce format ne correspond à aucune norme,
il a été arbitrairement choisi pour la simplicité des explications.

Nous verrons plus bas les formats réels à 32, 64,et 50 bits.

Notons que la mantisse comporte une partie entière et une partie fractionnaire.

"Fractionnaire" ou "Décimale" ???

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
Notons que la mantisse comporte une partie entière et une partie fractionnaire.

"Fractionnaire" ou "Décimale" ???


Exemple : -7,123456789 E-3
7 est la partie entière de la mantisse,
123456789 est sa partie fractionnaire.

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, je vous propose deux exemples.

1° Exemple :

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

2° 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
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


FLOPS - pétaFLOPS

FLOPS signifie Floating Point Operations Per Second
Opérations en virgule flottante par seconde.

C'est une mesure de la rapidité d'exécution des opérations
par une unité centrale d'ordinateur.

Un pétaFLOP correspond à 1015 opérations en virgule flottante par seconde
Les performances : 2016 : 100 pétaFLOPS
On part (2017) à la chasse des l'exaFLOPS (1018)


 

Choix par Menu ou Parcours Séquentiel
Entiers Relatifs
  
Fin de cycle
"Numération"

Numération binaire et hexadécimale
Nombres Binaires naturels
Nombres Binaires relatifs
Représentation des Nombres réels
Représentation de caractères
Représentation d'états physiques
Représentation de grandeurs analogiques
Accueil

du Site