On 2015-04-14 00:26, Carpediem wrote:
Ho un problema su cui sicuramente qualcuno di voi saprà fornirmi una risposta.
Per quel che mi riguarda, ho perso tre giorni prima di scoprire un
comportamento sul modo di contare di python che mi porta a risultati
fuorvianti. Ecco il punto:
sb = 3287628061
mb = sb / 60 # con la calcolatrice ottengo 54793801.01666667
m1 = int(mb) # ottengo 54793801
s = int ((mb-m1)*60 # Con la calcolatrice ottengo 1 ma python
restituisce alla variabile s il valore di 0,9999999403953552 e quindi
0

A questo punto, quindi, se chiedo di stampare s invece che ritrovarmi
il valore 1 ottengo 0
utilizzando una comune calcolatrice, o quella fornita dallo stesso
windows, ciò che ottengo effettuando 3287628061/60 è 54793801,01666667
Se invece chiedo a Python di stamparmi il risultato, dopo la virgola
ottengo 01 e una serie di 6 senza che compaia il 7 finale.
Tale differenza, quando chiedo di determinare il valore intero di s,
comporta il mancato raggiungimento del valore di unità (che invece
dovrei ottenere) producendo tutta una serie di conseguenze errate a
catena sui risultati delle operazioni successive.
Qualcuno potrebbe avere la gentilezza di spiegarmi questo comportamento?
e soprattutto, c'è un modo per chiedere un arrotondamento in eccesso
per la n cifra decimale?

Ci sono corsi universitari interi sul comportamento dei numeri in virgola mobile. In breve: non sono precisi. In meno breve, una rapida googlata ti porta diversi esempi

https://www.google.co.uk/webhp?#q=floating+point+number+problems

Questo sembra divertente, poi me lo guardo: http://floating-point-gui.de/

So che potrei ottenere un numero intero utilizzando per la divisione
l'operatore // ma sono particolarmente interessato a capire e
risolvere il problema contemplando l'utilizzo dei numeri in virgola
mobile.

Usa round() invece di int() per convertire il numero all'intero più vicino.

-- Daniele
_______________________________________________
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python

Rispondere a