Le nombre dans l'ordinateur

De Sciencinfolycee
Aller à : navigation, rechercher

Les différentes bases

"Il y 10 sortes de gens dans le monde, ceux qui savent compter en binaire et ceux qui ne savent pas."

Base 2 (binaire)

Symboles autorisés: 0 et 1 "10" en binaire vaut "2" en décimal Voir aussi le code de Gray.

Base 8 (octal)

Symboles autorisés: 0,1,2,3,4,5,6,7 "10" en octal vaut "8" en décimal

Base 10 (décimal)

Symboles autorisés: 0,1,2,3,4,5,6,7,8,9 "10" en décimal vaut "10" en décimal

Base 16 (hexadécimal)

Symboles autorisés: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F "10" en hexadécimal vaut "16" en décimal

Le nombre dans l'ordinateur

Quelques éléments plus précis sur le codage des données numériques

Quelle représentation machine des nombres ?

Pucegrain.png Il faut avant tout prendre en compte le fait qu'il y a deux principaux types informatiques de nombres : les entiers et les «flottants» (nombre à virgule). Bref '2' et '2.0' ne sont pas du même type. Dans les algorithmes contemporains on a tendance à manipuler des entiers en 32bits (donc 4 milliards de valeur environ. . et bientôt le 64bits se généralisera) et des flottants en double précision, les processeurs numériques et les langages informatiques étant optimisés pour ces formats. Les entiers de petite taille (8 ou 16 bits) sauvent de la place mais en fait ils sont reconvertis en 32 ou 64 bits au niveau de l'unité arythmétique de calcul. Les nombres à virgule en simple précision donc avec 7 chiffres significatifs sont inutilisables pour les calculs généraux.

  • → Le manuel scolaire disponible en ligne pour préparer les cours, le chapitre 7, page 105 du pdf (accès au contenu ici) est consacré à décire comment représenter les nombres entiers et à virgule au niveau des élèves.

Pucegrain.png Il faut bien comprendre «pourquoi mon ordinateur calcule faux» les liens proposés avec ce petit podcast donnant les éléments clés. En bref il faut recommander de faire les calculs en "double précision" ('double') ce qui donne 16 chiffres significatifs, donc 52 bits. On peut se dire que, à l'arrache, on perd un bit de précision à chaque étape de calcul (le dernier bit est indéfini à 1/2 bits près à cause de l'arrondi, lorsque deux nombres de même exposant se combinent additivement, par exemple, ils cumulent l'incertitude sur le dernier bit qui ne signifie plus rien). Assez rapidement on reste avec comme ordre de grandeur 6 à 10 chiffres significatifs.

Pucegrain.png Il faut ensuite comprendre que plusieurs fonctions donnent comme résultat des valeurs infinies ou indéfinies:

  • Infinity_and_NaN_Arithmetic_Rules La table des règles de gestion des valeurs infinies (+/-oo) et indéfinies lors de calculs sur les flottants. Intéressant pour comprendre le codage le nombre et vérifier les liens avec les calculs symboliques sur les nombres réels à l'infini.


Et pour la cabinet de curiosité : Fast_inverse_square_root_:_un_algorithme_fou_!

Comment stocker les nombres dans les fichiers ?

