Binaire : travail sur les réels

Nous avons vu (dans la partie "codes binaires") comment représenter des nombres entiers positifs en binaire.
Mais les nombres ne se limitent pas à cette catégorie, et comment pouvons nous coder des nombres négatifs ou des fractions en binaire, alors que nous n'avons à notre disposition que deux états (0 et 1) ?

Les différentes solutions appliquées dans le monde informatique utilisent une partie des bits pour coder les informations relatives au nombre utilisé.
Il est dès lors très important que la série de bits soit interprétée convenablement (que les règles soient identiques), sinon une série de bits peut prendre différentes valeurs.

Magnitude du signe

Cette expression est utilisée pour désigner le fait que l'on réserve un bit pour coder le signe. Par exemple, sur 4 bits nous pouvons coder en binaire 16 valeurs, de 0 à +15.

Si nous employons la magnitude du signe, nous pouvons coder 15 valeurs de -7 à +7 :

  • de 0 (0000) à -7 (0111)
  • de 0 (0000) à +7 (1111)

Le problème avec ce type de représentation est que la valeur 0 pourrait utiliser aussi bien le code binaire 1000 que 0000. Nous perdons donc une valeur à coder.

Notation excess symétrique

Un des moyens de représenter des nombres négatifs est la représentation excess.
Chaque valeur est codée sur un nombre de bits identiques, nous parlerons donc de notation excess8, excess16, etc.

Le bit de poids le plus significatif détermine le signe du nombre à coder, nous perdons un élément pour la représentation de la valeur maximum.
Normalement, avec 4 bits, nous pouvons coder 16 valeurs différentes de 0 à +15.
En excess8, sur nos 4 bits, nous pouvons coder 16 valeurs différentes de -8 à +7.

« Excess8, j'dois pas avoir 8 bits ? »

Non, généralement, le chiffre qui suit le terme excess est la valeur du MSB [“Most Significant Bit”[1]].
Dans le cas de 4 bits, la valeur du bit de poids le plus fort est 8, nous parlons donc de notation excess8.
Dans le cas de 5 bits, la valeur du bit de poids le plus fort est 16, nous parlons donc de notation excess16, etc.

Mais ce n'est pas une règle ! Ce moyen de procéder permet de répartir de manière plus ou moins égale les nombres positifs et les nombres négatifs, mais il est des situations où il est préférable d'avoir plus de nombres négatifs que de positifs, ou inversement. A ce moment, nous ne sommes plus en excess symétrique (la valeur excess ne correspond plus à la valeur du MSB).

Représentation excess8

Représentation
binaire
Valeur décimale
si excess8
Valeur décimale
si binaire simple
 0 000-80
 0 001-71
 0 010-62
 0 011-53
 0 100-44
 0 101-35
 0 110-26
 0 111-17
 1 00008
 1 00119
 1 010210
 1 011311
 1 100412
 1 101513
 1 110614
 1 111715

Astuce

Si nous devons coder en excess, la valeur du MSB est le chiffre qui suit la notation (exemple : excess8).
En ajoutant le signe - devant cette valeur, nous avons la valeur la plus basse, codée sous la forme d'une suite de 0.
Ensuite, la progression est la même que pour le binaire pur, jusqu'au bout.
Au moment où le MSB est à 1, et le reste à 0 nous avons la représentation de la valeur 0.
A la fin, nous avons une suite de 1 qui correspond à la valeur maximum du MSB moins un (dans notre cas : 8-1=7)

Synthèse

En codage excess symétrique, le MSB détermine le signe :

  • 1 pour les nombres positifs.
  • 0 pour les nombres négatifs.

La valeur 0 est considérée comme positive.

 

Notation Excess asymétrique

Une grande partie des règles applicables à la notation excess symétrique ne conviennent plus dans ce cas :

  • Il n'est plus possible de déterminer le signe selon la valeur du MSB.
  • La valeur qui suit le terme excess n'est plus la valeur du MSB.
  • La répartition des positifs et des négatifs ne se fait plus de manière égale.

