Lorsque votre ordinateur devient fou

Comment une machine peut-elle commettre une erreur de calcul alors que l’algorithme implémenté est mathématiquement juste ?

Considérons le polynôme de second degré

Capture d’écran 2015-02-19 à 17.43.52

avec a = 1, b=10000 et c =1.

Si vous essayez d’écrire un programme très simple qui calcule textuellement la racine

Capture d’écran 2015-02-19 à 17.10.50

le compilateur vous renverra 0 comme résultat. Or en remplaçant x par 0 dans notre polynôme on obtient non pas un résultat nul mais 1 ! L’ordinateur a donc calculé une racine fausse !

Étudions ce phénomène de manière plus fine maintenant en codant la fonction

Capture d’écran 2015-02-19 à 17.10.57

On reconnaît ici le développement en série de la fonction exponentielle. Plus n est grand, plus f(x) est très proche de exp(x), si bien qu’on devrait avoir une erreur quasi nulle pour n>100.

Or en implémentant la fonction f dans un programme informatique avec n = 2000, on observe des résultats complètement aberrants :

Capture d’écran 2015-02-19 à 17.11.03

Inutile de vous rappeler que exp(x) décroît vers 0 pour les nombre négatifs !

Une représentation informatique des nombres en cause

Une machine stocke ses informations sous forme de bits (0 ou 1). Une norme, appelée IEEE754, a été créée pour représenter les flottants avec pour objectif de couvrir le maximum de réels en utilisant le moins de mémoire, et donc de bits, possibles.

Cette norme représente ainsi les réels sous forme de “virgule flottante” :

Capture d’écran 2015-02-19 à 17.11.17

avec M limitée à 23 bits pour une précision simple.

Ainsi on peut remarquer qu’il n’est pas possible de représenter n’importe quel nombre avec cette représentation car cette représentation n’est pas continue ! En effet le premier réel qui vient juste après 1 est 1.0000001 et plus le nombre est grand, plus le premier réel qui lui succédera sera loin ! Cette imprécision pour de grand nombre conduit rapidement à des arrondis de nos machines et peuvent ainsi nous renvoyer des résultats aberrants.Vous pouvez essayer de coder d’autres fonctions comme les fonctions cosinus ou sinus et vous constaterez que des cosinus de grands nombres peuvent carrément être considérés comme infinis (NaN, not a number) !

Soyez donc attentifs lorsque vous êtes amenés à effectuer des calculs sur des grands nombres !

Sources

Explications sur le site de l’école centrale de Lyon 

Crédits photos : VirtuallyLight via Flickr.