On peut stocker les nombres de deux manières

  • Pucegrain.png En format ASCII c'est à dire en écrivant la chaîne de caractère "3.1416" (par exemple :)
    • mais celà est évidemment très coûteux, un nombre entier signé de 32bits donc 4 octets peut consommer jusqu'à 11 charactères pour le représenter en ASCII (un nombre flottant de 64bits donc 8 octets peut consommer plus d'une 20taine de charactères.
    • et puis l'utilisation n'est pas la même car sous cette forme l'ordinateur ne calcule plus!
    • → Voir Le_codage_numérique_du_texte pour plus de détails sur le sujet.
  • Pucegrain.png En format binaire c'est à dire en stockant directement les 4 ou 8 octets de sa représentation binaire dans un fichier.
    • Mais alors, une véritable tour de babel des formats binaires s'est érigée : selon l'ordre dans lequel les octets sont stockés dans le fichier (du premier au dernier ou l'inverse ?) et selon l'ordre dans lequel les bits de chaque octet sont stockes (on parle de «big ou little endian»).
    • La cause profonde est à la fois liée au fait que le cablage des architectures matérielles des machines de calcul varie et . . quelque querelles commerciales aussi.
    • → Voir Little_endian_and_big_endian pour plus de détails sur le sujet.
  • Pucegrain.png Comme souvent la standardisation vient sauver la situation et une solution basée sur une façon de «penser autrement» un tel codage a émergé :
    • Billet:Base64 Quand on veut coder des nombres (entiers) sous une forme aisément transmissible, se pose rapidement la question d'un codage compatible avec l'écriture de textes (comme dans les courriels).

Éléments complémentaires

Comment calculer en précision arbitraire ?

Il y a deux grandes pistes :

  1. Utiliser des bibliothèques de calcul numérique en précision arbitraire sur
    • des nombres entiers ou
    • des nombres décimaux.
      • Disponibles dans tous les langages ces objets encapsulent des tableaux de longueurs variables permettant de faire des calculs avec des mantissent et/ou des exposants soit de longueur prédéfinie quelconque soit de longueur dynamique au fil du calcul.
      • Un tel outillage sert uniquement dans des cas très spécifiques (ex: calcul sur des clés de cryptographie) car son coût de calcul pour le traitement de données multimédias par exemple est prohibitif.
  2. Utiliser des calculateurs symboliques
    • Qui vont représenter les nombres en précision "infinie" c'est à dire ne 'feront pas' de calculs numériques approximatifs (sauf demande explicite).
      • Ainsi √4 s'évaluera à 2, et 4/12 à 1/3, mais √2 ou 1/3 ne seront jamais évalués mais manipulés à travers leurs propriétés symboliques.

Quelle spécification pour une valeur numérique ?

Une valeur numérique n'est pas un «nombre» mais une quantité définie par

  • ses valeurs minimale et maximale,
  • une valeur initiale ou "par défaut",
  • la précision mesurable,

en plus, le cas échéant, de son unité physique.

Ainsi, le mètre du bricoleur mesure t'il à un millimètre près des longueurs entre 0 et 2 ou 3 mètres, la position d'un point dans une image est donnée à un pixel près entre les bords de l'image, le radar de la prévention routière mesure des vitesse avec une marge d'erreur d'environ 5km/h, etc.

Connaître les bornes min et max d'une valeur est très précieux, que ce soit pour demander à l'utilisateur une valeur qui ne soit pas aberrante, vérifier qu'un calcul n'ait pas divergé, etc.. Connaitre la précision d'une valeur permet de savoir jusqu'à quelle décimale un algorithme doit approximer une solution sans calcul inutile, ou d'ajuster un affichage graphique, etc.

Deux valeurs numériques dont la différence est plus petite que la précision mesurable sont indiscernables. Elles sont peut-être vraiment égales, mais nous n'en saurons rien, puisqu'il est toujours possible qu'elles diffèrent d'une quantité plus petite que la précision mesurable. Si en revanche leur différence est plus grande que la précision mesurable alors on peut affirmer qu'elles ne sont pas similaires.

Ce qui est défini ici dans le cas déterministe se traduit aussi dans le cas stochastique : une valeur aléatoire est définie par sa valeur moyenne m, estimée sur n échantillons et sa dispersion s qui se calcule comme une erreur quadratique moyenne. Ce calcul permet d'affirmer, dans un cas standard, qu'avec une probabilité d'environ 90% la valeur se situe dans un intervalle à peu près [m - 2 s, m + 2 s[ autour de la moyenne.

Mais le problème de la précision entre une valeur numérique "parfaite" et celle obtenue ne se pose pas uniquement lors d'une mesure. Au sein même des calculateurs, des erreurs complexes se propagent et s'agrandissent. Et une très belle idée a alors émergé : celle de considérer que les ordinateurs "calculent toujours faux", mais de se donner des outils pour estimer de combien.