Exemple : représentation excess 3

Représentation
binaire
Valeur décimale
si excess3
Valeur décimale
si binaire simple
0000-30
0001-21
0010-12
001103
010014
010125
011036
011147
100058
100169
1010710
1011811
1100912
11011013
11101114
11111215

 

Notation en complément à 1

Méthode

Chaque bit du nombre binaire est inversé pour représenter un nombre négatif.

Remarque : la valeur 0 est représentée de deux manières (tout des 1, ou tout des 0). Nous perdons donc la possibilité de codage d'une autre valeur. Avec 4 éléments binaires, nous pouvons coder de la valeur -7 à la valeur 7.

Exemples :

Représentation
binaire
Valeur décimale
si compl à 1
Valeur décimale
si binaire simple
 1 000-78
 1 001-69
 1 010-510
 1 011-411
 1 100-312
 1 101-213
 1 110-114
 1 111015
 0 00000
 0 00111
 0 01022
 0 01133
 0 10044
 0 10155
 0 11066
 0 11177

 

Notation en complément à 2

Le problème avec une notation excess est que toutes les valeurs doivent être traduites.
Si nous inversons le principe de codage du signe, nous avons un 0 pour coder les positifs, et un 1 pour coder les négatifs.

En binaire comme en décimal, placer un 0 devant l'élément de plus forte valeur n'affecte pas cette valeur.
Nous ne devons plus traduire les valeurs positives, il suffit de placer un 0 devant la valeur à coder.

Représentation
binaire
Valeur décimale
si compl à 1
Valeur décimale
si binaire simple
 1 000-88
 1 001-79
 1 010-610
 1 011-511
 1 100-412
 1 101-313
 1 110-214
 1 111-115
 0 00000
 0 00111
 0 01022
 0 01133
 0 10044
 0 10155
 0 11066
 0 11177

Méthode

Il existe différentes méthodes de conversions en complément à 2 pour les valeurs négatives (pas besoin de transformer les valeurs positives) :

1. Valeur négative

1. Valeur négative

Avec 4 bits, nous pouvons coder 16 valeurs.
A cette valeur, nous devons ajouter la valeur négative à coder.

Exemple : coder -3 en complément à 2 sur 4 bits :

  • 16 -3 = 13
  • 1101(2)= 13(10)
  • 1101(2 compl à 2)= -3

2. Porte logique

Coder la valeur en binaire pur, appliquer une porte NOT, ajouter 1 au résultat.

Exemple : coder -3 en complément à 2 sur 4 bits :

OpérationReprésentation
binaire
30011
NOT 31100
+10001
Résultat:1101

3. Cherchez le 1...

Ecrire la valeur en binaire pur.
Parcourir les bits du LSB [“Lower Significant Bit”[3]] vers le MSB :

  • tant que le bit est à 0, ne rien changer.
  • le premier bit à 1 reste inchangé.
  • inverser les autres bits jusqu'au MSB.

Exemple : coder -4 en complément à 2 sur 4 bits :

Représentation binaire de 4 :0100
MSB=<LSB1=<=<
Résultat:1100

Synthèse

En complément à 2, le MSB détermine le signe :

  • 0 pour les nombres positifs (pas de modification de la valeur).
  • 1 pour les nombres négatifs.

La valeur 0 est considérée comme positive.

 

Overflow

Nous savons tous qu'en binaire pur, il est possible de coder la valeur +15 sur 4 bits.
Si nous utilisons un élément sans savoir qu'il travaille en excess ou en complément à 2 pour coder les valeurs, nous risquons d'avoir des surprises.
Imaginons que nous désirons introduire la valeur 12 en 4 bits (1100) :

  • si la valeur est traitée en binaire, pas de problème, le résultat est 12.
  • si la valeur est traitée en excess8, le résultat est 4.
  • si la valeur est traitée en complément à 2, le résultat est -4.

