Représentations binaire et décimale d’un nombre

mardi 17 septembre 2013
par  Alain BUSSER

Il est impossible d’avoir une valeur exacte de nombres décimaux tels que 0,1 ou 0,2 dans un ordinateur : Ceci, parce que les nombres sont traités en binaire dans l’ordinateur. La recherche d’une solution à ce problème permet de (re)voir comment on effectue des opérations arithmétiques en binaire.

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):

10
+ 111





101

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:

1000|101
-101|










110|0,00110011...
-101|
1000|
-101|
110|
-101|
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?

Ouf !!!


Commentaires