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