Le nombre dans l'ordinateur : Différence entre versions
m (→Quelle représentation machine des nombres ?) |
m (→Quelle représentation machine des nombres ?) |
||
(23 révisions intermédiaires par 3 utilisateurs non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
+ | |||
+ | =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 [http://fr.wikipedia.org/wiki/Code_de_Gray 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 traitement numérique]] Un document général introductif sur le codage numérique des nombres. | ||
+ | |||
=Le nombre dans l'ordinateur= | =Le nombre dans l'ordinateur= | ||
Quelques éléments plus précis sur le codage des données numériques | Quelques éléments plus précis sur le codage des données numériques | ||
− | |||
− | |||
== Quelle représentation machine des nombres ? == | == Quelle représentation machine des nombres ? == | ||
− | * → Le chapitre 1 du [[Une_introduction_à_la_science_informatique_:_représentation_numérique_de_l'information|manuel pour les enseignants ISN]] donne les éléments de base sur ce sujet : | + | *→ Le chapitre 1 du [[Une_introduction_à_la_science_informatique_:_représentation_numérique_de_l'information|manuel pour les enseignants ISN]] donne les éléments de base sur ce sujet (accès [https://wiki.inria.fr/wikis/sciencinfolycee/images/3/3e/LSICh1.pdf au contenu ici]) : |
** Le [http://fr.wikipedia.org/wiki/Format_de_donn%C3%A9es#Nombres_entiers format des nombres entiers] donc du [http://fr.wikipedia.org/wiki/Syst%C3%A8me_binaire système binaire] (complément à 1 et à 2, etc.), | ** Le [http://fr.wikipedia.org/wiki/Format_de_donn%C3%A9es#Nombres_entiers format des nombres entiers] donc du [http://fr.wikipedia.org/wiki/Syst%C3%A8me_binaire système binaire] (complément à 1 et à 2, etc.), | ||
** Le [http://fr.wikipedia.org/wiki/Virgule_flottante format des nombres décimaux], à virgule flottante (avec mantisse et exposant) et à [http://fr.wikipedia.org/wiki/Virgule_fixe virgule fixe]. | ** Le [http://fr.wikipedia.org/wiki/Virgule_flottante format des nombres décimaux], à virgule flottante (avec mantisse et exposant) et à [http://fr.wikipedia.org/wiki/Virgule_fixe virgule fixe]. | ||
− | + | [[Image: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 [https://wiki.inria.fr/sciencinfolycee/Informatique_et_Sciences_du_Num%C3%A9rique_-_Sp%C3%A9cialit%C3%A9_ISN_en_Terminale_S manuel scolaire] disponible en ligne pour préparer les cours, le chapitre 7, page 105 du pdf (accès [https://wiki.inria.fr/wikis/sciencinfolycee/images/7/73/Informatique_et_Sciences_du_Num%C3%A9rique_-_Sp%C3%A9cialit%C3%A9_ISN_en_Terminale_S.pdf#page=105 au contenu ici]) est consacré à décire comment représenter les nombres entiers et à virgule au niveau des élèves. | |
− | Il | + | [[Image:Pucegrain.png]] Il faut bien comprendre [http://interstices.info/jcms/c_36153/pourquoi-mon-ordinateur-calcule-t-il-faux «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. | ||
+ | |||
+ | [[Image: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. | *→ [[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 ? == | == Comment stocker les nombres dans les fichiers ? == | ||
+ | On peut stocker les nombres de deux manières | ||
+ | |||
+ | *[[Image: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. | ||
+ | |||
+ | * [[Image: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 «[http://fr.wikipedia.org/wiki/Endianness 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. | ||
+ | |||
+ | * [[Image: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 ? == | == 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 [http://docs.oracle.com/javase/6/docs/api/java/math/BigInteger.html nombres entiers] ou | ||
+ | #* des [http://docs.oracle.com/javase/6/docs/api/java/math/BigDecimal.html 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. | ||
− | + | *→ [[Calcul_en_précision_arbitraire,_Séquence_pédagogique]] Séquence pédagogique autour du calcul avec des très grands nombres qui ne peuvent être codés avec les nombres entiers ou les nombres flottants usuels des machines. | |
== Quelle spécification pour une valeur numérique ? == | == Quelle spécification pour une valeur numérique ? == |
Version actuelle datée du 17 septembre 2012 à 09:48
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 traitement numérique Un document général introductif sur le codage numérique des nombres.
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 ?
- → Le chapitre 1 du manuel pour les enseignants ISN donne les éléments de base sur ce sujet (accès au contenu ici) :
- 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, 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.
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.
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
- 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.
- 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.
- 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 :
- 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).
- → Calcul_en_précision_arbitraire,_Séquence_pédagogique Séquence pédagogique autour du calcul avec des très grands nombres qui ne peuvent être codés avec les nombres entiers ou les nombres flottants usuels des machines.
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.