ChronoMath, une chronologie des MATHÉMATIQUES
à l'usage des professeurs de mathématiques, des étudiants et des élèves des lycées & collèges

Ordinateur, système binaire, codage et arrondis         
   
La notion élémentaire d'arrondi et de troncature | arrondis d'une somme, d'un produit, etc. | exemple dévastateur d'accumulation d'arrondis

L'arrondi produit par une calculatrice ou un ordinateur se traduit par une perte des chiffres significatifs (le dernier chiffre, voire les deux derniers, sont faux). Pour comprendre le problème, il nous faut étudier le codage informatique des nombres et tout particulièrement le système binaire qui fut préconisé dès 1936 par le français Louis Couffignal pour la réalisation de machines à calculer électromécaniques, ancêtres des ordinateurs. Sans oublier les travaux étonnants de Leibniz dans son Arithmétique binaire au moyen des seuls 0 et 1 publiés en 1703 !

Le bit : emplacement mémoire élémentaire & le bus de données :

Ce terme nous vient de l'anglais binary digit. (C. Shannon / J. W. Tukey). Il peut être activé (chargé électriquement) : on dit qu'il est à l'état 1, ou non activé (non chargé) : il est à l'état zéro. C'est le principe du système binaire (écriture en base 2).

Les systèmes de numération d'aujourd'hui et d'hier :

Tout nombre peut s'écrire en base 2 au seul moyen des symboles (chiffres) 0 et 1. L'écriture cherchée s'obtient par divisions euclidiennes successives par 2 tant que le quotient n'est pas 1. Par exemple, le nombre 19 :

19 / 2 

  q = 9 

  r = 1 (parité, r = 1, nombre impair)

9 / 2 

  q = 4 

  r = 1

4 / 2 

  q = 2 

  r = 0

