Les algorithmes, programmés en CoffeeScript, peuvent être testés (après une éventuelle modification) en ligne :
Représentation binaire des réels
Au secours!
Tester l'algorithme ci-dessous:
Euh, Houston, nous avons un problème! Normalement, 0,2+0,1, c'est censé faire 0,3, non ? Alors qu'est-ce qui s'est passé ? Pour le savoir on va regarder comment les nombres 0,1, 0,2 et 0,3 sont codés en binaire. On verra en particulier que 0,2 ne "tombe pas juste" en binaire.
(essayer l'algorithme ci-dessus avec x = 0.1 + 0.2 - 0.3
pour voir plus de détails)
Représentation binaire des entiers naturels
Essayer l'algorithme suivant en remplaçant 2 par 3 ou 5:
Ainsi, en binaire,
- 2 s'écrit 10
- 3 s'écrit 11
- et 5 s'écrit 101
On peut effectuer le calcul directement en binaire (avec une retenue sur le deuxième chiffre):
1 | 0 | |||
+ | 11 | 1 | ||
1 | 0 | 1 |
De même, on peut poser et effectuer une multiplication d'entiers en binaire. Mais pour les nombres décimaux, on va effectuer une division:
Division d'entiers en binaire
Comme 0,2 est l'inverse de 5, on va effectuer la division de 1 par 101 (5 en binaire) pour convertir 0,2 en binaire:
1 | 0 | 0 | 0 | | | 1 | 0 | 1 | |||||||||||||
- | 1 | 0 | 1 | | | ||||||||||||||||
1 | 1 | 0 | | | 0 | , | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | ... | ||||||
- | 1 | 0 | 1 | | | ||||||||||||||||
1 | 0 | 0 | 0 | | | ||||||||||||||||
- | 1 | 0 | 1 | | | ||||||||||||||||
1 | 1 | 0 | | | |||||||||||||||||
- | 1 | 0 | 1 | | | ||||||||||||||||
1 | | |
Ainsi, le développement binaire de 0,2 est infini, et ne peut donc être entré que sous forme d'une approximation dans la machine:
C'est donc lors de la conversion en décimal que le chiffre tout à la fin apparaît.
Pour aller plus loin
Bref, lorsqu'on calcule 3*0.3 ou analogue, il manque des chiffres binaires à la fin; et l'infini c'est long, surtout vers la fin, comme dirait Pierre Dac... Et on ne peut rien faire pour régler ce problème, à moins de disposer d'un ordinateur ayant une infinité de bits en mémoire, ce qui n'existe pas encore... Mais de combien se trompe-t-on lorsqu'on fait ces approximations ?
Plutôt que compter les chiffres binaires calculés, autant les faire compter par CoffeeScript:
Ensuite, on compare l'inverse de 0,2+0,1-0,3 avec 254:
Comment résoudre le problème?
Commentaires