Le nombre dans l'ordinateur
Sommaire
Le nombre dans l'ordinateur
Quelques éléments plus précis sur le codage des données numériques
PAGE EN COURS de CREATION : tout avis bienvenu !
Quelle représentation machine des nombres ?
- → Le chapitre 1 du manuel pour les enseignants ISN donne les éléments de base sur ce sujet :
- Le format des nombres entiers donc du système binaire (complément à 1 et à 2, etc.),
- Le format des nombres décimaux, à virgule flottante (avec mantisse et exposant) et à virgule fixe.
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 est consacré à décire comment représenter les nombres entiers et à virgule au niveau des élèves.
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.
- → Arithmétique_flottante_(cours_sur) permet d'en savoir plus sur le calcul en virgule flottante et donne les éléments d'approfondissement.
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.
Comment stocker les nombres dans les fichiers ?
On peut stocker les nombres de deux manières
- 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.
- → Voir Le_codage_numérique_du_texte pour plus de détails sur le sujet.
- 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.
- 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é :
- rarr; 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 .
Éléments complémentaires
Comment calculer en précision arbitraire ?
Il y a deux grandes pistes :
- 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.
- 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.
- Qui vont représenter les nombres en précision "infinie" c'est à dire ne 'feront pas' de calculs numériques approximatifs (sauf demande explicite).
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.