publié le jeu. 23 novembre 2017

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 de n bits, on peut coder \(2^{n}\) nombres entiers.

Cependant dans de nombreux programmes, il est nécessaire d'utiliser d'autres types de nombres comme les entiers relatifs ou les réels.

Représentation des entiers relatifs

La façon la plus simple de proceder 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 \(-2^{n-1}-1\) et \(2^{n-1}-1\).

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

Notation en complément à deux

Cette méthode permet de remédier aux problèmes évoqués ci-dessus. Les entiers positifs sont représentés comme précédemment, par contre les entiers négatifs sont comptés à l'envers.

L'entier négatif x est codé comme s'il s'agissait de l'entier \(x + 2^{n}\) ou n est la taille du mot.

Par exemple, pour des mots de 3 bits:

$$(-1 = 2^3 -1 = 7)_{10} = 111_2$$
$$(-4 = 2^3 - 2^2 = 4)_{10} = 100_2$$

Avec un codage utilisant des mots de n bits, on pourrait représenter des nombres entre \(-2^{n-1}\) et \(2^{n-1}-1\).

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 réprésentation.

Représentation des réels

En fait plutôt que parler d'encodage des réels, on préfère parler de nombres à virgules, car il existe une infinité de rééls 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.

La norme IEEE 754

Dans cette norme, qui est la plus utilisée à l'heure actuelle, un nombre à virgule est représenté sous la forme:

$$s\ m \cdot 2^n$$

IEEE754 Format General.png
« IEEE754 Format General » par GMjeanmattTravail personnel. Sous licence CC BY-SA 3.0 via Wikimedia Commons.

Par exemple, un exposant ayant pour valeur 101 codé sur 3 bits doit être décalé de \(2^{2} - 1 = 3\). Ainsi, puisque \(101_2 = 5_{10}\), l'exposant 101 correspond à un exposant de 5-3=2.

Par exemple, si la mantisse est notée: 1011, elle représentera le nombre:

$$m = 1 + \frac{1}{2} + \frac{0}{2^2} + \frac{1}{2^3}+ \frac{1}{2^4} = 1,6875$$

Supposons le nombre suivant codé sur un octet utilisant 1 bit de signe, 3 bits pour l'exposant et 4 bits pour la mantisse: 1 101 1011

Ce codage représente un nombre négatif puisque le bit de signe est 1, soit le nombre:

$$- 1,6875 \cdot 2^{2}= -6,75$$

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 :

Elle définit enfin des notations pour les valeurs exceptionnelles \(+\infty\),\(-\infty\), et \(NaN\)(Not A Number):

Type Signe Exposant décalé Mantisse
Zéros 0/1 000...000 000...000
Infinis 0/1 111...111 000...000
NaN 0/1 111...111 différente de 0

Exemple: réaliser la conversion en base 2 de la valeur approchée de pi: 3.14159265359:

Comparer la précision obtenue dans les deux cas.