2 / 2 

  q =

  r = 0 (4è division, 19 est de l'ordre de 24 = 16)

C'est dire que :

19 = 24 + 0 x 23 + 0 x 22 + 1 x 21 + 1 x 20

donc 19base 10 = 10011base 2

Supposons un ordinateur ne travaillant que sur 5 bits, le bit le plus "à gauche" étant le bit de signe, il ne reste que 4 bits pour les chiffres significatifs. Les données sont transmises entre mémoire et microprocesseur par l'intermédiaire de circuits électroniques : on parle de bus de données. Le nombre positif maximum sera obtenu avec des 1 partout, soit : 1 x 23 + 1 x 22 + 1 x 21 + 1 x 20. Ainsi, 1111base 2 = 15base 10.


Le nombre +13 en base 10

Dans toute la suite, pour éviter des confusions, le bit de signe (0 si positif ou nul, 1 si négatif) sera séparé des autres, constituant la mantisse, par le signe | (barre verticale).

Le problème est de savoir distinguer un entier positif d'un entier négatif et, ayant trouvé une convention, quelle sera la capacité de traitement de la machine :

 Le complément à 2 :

5 s'écrivant 0 | 0101, son opposé -5 doit s'écrire 1 | abcd où a, b, c et d sont éléments de {0,1}, de sorte que l'addition binaire de ces codes fournisse
0 | 0000. Il suffit d'échanger les 1 en 0 et d'ajouter (binairement parlant...) 1 : c'est ce que l'on appelle le complément à 2.

En effet, l'échange place des 1 partout dans la mantisse et l'ajout de 1 annule cette mantisse en produisant une addition binaire 1 + 1 = 10 (2 en binaire) dans le bit de signe qui devient 0 avec une retenue de 1, dont l'ordinateur est "prié" de ne pas tenir compte : l'entier négatif -5 s'écrit ainsi 1 | 1010 + 1 = 1 | 1011 , donc -5 + 5 = 0 | 0000.

Autres exemples :     

15 = 0 | 1111 
 -15 = 1 | 0000+1 = 1 | 0001
 1 = 0 | 0001
-1 = 1 | 1110 +1 = 1 | 1111
16 = 15 + 1 = 0 | 1111 + 0 | 0001  = 1 | 0000
-16 = -15 + (-1) = 1 | 0001 + 1 | 1111  = 1 | 0000

On a un problème en dernière ligne : 16 = -16. L'ordinateur vérifie le bit de signe dans 16 = 15 + 1. On aurait dû avoir un positif, donc il déclare overflow (dépassement de capacité).

Les bus de données actuels, les octets :

On voit donc qu'avec 4 positions on peut calculer jusqu'à 1111 (base 2) = 15 (base 10) en positif et -16 (base 10) en négatif.

En pratique, un bus de données contient au minimum 8 emplacements (8 fils), on appelle octet une telle séquence qui sert aujourd'hui de référence : cas des premières calculettes et micro-ordinateurs.

Avec un bus de données de 16 fils (2 octets) dont un bit pour le bit de signe, soit 15 + 1 positions on ira jusqu'à :

0 | 1111111 | 11111111    soit :  215 + 214 + ... + 23 + 22 + 2 + 1 = 32767

et en négatif jusqu'à -32767 - 1 = -32768.

Les "vieux" microprocesseurs dits 8 bits (1 octet) avaient des bus de transmission des informations (dialogue entre le microprocesseur et ses périphériques) de 16 bits : 8 pour le transfert dans un sens et 8 pour le retour. Le bus de données de tels ordinateurs monopolise 16 bits,  soit deux octets : l'autoroute est à sens unique en cas de transferts de données numériques.

Le célèbre Intel 80486 des années 1980 avait un bus de 32 bits. On en est maintenant (années 2000) à 64 bits, voire 128, ce qui permet sur des ordinateurs et des langages récents (JavaScript, par exemple, de travailler par défaut en ce que l'on appelait autrefois la double précision : 16 chiffres significatifs au lieu de 8.

   Testez le petit programme...

Autrefois, écrire en Basic, l'instruction : x% = 32800, provoquait une erreur puisque la variable x est ainsi déclarée entière (code %), mais x! = 32800 était acceptée car x est alors une variable simple précision codée sur 4 octets (code !).

En langage Pascal, on aura la même erreur si x est déclarée simplement integer. Il faut déclarer x en tant que variable entière double précision (long integer, en Pascal, code & en Basic ) : elle sera codée sur 4 octets (maximum : 2 147 483 647 = 231 - 1). Mais vous doublez ainsi la place mémoire occupée par votre programme et vous augmentez également les temps de calcul.

Quelques unités informatiques (Méga, Giga, Téra, Péta, Exa, Yotta) :    

Pour en savoir plus sur le codage binaire (et les processeurs) :

 Le système hexadécimal (base 16) :

Il faut savoir que pour des raisons pratiques (simplification de l'écriture), les informaticiens utilisent un système de représentation des nombres en base 16 (système hexadécimal) : il suffit de regrouper les digits binaires de droite à gauche par groupe de 4.

Un groupe vaudra au plus 15 (i.e. 1111 en binaire). Ainsi, on utilise une base de numération à 16 chiffres : 0 , 1 , 2 , 3 , ... , 9 , A , B , C , D , E et F.

Exemples : Il nous sera aisé d'écrire 32767 en base 16 :

0 | 0 1111111 | 11111111   : binaire

0 | 0 111 | 1111 | 1111 | 1111   : on réécrit par groupes de 4 bits), ce qui fournit :

0 |   7         F        F         F   : donc 32767 (base 10) s'écrit 7FFF en base 16.

Un entier négatif s'obtient alors directement par complément à F (15 en décimal). Ainsi : -32768 qui s'écrit en binaire :

1 | 000 | 0000 | 0000 | 0000  sachant que 1000 représente 8 en binaire

s'écrira 8000 en hexadécimal, on le note précédé de &h, soit : &h8000.

 Les erreurs d'arrondi :

On vient de le voir, la représentation interne d'un nombre est limité par le nombre de bits utilisés pour le stockage. Par suite, les erreurs de calcul de l'ordinateur peuvent être plus ou moins importantes suivant les machines. Il ne s'agit donc pas de bugs de votre machine ! Il faut savoir qu'un résultat affiché n'est pas celui qui est stocké dans les entrailles du microprocesseur.

Prenons le cas d'une calculatrice ou d'un micro-ordinateur de poche affichant 10 chiffres significatifs :

Si l'on tape, ... :
... on obtient :

17/13

 1.307692308

17/13-1

 0,3076923077

(17/13)*10-13

 0,0769230769

(17/130)*100-130

 0,769230769

On voit que le dernier chiffre (8) obtenu est un arrondi (800) de 769 : plus clairement 8.10-9 est un arrondi d'affichage d'un calcul interne égal à 7,69.10-9. Ce qui signifie que, par précaution, ces ordinateurs n'affichent pas deux chiffres risquant d'être entachés d'erreurs : affichage de 10 chiffres significatifs en calculant avec 12.

Étude théorique :           Accumulation d'erreurs d'arrondi :


© Serge Mehl - www.chronomath.com