Yip a dit:
Y a-t-il un programmeur dans la salle pour nous expliquer avec clarté ce problème de manque de précision des calculettes lié au stockage des données sur un nombre insuffisant de bits ?
c'est assez simple à expliquer, mais c'est du principalement au changement de base des calculs.
dans l'ordinateur, un float (nombre flottant) est enregistré dans un format binaire. on va prendre un petit nombre avec un codage sur 4 octets (pour simpifier)
soit le chiffre 81,85 par exemple:
la partie avant la virgule ne pose pas de problèmes particuliers :
1010001 en binaire donc il stocke 111 (7) pour la position de la décimale, puis ensuite, il s'attaque à la partie après la virgule, et c'est là que tout ne va pas très bien. il reste 0,85 à mettre en binaire:
0,85*2 = 1,7 donc 1 et il reste 0,7
0,7*2 = 1,4 donc 1 et il reste 0,4
0,4*2 = 0,8 donc 0 et il reste 0,8
0,8*2 = 1,6 donc 1 et il reste 0,6
0,6*2 = 1,2 donc 1 et il reste 0,2
0,2*2 = 0,4 donc 0 et il reste 0,4 et on se retrouve dans une boucle infinie dont on s'arrete quand on a atteint le nombre de bits de sauvegarde du chiffre
donc dans le cas d'un codage sur 32 bits (on a 8 bits pour la position de la virgule ) 00000111 et 24 pour la valeur à retenir donc
1010001,11011001100110011(00110011001100110011001100) perdant donc la précision sur la fin de la partie décimale. Quand on cherche à reconstituer notre chiffre, on a:
1/2=0,5 - (0,5+1)/2=0,75 - (0,75+0)/2=0,375 - (0,375+0)/2=0,1875 - (0,1875+1)/2=0,59375 - (0,59375+1)/2=0,796875 - (0,796875+0)/2=0,3984375 ...... (0,699996948+1)/2=0,849998474 (d'où une certaine approximation, ici pas très bonne, mais pour l'explication, il n'était pas nécessaire de le faire sur une très longue série de chiffres ma calculatrice n'aurait peut-être pu afficher la différence!)
J'espère que cette explication a été claire!