Ciao Quark,
2012/4/9 Quark Unaltro <ar.ro...@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 _______________________________________________ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python