Dans la première partie du cours, nous avons appris à représenter des entiers naturels en représentation binaire ou hexadécimale.
Ainsi en utilisant des mots binaires de n bits, on peut coder nombres entiers.
Par exemple sur un octet, soit 8 bits, on peut coder valeurs soit dans le cas des entiers naturels des nombres de 0 à 255.
Cependant dans de nombreux programmes, il est nécessaire d'utiliser d'autres types de nombres comme les entiers relatifs ou les réels.
La façon la plus simple de procéder serait de réserver le bit de poids fort pour le signe(0 pour positif et 1 pour négatif), et de garder le rester pour la représentation de la valeur absolue du nombre.
Avec un codage utilisant des mots de n bits, on pourrait représenter des nombres entre et .
Par exemple, avec un codage sur 3 bits, des nombres entre -3 et 3:
Représentation binaire | Valeur décimale |
---|---|
000 | +0 |
001 | +1 |
010 | +2 |
011 | +3 |
100 | -0 |
101 | -1 |
110 | -2 |
111 | -3 |
Malheureusement cette représentation possède deux inconvénients. Le premier (mineur) est que le nombre zéro (0) possède deux représentations. L'autre inconvénient (majeur) est que cette représentation impose de modifier l'algorithme d'addition ; si un des nombres est négatif, l'addition binaire usuelle donne un résultat incorrect. Voir l'article de Wikipedia pour plus de détails
Cette méthode permet de remédier aux problèmes évoqués ci-dessus.
On utilise toujours un bit de signe tout à gauche, les entiers positifs sont codés normalement, cependant les entiers négatifs sont comptés à l'envers.
L'entier négatif x est codé comme s'il s'agissait de l'entier ou n est la taille du mot.
Par exemple, pour des mots de 3 bits:
Avec un codage utilisant des mots de n bits, on pourrait représenter des nombres entre et .
Par exemple, avec un codage sur 3 bits, des nombres entre -4 et 3:
Représentation binaire | Valeur décimale |
---|---|
000 | +0 |
001 | +1 |
010 | +2 |
011 | +3 |
100 | -4 |
101 | -3 |
110 | -2 |
111 | -1 |
On peut alors vérifier avec cette notation que l'algorithme d'addition utilisé pour les entiers naturels donne des résultats corrects avec cette représentation.
En fait plutôt que parler d'encodage des réels, on préfère parler de nombres à virgules(floating point en anglais), car il existe une infinité de réels infiniment proches les uns des autres, or en informatique, nous serons forcément limité dans l'étendue et la proximité des nombres à virgule.
Ainsi un calcul avec des nombres à virgule ne peut-être qu'approximatif. Cependant plus on augmente la taille du registre du processeur et plus nous pourrons représenter de valeurs, et plus nos calculs gagneront en précision.
On représente un nombre à virgule sous la forme:
« IEEE754
Format General » par GMjeanmatt — Travail
personnel. Sous licence CC BY-SA 3.0 via Wikimedia Commons.
Supposons un nombre flottant codé sur un octet utilisant 1 bit de signe, 3 bits pour l'exposant et
4 bits pour la mantisse: 1 101 1011
est le signe représenté par le bit de poids fort:
Notre codage représente donc un nombre négatif.
L'exposant a pour valeur 101
codé sur 3 bits, il doit être décalé de
. Ainsi,
puisque ,
l'exposant 101
correspond à un exposant de 5-3=2.
dans notre exemple, la mantisse est: 1011
, elle représentera le nombre:
Le code 1 101 1011
sur un octet utilisant 1 bit de signe, 3 bits pour
l'exposant et 4 bits pour
la mantisse représente donc:
L’IEEE 754 est une norme pour la représentation des nombres à virgule flottante en binaire. Elle est la norme la plus employée actuellement pour le calcul des nombres à virgule flottante dans le domaine informatique. Source Wikipedia
Cette norme définit notamment 2 formats pour représenter des nombres à virgule flottante:
Par GMjeanmatt — Travail personnel, CC BY-SA 3.0, Lien
Par GMjeanmatt — Travail personnel, CC BY-SA 3.0, Lien