2015-06-14 20 views
7

Penso che ci sia qualche incongruenza nell'operazione di divisione, ma non ne sono sicuro.Una divisione strana risulta in python 3

Nel codice seguente mi aspetterei che un // c sia 100.0 o b // c sia -99.0.

a = 1.0 
b = -1.0 
c = 0.01 

print (a/c) 
print (a//c) 
print (b/c) 
print (b//c) 

dà:

100.0 
99.0 
-100.0 
-100.0 

Grazie

risposta

3

Ciò è dovuto al modo in cui floating point numbers are represented. Non è vero che 1.0 è esattamente 100 volte 0.01 (per quanto i punti mobili sono rappresentati internamente). L'operatore // esegue la divisione e pianifica il risultato, quindi è possibile che internamente il numero sia leggermente inferiore a 100.0 e questo lo porta ad essere a quota 99.0.

Inoltre, Python 3.x utilizza a different approach per mostrare il numero in virgola mobile rispetto a Python 2.x. Ciò significa che il risultato di, sebbene internamente leggermente inferiore a 100.0, verrà visualizzato come 100.0 poiché l'algoritmo ha determinato che il numero è abbastanza vicino a 100.0 da considerare uguale a 100.0. Questo è il motivo per cui 1.0/0.01 viene visualizzato come 100.0 anche se questo non può essere rappresentato internamente come esattamente quel numero.

+0

Grazie per la risposta dettagliata. Anche se la logica è chiara, questo comportamento è fuorviante in un'operazione così intuitiva. – Baba

+0

@Baba: forse ma questo è uno degli avvertimenti dell'uso di numeri in virgola mobile. Ci sono molti più numeri in virgola mobile di quanto un computer possa sperare di rappresentare in modo accurato, quindi questo è qualcosa di cui essere consapevoli quando si usano numeri in virgola mobile. –