CHAPITRE Représentation des nombres en langage informatique et conséquences La création de la numération est un des faits les plus marquants de l histoire de l humanité. Si la plupart des civilisations ont adopté le système décimal, c est qu il a toujours été naturel de compter sur ses doigts. Les chinois, quant à eux, comptaient jusqu à 00 000 sur une main et dix milliards sur les deux mains. Les Mayas, Aztèques, Celtes et Basques, sans doute plus sportifs, utilisaient eux les orteils, donc la base 0. Les Sumériens ont bizarrement utilisé la base 60, et les Romains la base Les ordinateurs et les programmes mémorisent, transmettent et transforment des données aussi variées que des grandeurs numériques (nombres, textes, code postal, entier relatif, pixels, images...) mais aussi des grandeurs analogiques (son, vitesse de rotation ). Pourtant, quand on les observe à plus petite échelle, les ordinateurs ne manipulent que des objets beaucoup plus simples : des 0 et des. Dans ce chapitre, nous verrons comment cette suite de 0 et de suffit à représenter la plupart des nombres (des entiers naturels aux nombres à virgule).. Représentation des nombres en langage informatique.. Les différentes bases de représentation possibles Les différentes bases de représentation Depuis le Moyen- Âge, on écrit les nombres en représentation décimale ou en base dix. Ainsi, pour écrire un entier naturel 𝑁 quelconque, on écrit, de droite à gauche, le nombre de paquets de un, le nombre de paquets de dix, le nombre de paquets de cent, le nombre de paquets de mille... Chacun de ces nombres étant compris entre zéro et neuf, seuls dix chiffres sont nécessaires : 0,,, 3, 4, 5, 6, 7, 8 et 9 Le choix de faire des paquets de dix est conventionnel : on aurait tout aussi bien pu décider de faire des paquets de deux, de huit, de douze, de vingt... Ainsi, lorsqu on décide de faire des paquets de deux, on écrit les nombres en base deux, ou représentation binaire, n utilisant que deux chiffres : 0 et Tous les nombres sont formés à partir de ces seuls deux chiffres et se prononcent chiffre par chiffre (par exemple, le nombre qui se représente par 4 en base dix se représente par 00 en base deux et se prononce un- zéro- zéro). Voici la liste des douze premiers nombres en représentation décimale et en représentation binaire : Base dix Base deux 0 0 0 3 4 5 6 7 8 9 0 00 0 0 000 00 00 0 00
Chapitre : Représentation des nombres Remarque : quand une suite de chiffres exprime un nombre dans une base différente de la base décimale, on indique la base en indice. Pour la base, on peut également souligner le résultat. Passage de la représentation décimale à la représentation binaire Pour passer de la base de représentation décimale à la base de représentation binaire, on effectue des divisions successives par du nombre en base dix, jusqu à obtenir 0 en quotient. On lit alors les restes successifs de droite à gauche et de bas en haut. Exemple : expression en base deux du nombre représenté par 3 en base dix Ainsi le chiffre qui s écrit 3 en représentation décimale s écrit 0 ou 0 en représentation binaire (à prononcer un- un- zéro- un). Passage de la représentation binaire à la représentation décimale Pour passer de la base de représentation binaire à la base de représentation décimale, on lit les bits de droite à gauche et on leur associe la puissance de correspondant à leur rang dans le nombre en base deux : Position du bit 0 3 4 5 6 7 8 Puissance de correspondante! =! =! = 4! = 8! = 6! = 3! = 64! = 8! = 56 Exemple : expression en base dix du nombre représenté par 000 en base deux Représentation, binaire,,, 0", 0" 0", Position,du,bit, 6" 5" 4" 3" " " 0" Puissance,de, deux, correspondante, Représentation, décimale,! " = 64"! " = 3"! " = 6"! " = 8"! " = 4"! " = "!! +!! + 0! +!! + 0! + 0! +!! " = 64 + 3 + 8 + " = 05"! " = " " Ainsi le chiffre qui s écrit 000 ou 000 en représentation binaire s écrit 05 en représentation décimale.
Chapitre : Représentation des nombres 3.. La représentation binaire : source du langage informatique La mémoire des ordinateurs est constituée d une multitude de circuits électroniques qui ne peuvent être que dans deux états : sous tension ou hors tension. On appelle ces états 0 et. Une telle valeur (0 ou ) est dite booléenne. On l appelle booléen ou bit (pour binary digit en anglais) et un circuit à deux états s appelle un circuit mémoire un bit. L état dans lequel se trouve un circuit mémoire un bit est représenté par le symbole 0 ou par le symbole. L état d un circuit composé de plusieurs de ces circuits est représenté par une suite finie de 0 et de. Par exemple, 00 (prononcer un- zéro- zéro) décrit l état d un circuit composé de trois circuits mémoire un bit, respectivement dans l état, 0 et 0. Les ordinateurs comptent donc naturellement en base deux et chaque circuit de l ordinateur représente un des deux chiffres de cette base : 0 ou. Dans la mémoire d un ordinateur, tous les chiffres sont donc écrits en représentation binaire. Les circuits mémoire un bit sont groupés par huit, définissant ce qu on appelle un octet. L ordinateur représente alors les nombres en notation binaire sur un, deux, quatre ou huit octets, soit 8, 6, 3 ou 64 bits. Nombre d octets utilisés 4 8 Nombre de bits correspondant 8 6 3 64.3. Représentation binaire des entiers naturels Nous venons de voir qu en langage informatique, les nombres sont représentés en base deux, en utilisant 8, 6, 3 ou 64 bits. Cela permet de représenter les nombres : - de 0 à :! = 56 nombres sur un octet donc 8 bits - de 0 à :!" = 65 536 nombres sur deux octets donc 6 bits - de 0 à =!" =4 94 967 96 nombres sur quatre octets donc 3 bits - de 0 à =!" =8 446 744 073 709 55 66 nombres sur huit octets donc 64 bits. Ainsi : Nombre d octets utilisés Nombre de bits correspondant Intervalle de nombres représentés en base 0 4 8 8 = 8 8 = 6 4 8 = 3 8 8 = 64 0 à 55 0 à 65535 0 à 49496795 0 à 84467440737095565.4. Représentation binaire des entiers relatifs Voyons maintenant comment étendre aux entiers relatifs la représentation binaire des entiers naturels que nous venons de voir. Une solution pourrait consister à réserver un bit pour le signe de l entier et à utiliser les autres pour représenter sa valeur absolue : on coderait alors la valeur absolue sur 7, 5, 3 ou 63 bits. Cependant, cette méthode a plusieurs inconvénients (notamment l existence de deux zéros, l un positif et l autre négatif).
4 Chapitre : Représentation des nombres On préfère donc utiliser la notation en complément à deux. Dans cette représentation, et en prenant comme exemple un codage binaire sur octets donc 6 bits (comprenant donc les entiers naturels entre 0 et 65535), on représente les entiers relatifs compris entre 3 768 et 3 767. Si l entier relatif 𝑥 que l on cherche à représenter est positif ou nul, on utilise simplement sa représentation binaire d entier naturel. Par contre, si cet entier relatif 𝑥 est négatif, on le représente par l entier naturel 𝑥 +!" = 𝑥 + 65 536, qui est compris entre 3 768 et 65 535. Remarquons qu il est facile de déterminer le signe d un entier représenté sous cette forme : un entier relatif positif ou nul est représenté par un entier naturel dont le premier bit vaut 0 alors qu un entier relatif strictement négatif est représenté par un entier naturel dont le premier bit vaut..5. Représentation binaire des nombres à virgule Représentation des nombres à virgule flottante La notation binaire permet aussi de représenter des nombres à virgule. En notation décimale, les chiffres à gauche de la virgule représentent des unités, des dizaines, des centaines... et ceux à droite de la virgule, des dixièmes, des centièmes, des millièmes... De même, en binaire, les chiffres à droite de la virgule représentent des demis, des quarts, des huitièmes... Toutefois, cette manière de faire ne permet pas de représenter des nombres très grands ou très petits (comme le nombre d Avogadro ou la constante de Planck). On utilise plutôt une représentation (similaire à la notation scientifique mais en base deux plutôt qu en base dix) dans laquelle un nombre 𝑥 s écrit : 𝑥 =! 𝑚! 𝑠 est le signe du nombre : le signe + est représenté par 𝑠 = 0 et le signe par 𝑠 =. l exposant 𝑛 est un entier relatif compris entre 04 et 03 (en codage double précision sur 8 bits), représenté en notation en complément à deux (donc compris entre et 048). la mantisse 𝑚 est un nombre binaire à virgule compris entre inclus et exclu, comprenant 5 chiffres après la virgule. Comme cette mantisse est comprise entre et, elle a toujours le seul chiffre avant la virgule ; il est donc inutile de le représenter et on utilise les 5 bits pour représenter les 5 chiffres après la virgule, ce qui donne une précision réelle de 53 bits. Exemple : Trouvons en base dix l équivalent du nombre à virgule 𝑁 représenté en notation binaire par : 00000000000000000000000000000000000000000000000000 Le premier chiffre de ce nombre correspond au signe : 𝑠 = 𝑁 < 0 L exposant est ensuite codé sur les bits suivants : 𝑛 = 0000000! 𝑛 = 094 en notation en complément à deux 𝑛 = 094 03 = 7 La mantisse correspondant enfin aux 5 derniers bits (en tenant compte du implicite) : 𝑚 =,0000000000000000000000000000000000000000000! 𝑚 = +! +! +! +! +! +!" +!" +!" +!" 0677 𝑚= 307 Le nombre 𝑁 se représente donc en base dix par : 0677!" 𝑁= = 3,74 0!" 307
Chapitre : Représentation des nombres 5 Les nombres représentés sous cette forme sont appelés nombres à virgule flottante, puisque la virgule de la mantisse peut être déplacée par le biais de l exposant. Le codage d un nombre à virgule nécessite donc : Le cas particulier du zéro Signe s Exposant n Mantisse m Nombre de bits utilisés 5 Dans la représentation précédente, puisque la mantisse est censée toujours commencer par un implicite, il n est en principe pas possible de représenter le zéro. Par convention, on décide qu un nombre vaut zéro si et seulement si tous les bits de son exposant et de sa mantisse valent 0. Il reste un choix pour le bit de signe, il y a donc un zéro positif et un zéro négatif dans les nombres à virgule flottante. Codage du zéro positif : Signe Exposant Mantisse 0 00000000000 0000000000000000000000000000000000000000000000000000 Codage du zéro négatif : Signe Exposant Mantisse 00000000000 0000000000000000000000000000000000000000000000000000. Représentation des nombres à virgule.. Dépassement de capacité Dans le codage informatique, les nombres représentés sont limités par le nombre de bits utilisés. Pour la représentation des entiers naturels ou relatifs, si on dépasse la capacité de codage, le bit le plus à gauche est perdu : on appelle ce phénomène dépassement arithmétique (ou overflow en anglais). Il faut alors changer de représentation pour éviter de perdre la valeur du résultat. En Python, ce changement de représentation est automatique et la seule limite pour la représentation des entiers, qu ils soient naturels ou relatifs, est la mémoire disponible sur la machine. Remarque : cette propriété est loin d être le cas dans tous les langages de programmation. La plupart du temps, si le résultat d un calcul dépasse les limites de la représentation des entiers, les bits surnuméraires sont purement et simplement perdus. De même que les entiers, les nombres à virgule flottante possèdent certaines limites inévitables. En effet, les nombres à virgule flottante étant représentés sur un nombre donné de bits, il existe forcément un nombre maximal représentable dans ce format. Plus précisément, 64 bits ne suffisent plus si la représentation du nombre demande : un exposant supérieur à 03, qui est le plus grand représentable sur bits. un exposant égal à 03 et une mantisse supérieure à la plus grande mantisse représentable sur 5 bits, c est- à- dire (implicite) suivi de 5 fois le chiffre après la virgule. Tout calcul dont le résultat dépasse cette limite produit une situation qui est également appelée dépassement arithmétique, produisant les nombres spéciaux + et, selon le signe du résultat du calcul.
6 Chapitre : Représentation des nombres Un autre dépassement de capacité, qui n existe pas pour les entiers, se produit lorsque l on veut représenter un nombre trop proche de 0, c est- à- dire représenter un nombre dont : l exposant est inférieur à 0, le plus petit exposant représentable sur bits le nombre est inférieur en valeur absolue au plus petit nombre dénormalisé. On parle alors de dépassement par valeurs inférieures ou de soupassement arithmétique (en anglais underflow). Selon les cas, le résultat d un calcul qui tombe dans cette plage de valeurs peut soit être arrondi à zéro (le signe du résultat est cependant conservé), soit produire une erreur... Problème de précision et arrondis Il est rare que le résultat d un calcul faisant intervenir deux nombres à virgule flottante donne un résultat représentable exactement sur 64 bits. Exemple : le nombre qui se représente par 0,4 en base dix admet pour développement en base deux, le développement périodique infini suivant : 0! + 0! +! +! + 0! + 0! +! +! + 0! + 0! + +!"!! = 0,0000000 Si l on essaye de construire une représentation sur 64 bits, on obtient : Signe Exposant Mantisse Bits non représentés 0 0 0 00000000 00000000 0000 La représentation en virgule flottante sera donc forcément une valeur approchée de ce nombre. Par défaut, les nombres à virgule sont arrondis à la valeur de mantisse la plus proche. La valeur approchée choisie pour la représentation binaire de 0,4 est donc la suivante : 0,0 00 00 00 00 00 00 00 00 00 00 00 00 00 = 7 05 759 403 79 794 8 04 398 509 48 984 0,40000000000000000446049503 On retiendra qu il n est pas possible de savoir de façon certaine si le résultat d un calcul est égal à sa valeur théorique. La principale conséquence en est qu un test du type a = b n a en général pas de sens si a et b sont deux nombres à virgule flottante, puisque ceux- ci ont pu subir des erreurs d arrondis. On remplacera donc un tel test par une condition de la forme abs(a-b) < epsilon où epsilon est une valeur proche de zéro, choisie en fonction du problème à traiter et de l ordre de grandeur des erreurs auxquelles on peut s attendre (ou qu on peut tolérer) sur a et b..3. Exemples concrets sur les erreurs d arrondis Voici quelques exemples concrets de cas où les erreurs d'arrondi ont conduit à des catastrophes : Missile Patriot En février 99, pendant la Guerre du Golfe, une batterie américaine de missiles Patriot, à Dharan (Arabie Saoudite), a échoué dans l interception d un missile Scud irakien. Le Scud a frappé un baraquement de l armée américaine et a tué 8 soldats. La commission d enquête a conclu à un calcul incorrect du temps de parcours, dû à un problème d arrondi. Les nombres étaient représentés en virgule fixe sur 4 bits, donc 4 chiffres binaires. Le temps était compté par l horloge interne du système en /0 de seconde. Malheureusement, /0 n a pas d écriture finie dans le système binaire : /0 = 0, (dans le système décimal) = 0,0000000000000... (dans le système binaire). L ordinateur de bord arrondissait /0 à 4 chiffres, d où une petite erreur dans le décompte du
Chapitre : Représentation des nombres 7 temps pour chaque /0 de seconde. Au moment de l attaque, la batterie de missile Patriot était allumée depuis environ 00 heures, ce qui avait entraîné une accumulation des erreurs d arrondi de 0,34 s. Pendant ce temps, un missile Scud parcourt environ 500 m, ce qui explique que le Patriot soit passé à côté de sa cible. Ce qu il aurait fallu faire c était redémarrer régulièrement le système de guidage du missile. Explosion d Ariane 5 Le 4 juin 996, une fusée Ariane 5 a explosé 40 secondes après l allumage. La fusée et son chargement avaient coûté 500 millions de dollars. La commission d enquête a rendu son rapport au bout de deux semaines. Il s agissait d une erreur de programmation dans le système inertiel de référence. À un moment donné, un nombre codé en virgule flottante sur 64 bits (qui représentait la vitesse horizontale de la fusée par rapport à la plate- forme de tir) était converti en un entier sur 6 bits. Malheureusement, le nombre en question était plus grand que 3768 (overflow), le plus grand entier que l on peut coder sur 6 bits, et la conversion a été incorrecte : les systèmes de sécurité, détectant une erreur, ont fait exploser la fusée! Bourse de Vancouver Un autre exemple où les erreurs de calcul on conduit à une erreur notable est le cas de l indice de la Bourse de Vancouver. En 98, elle a crée un nouvel indice avec une valeur nominale de 000. Après chaque transaction boursière, cet indice était recalculé et tronqué après le troisième chiffre décimal et, au bout de mois, la valeur obtenue était 54,88, alors que la valeur correcte était 098,8. Cette différence s explique par le fait que toutes les erreurs d arrondi étaient dans le même sens : l opération de troncature diminuait à chaque fois la valeur de l indice
8 Chapitre : Représentation des nombres 3. Pour s entraîner 3.. Nombre d états possible pour la mémoire d un ordinateur ) On imagine un ordinateur dont la mémoire est constituée de quatre circuits mémoire un bit. Quel est le nombre d états possibles de la mémoire de cet ordinateur? ) Même question pour un ordinateur dont la mémoire est constituée de dix circuits mémoire un bit. Et pour un ordinateur dont la mémoire est constituée de 3 milliards de tels circuits? 3.. Passage d une base de représentation à l autre ) Trouver la représentation en base huit du nombre par 87 en base dix. ) Trouver la représentation en base dix du nombre 75 8. 4) Trouver la représentation en base deux du nombre représenté par 4 en base dix. 5) Trouver la représentation en base dix du nombre 00 00. 3.3. Notation en complément à deux ) Trouver les représentations binaires sur huit bits des entiers relatifs 0, 7 et - 7. ) Trouver les représentations décimales des entiers relatifs dont les représentations binaires sur huit bits sont 0000 et 0000. 3) Calculer la représentation sur huit bits de l entier relatif, puis celle de son opposé. 3.4. Représentation des nombres à virgule Trouver le nombre à virgule flottante représenté par le mot : 00000000000000000000000000000000000000000000000000