Deutsch English Français Italiano |
<628dd1d5$0$2996$426a74cc@news.free.fr> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!weretis.net!feeder8.news.weretis.net!proxad.net!feeder1-2.proxad.net!cleanfeed2-b.proxad.net!nnrp1-2.free.fr!not-for-mail Date: Wed, 25 May 2022 08:51:02 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.9.1 Subject: Re: Autre exercice : calculer la somme de x chiffres. Content-Language: fr Newsgroups: fr.comp.lang.python References: <t6dj6a$sg8$1@gioia.aioe.org> <t6djq7$1570$1@gioia.aioe.org> <87o7zod3s7.fsf@izac.org> <877d6czfdn.fsf@universite-de-strasbourg.fr.invalid> <87k0accue3.fsf@izac.org> <87zgj7xg89.fsf@universite-de-strasbourg.fr.invalid> <87mtf669z5.fsf@izac.org> From: Nicolas <nicolasp@aaton.com> In-Reply-To: <87mtf669z5.fsf@izac.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Lines: 76 Message-ID: <628dd1d5$0$2996$426a74cc@news.free.fr> Organization: Guest of ProXad - France NNTP-Posting-Date: 25 May 2022 08:51:01 CEST NNTP-Posting-Host: 195.101.33.1 X-Trace: 1653461461 news-3.free.fr 2996 195.101.33.1:5669 X-Complaints-To: abuse@proxad.net Bytes: 3593 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