Les ordinateurs ne savent pas calculer !

Publié le par Chkone

Salut,

On va encore parler de nos amis les ordinateurs ces êtres étranges que l'ont érigent en tant qu'idoles, que l'ont appels à chaque problème. Que l'ont cites comme "ceux qui ont la réponse" tels la science mais, seul ceux qui sont en son sein (la science et l'informatique) savent à quel point elles sont ignorantes.
Les ordinateurs sont très idiot on ne le dirait jamais assez. Ils ne font juste ceux pourquoi ils ont été programmés. Mêmes les intelligences artificielles et même ceux qui simule un semblant de stochastique. Les ordinateurs font tout ce que peuvent faire les hommes (tout peut être fait avec un papier et un stylo et une once de concentration), sans se tromper c'est à voir ! C'est ce que l'on va voir ici.

Tous les pays du monde utilise le mot "calculateur" pour designer un ordinateur. Tous sauf d'irreductible Gaulois qui on inventer le mot "ordinateur". Mais d'où viens ce mot d'après Wikictionnaire :
"Le terme ordinateur est d’origine biblique (il se trouve dans le Littré comme adjectif désignant « Dieu qui met de l’ordre dans le monde ») et a été proposé par le professeur de philologie Jacques Perret dans une lettre datée du 16 avril 1955 en réponse à une demande d’IBM France, dont les dirigeants estimaient le mot calculateur (computer) bien trop restrictif en regard des possibilités de ces machines (c’est un exemple très rare de la création d’un néologisme authentifiée par une lettre manuscrite et datée)."
"Dieu met de l'ordre dans le monde" ils sont fou ces gaulois. On verra qu'il n'y a rien de divins dans un ordinateur. Le mot calculateur est aucunement restrictif c'est une des taches principales d'un ordinateur et de son coeur (le processeur). Le calculateur (l'ordinateur) passe son temps à lire des instructions (le programme étant des insctructions avec des paramètres les un à la suites des autres) par exemple afficher 5 sur la fenêtre MSDos (ce qui va suivre est un variante de la réaliser mais est a but pédagogique :)) :
  1. Case mémoire 1 : Instruction écrire sur la fenêtre MSDos
  2. Case mémoire 2 : Donée à écrire en binaire ici 5 = 101
  3. le programmeur est fini mais ça ne lui suffit pas le calculateur convertir le chiffre 5 en chaine de caractère
  4. le calculateur envoi la chaine de caractère à la carte graphique (avec une instruction qui dit hé ho c'est pour la fenêtre DOS)
  5. le carte graphique qui n'est rien d'autre qu'un (en général plusieurs) processeur converti la chaine de caractère 00000101 00000000 en caractère comprehensible pour l'homme c'est à dire ce dessin là : 5

Voilà cela fait beaucoup, rien que pour afficher 5 et là j'ai passé les différentes étapes de l'appel de la console et autre (comme je l'est dit cela ne se passe pas vraiment comme cela ceci est juste un exemple).
Et bien comme notre calculateur (l'ordinateur) passe son temps à calculer on va voir comme notre petit chérubin calcule. Et bien avec les entiers. En math qu'est ce qu'on Entier l'ensemble IN ? Et bien c'est un ensemble de nombre qui n'ont pas de partie flottant (pas de nombre après la virgule enfin si mais, ce n'est que des 0). Et bien comment un ordinateur représente ces nombres. On vous l'a souvent dit l'ordinateur ne comprend que 2 choses 0 et 1 (si personne ne vous l'a dit voilà c'est fait). Donc il faut juste faire un petit changement de base exemple :

Decimal (base 10) Binaire (base 2) Héxacimal (base 16)
0 0 0
1
1
1
2
10
2
3
11
3
4
100
4
5
101
5
6
110
6
7
111
7
8
1000
8
9
1001
9
10
1010
A
11
1011
B
12
1100
C
13
1101
D
14
1110
E
15
1111
F
16
10000
10
17
10001
11
...
...
...
42
101010
2A


Voilà mais, le problème c'est que dans un calculateur il n'y a pas une infinité de place alors on limite les places pour type. Par exemple pour les entiers que l'on vient de voir le calculateur limite leur étendu à un nombre de bit limité (un bit est une case mémoire contenant 1 ou 0). Par exemple dans les ordinateurs 32 bits ou peut avoir des nombres de 32 ou 64 bits. 32 bits unsigned int en C++ et pour les 64 bits unsigned long long. Ce qui nous fait une étendu pour les unsigned int de 0 à 232-1 le -1 est là à cause du 0 cela fait de 0 à 4294967295 et pour 64 bits de 0 à 264-1 de 0 à 18446744073709551615. Mais qu'est ce qui se passe si l'on dépasse par exemple en 32 bits si je fais 4294967295 + 1. Et bien nous serons dans un cas typique de OverFlow et ceci est un bogue. Il ne faut pas croire qu'il n'existe pas de nombre négatif sur les calculateurs. Et bien pour représenter un nombre négatif le calculateur réserve le premier bit pour le signe si ce bit = 1 alors c'est négatif si = 0 alors positif. Et comme nous avons un bit en moins nous avons 2 fois moins de nombre représentable - 1. Pour 32 bits nous irons de -231 à 231-1 de -2 147 483 648 à 2 147 483 647. Vous l'aurais surement remarqué nous avons alors 2 types de 0. Le 0- et le 0+. Qui sont les mêmes à ne pas confondre avec les 0 des limites en mathématiques. Mais les nombres à virgule. Et bien c'est là que commence les problèmes.


IEEE-754 l'infame !

A cause d'une mauvaise compréhension de cette norme des gens sont morts, une fusée a explosé et une valeur boursière était affichée en chute alors que sa valeur montait.
Exemple de problème à la non-maitrise de la norme :

  • Les bugs coîteux (missile Patriot – 1991) : Les missiles patriot sont des missiles anti-missiles de fabrication américaine. Le 25 février 1991, l’un d’eux rata le scud (missile irakien d’origine soviétique) qu’il était censé détruire. Une analyse du problème révéla que le logiciel de guidage des Patriot reposait sur un calcul incrémental sommant des dixièmes de secondes pour d´eterminer le temp courant. La valeur 1/10 étant incodable en binaire, ce calcul est approximatif est entraîne une dérive de l’estimation du temps.
    Cette dérive est de 20% après quatre heures, 50% après huit heures et plus de 100% apr `es vingts heures. Les missiles qui échouèrent le 25 févrierétaient en fonction depuis plus de cent heures.
    Coût: 28 morts.

  • Les bugs coûteux (Ariane V – 1996)
    L’explosion du premier exemplaire de la fusée Ariane V en 1996 était
    due à un bug dans le logiciel de stabilisation. 37s après le lancement,
    une conversion d’une valeur flottante cod´ee sur 64 bits en entier
    cod´e sur 16 bit provoqua le crash de ce logiciel écrit en Ada.
    Coût: ≃ 800 millions €

Mais quel est cette incroyable Norme IEEE-754 ?
IEEE-754 est réponse à la question de comment représenter des valeurs relatives avec seulement des valeurs entières en maximisant l'étendu de l'ensemble tout en minimisant l'espace occuper (le nombre de bit). Waw !!!
Et bien l'IEEE-754 simple précision :

(-1)S*M*2(E-127)
S : 1 bit
M : 23 bits (la fraction sur l'illustration)
E : 8 bits

Nous passerons sur les nombres dénormaliser en gros ce qu'il faut retenir nous pouvons représenter plus de nombre proche de 0 que les autres.
Il existe des exceptions à cette exception :
  • +∞
  • -∞
  • NaN (Not 1 Number) bizarre que dans la norme de représentation de nombre il existe des "pas nombres"
  • les deux 0 : 0+, 0-
Exemple :
Bref c'est joli comme pour les Entiers Naturels on est limité dans l'espace. Donc lorsque l'on additionne 2 nombres où à forcement une perte d'information exemple :
91 234,5
         41,2345
91 285,7345
Ca c'est ce que nous devrions avoir. Mais voilà ce que nous avons :
91 234,5 + 41,2345 = 91 285,7

D'où viens cette perte d'information et bien dans la partie fraction (en 23 bits aussi appelé Mantisse). Nous avons 23 chiffres significatifs binaires alors lorsque l'on dépasse c'est tronqué ou arrondit selon les architectures.
Il est aussi possible que 1000 + 0.00000001 = 1000 !
Voilà d'arrondis en arrondis lors d'algorithme de calcul récursif on peut vraiment s'éloigner de la solution.
Mais les erreurs ne viennent pas seulement des erreurs de troncatures et d'arrondis.
Les résolutions numériques et le calcule scientifique mais, cela est une autre histoire...
Alors, lorsque votre ordinateur vous dit que 1+1=2 vous avez le droit de douter.

Publié dans Science

Commenter cet article