[Python] [Staff] Segnalazione di un bug (sperando di star scrivendo al giusto indirizzo)

Carlo Miron miron a python.it
Lun 9 Apr 2012 22:46:52 CEST


Ciao Quark,


2012/4/9 Quark Unaltro <ar.rocco a hotmail.it>:
> Salve,
> Probabilmente 'webmaster' non è esattamente l'indirizzo giusto per la
> questione in oggetto, ma non ne ho trovati altri più pertinenti (ammetto di
> non aver cercato esattamente per delle ore...).


Il Posto Giusto™ e` probabilmente la mailing list, che ho aggiunto in copia.
Se vuoi seguire l'evolvere della discussione, ti consiglio di iscriverti su:
<http://lists.python.it/mailman/listinfo/python>.
Benvenuto!


> Bene, venendo al dunque, ho fatto fare alla shell una semplice sottrazione:
> riporto il log di varie prove che ho eseguito, una volta trovato il
> problema.


Un bel print() e la paura svanisce! :P


> Python 3.1.3 (r313:86834, Nov 27 2010, 18:30:53) [MSC v.1500 32 bit (Intel)]
> on win32
> Type "copyright", "credits" or "license()" for more information.
>>>> 180-177.3
> 2.6999999999999886


>>> print(180-177.3)
2.7


>>>> 180.0-177.3
> 2.6999999999999886


>>> print(180.0-177.3)
2.7

Eccetera eccetera. In Python (in realta` in tutti i linguaggi, ma
spesso non e` cosi` evidente) esiste una differenza tra
rappresentazione interna, esatta[0], ottenibile con la funzione repr,
e rappresentazione per l'output, approssimata[0], ottenibile con str.

 >>> repr(180.0-177.3), str(180.0-177.3)
('2.6999999999999886', '2.7')

L'output della console usa repr, print usa str.

Quindi, quanto esponi non e` un bug, ma il risultato atteso. Se ti
serve una precisione maggiore di quella ottenibile dal floating point
binario, ci sono i tipi decimal[3] e fractions[4] nella libreria
standard.

[0] ebbene si`, 2.6999999999999886 e` il risultato esatto (per qualche
definizione piuttosto eccentrica di esatto :) dell'operazione (in
virgola mobile binaria) di cui sopra, secondo la semantica dello
standard IEEE 754[1] implementato dal tipo float[2].

[1] <http://it.wikipedia.org/wiki/IEEE_754>
[2] <http://docs.python.org/library/stdtypes.html#additional-methods-on-float>
[3] <http://docs.python.org/library/decimal.html>
[4] <http://docs.python.org/library/fractions.html>




>>>> 180.00-177.30
> 2.6999999999999886
>>>> 180-177
> 3
>>>> 3-0.3
> 2.7
>>>> 150-39.4
> 110.6
>>>> 150-122.5
> 27.5
>>>> 150-141.3
> 8.699999999999989
>>>> 150-144.2
> 5.800000000000011
>>>> 100-97.5
> 2.5
>>>> 100-94.2
> 5.799999999999997
>>>> 65-62.9
> 2.1000000000000014
>>>> 65 - 62.9
> 2.1000000000000014
>>>> (65) - (62.9)
> 2.1000000000000014
>>>> (65 - 62.9)
> 2.1000000000000014
>>>> 63-58.7
> 4.299999999999997
>>>> 63-58-5
> 0
>>>> 63-58.5
> 4.5
>>>> 63-58.4
> 4.600000000000001
>>>> 63-58.3
> 4.700000000000003
>>>> 63-58.2
> 4.799999999999997
>>>> 63-58.1
> 4.899999999999999
>>>> 4/3
> 1.3333333333333333
>>>> 6/3
> 2.0
>>>> 10-6.4
> 3.5999999999999996
>>>> 5-2.4
> 2.6
>>>> -40+39.3
> -0.7000000000000028
>>>>
>
>
> Insomma, sembra che, effettuando una qualunque somma algebrica, se almeno
> uno dei due addendi ha la virgola e se almeno uno dei due era maggiore di 10
> e se il risultato è in valore assoluto minore di 10, sballa, mettendo tutte
> quelle cifre dopo la virgola. Coi numeri piccoli in valore assoluto sembra
> sbagliare meno. L'errore si è ripetuto anche chiudendo e riaprendo la shell.
> E sembra ripetersi esattamente uguale anche in una versione più vecchia,
>
> Python 2.7 (r27:82525, Jul  4 2010, 09:01:59) [MSC v.1500 32 bit (Intel)] on
> win32
> Type "copyright", "credits" or "license()" for more information.
>>>> -40+39.3
> -0.7000000000000028
>>>>
>
> Sul python 3.1 ho aggiunto il VPython, sul 2.7 la PIL, ma in entrambi i casi
> i moduli aggiuntivi non erano in uso mentre facevo le prove.
>
> Forse eravate già a conoscenza del problema, forse è stato risolto in
> versioni più recenti: in entrambi i casi scusate per il disturbo.
>
> Bene, è tutto. Sarò felice di sapere se la mia email è servita a qualcosa,
> se avete il tempo per rispondermi.
>
> Grazie per quanto avete fatto, il vostro linguaggio è fantastico (lo sto
> usando per la mia tesina di maturità!).


Auguri per la tua tesina!
©
-- 
  R
K-<M>-S
  L


Maggiori informazioni sulla lista Python