Autres exemples :

Prenons 3 éléments pour coder un nombre décimal : nous avons 1000 valeurs, de 000 à 999.

L'utilisation de deux nombres corrects (qui entrent dans cet espace entre 000 et 999) dans une opération peut générer un nombre qui ne respecte pas cet espace.

600 + 600 = 1200 => “overflow” (en français, « dépassement de capacité ») car le codage nécessite 4 éléments décimaux au lieu de 3.
003 - 005 = -2 => “overflow”[6] car le codage nécessite un élément non prévu pour déterminer que le nombre est négatif.
050 * 050 = 2500 => “overflow”[7] car le codage nécessite 4 éléments décimaux au lieu de 3.
007 / 002 = 3,5 => “overflow”[8] car le codage nécessite une virgule non prévue (codage d'entiers positifs seulement).

L'“overflow”[9] est un dépassement de mémoire, car le nombre de bits que nous avons à notre disposition est insuffisant pour coder l'information.

 

Les fractions binaires

De même que pour les nombres négatifs, la notation en virgule flottante utilise certains bits pour l'information, au détriment des bits de valeur.
Pour un octet, le principe est le suivant :

  • Un bit (sign bit) est réservé pour déterminer le signe.
  • 3 bits (exponent bits) sont réservés pour placer la virgule (le point en anglais, d'où l'appellation "floating point").
  • 4 bits (mantissa bits) sont réservés pour coder la valeur.

! La notation en virgule flottante utilise les deux notations vues préalablement :

  • Complément à 2 pour le bit de signe.
  • Excess pour l'exposant.
    • Exposant égal à 0 : 0.mantisse
    • Exposant positif : déplacement du point vers la droite.
    • Exposant négatif : déplacement du point vers la gauche.

Exemples

Pour nos exemples, nous travaillerons à chaque fois sur un octet.

10111100 => 1 011 1100

  • bit de signe : 1 => valeur négative
  • exposant : 011 => 3-4 = -1 (Excess)
  • mantisse : 1100 => 0.01100 = 1/4 + 1/8 = 3/8

10111100 => -3/8

01101011 => 0 110 1011

  • bit de signe : 0 => valeur positive
  • exposant : 110 => 6-4 = 2 (Excess)
  • mantisse : 1011 => 10.11 = 2 + 1/2 + 1/4 = 2,75

01101011 => 2,75

Round-off errors

Nous parlerons d'erreurs d'arrondi (round-off) lorsque nous désirerons par exemple coder la fraction 1/3.
Nous pouvons coder les puissances de 2 telles que 1/2, 1/4, 1/8, mais pas 1/3.
Le résultat sera donc approximatif, et nous perdons une partie de l'information.

 

Document créé le 14/02/04 12:17, dernière modification le 23/03/18 10:27
Source du document imprimé : https://www.gaudry.be/binaire.html

L'infobrol est un site personnel dont le contenu n'engage que moi. Le texte est mis à disposition sous licence CreativeCommons(BY-NC-SA). Plus d'info sur les conditions d'utilisation et sur l'auteur.

Notes

  1. a,b,c,d,e,f… 7 en plus… Most Significant Bit : correspond à « bit de poids significatif” en français

  2. a,b,c,d,e,f… 6 en plus… MSB : “Most Significant Bit” (en français, « bit de poids significatif »)

  3. a,b,c Lower Significant Bit : correspond à « bit de poids faible” en français

  4. a,b LSB : “Lower Significant Bit” (en français, « bit de poids faible »)

  5.  overflow : correspond à « dépassement de capacité” en français

  6.  overflow : correspond à « dépassement de capacité” en français

  7.  overflow : correspond à « dépassement de capacité” en français

  8.  overflow : correspond à « dépassement de capacité” en français

  9.  overflow : correspond à « dépassement de capacité” en français