Sujet : Re: Autre exercice : calculer la somme de x chiffres.
De : nicolasp (at) *nospam* aaton.com (Nicolas)
Groupes : fr.comp.lang.pythonDate : 25. May 2022, 07:51:02
Autres entêtes
Organisation : Guest of ProXad - France
Message-ID : <628dd1d5$0$2996$426a74cc@news.free.fr>
References : 1 2 3 4 5 6 7
User-Agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.9.1
Bonjour,
Le 24/05/2022 à 20:50, Benoit Izac a écrit :
Bonjour,
Le 24/05/2022 à 14:33, Alain Ketterlin a écrit dans le message
<87zgj7xg89.fsf@universite-de-strasbourg.fr.invalid> :
(Ça ne concerne pas Python, mais c'est la même idée qu'un bug qui a été
célèbre en Java, dont la correction a consisté à remplacer (a+b)/2 par
a + (b-a)/2.)
Il y a intérêt a avoir un beau commentaire juste à côté car il y a fort
à parier que quelqu'un qui passe sur le code sans être courant risque de
simplifier (et c'est logique).
Question bête : si c'est (a+b) qui provoque le dépassement, pourquoi pas
« a/2 + b/2 » ? Perte de précision ?
Tout à fait.
Avec des calculs sur des entiers :
(5 + 7) // 2 = 12 // 2 = 6
(5//2) + (7//2) = 2 + 3 = 5
Note : J'ai mis la notation Python pour du calcul sur les entiers, pas la notation mathématique (qui ne se différencie pas de la notation des calculs sur les réels).
Et pour ma culture, il vient d'où ce bug ?
Ce "bug" n'existe pas avec les versions de Python qui font du calcul sur des entiers de taille indéfinie.
Il ne s'agit en fait pas d'un bug au sens que l'on donne à ce terme habituellement mais du fonctionnement des processeurs depuis l'origine de leur création.
Pour simplifier, disons que nous utilisons un processeur 8 bits. Les nombres manipulés par ce processeur, avec des entiers positifs, vont de 0 à (2**8)-1.
En binaire : 00000000 à 11111111
En décimal : 0 à 255
Soit une variable V qui contient la valeur 240 (11110000 en binaire).
Ajoutons la valeur 16 :
V = V + 20
En binaire, cela donne :
11110000
+ 00010100
----------
100000100
Le résultat est sur 9 bits. Comme le processeur ne sait manipuler que des nombres sur 8 bits, le résultat est tronqué à 8 bits ce qui donne 4.
Pour reprendre le problème d'origine (avec des nombres sur 8 bits) :
(130 + 200) / 2 = 300 /2 -> 44 / 2 = 22 ==> !!! BUG !!!
130 + (200-130) / 2 = 130 + 70 / 2 = 165 ==> OK
Les processeurs actuels manipulent des nombres sur 32 bits ou 64 bits (voire plus) ce qui permet une plus grande latitude d'utilisation mais le phénomène de troncature est toujours présent.
J'espère avoir été clair dans mes explications ;)
Bonne journée,
Nicolas