2011-08-31 11 views
6

Sto riscontrando un problema con np.round, np.around dove non sta arrotondando correttamente. Non riesco a comprendere il codice, perché quando lo faccio impostare manualmente il valore (al contrario di utilizzare i miei dati), le opere di ritorno, ma qui è l'output:Problemi con arrotondamenti galleggianti in Python

In [177]: a 
Out[177]: 0.0099999998 

In [178]: np.round(a,2) 
Out[178]: 0.0099999998 


In [179]: np.round(a,1) 
Out[179]: 0.0 

Che cosa mi manca? Il dtype di a è float32, devo cambiarlo?

+4

Qui. leggi tutto [che] (http://perso.ens-lyon.fr/jean-michel.muller/goldberg.pdf) – JBernardo

+2

Qual è il tuo output previsto? Forse date un'occhiata al tipo [decimal] di python (http://docs.python.org/library/decimal.html) se davvero dovete avere un valore "esatto". – jozzas

+0

'np' è Numpy ?? –

risposta

5

Prova a creare np.float32(0.01) e vedrai la tua risposta. Stai ottenendo la precisione che puoi già.

>>> import numpy as np 
>>> x = 0.01 
>>> epsilon = 0.01 - np.float32(0.01) 
>>> for n in np.arange(x - 10*epsilon, x + 10*epsilon, epsilon): 
...  print(repr(np.float32(n))) 
...  
0.0099999979 
0.0099999979 
0.0099999979 
0.0099999988 
0.0099999988 
0.0099999988 
0.0099999988 
0.0099999998 
0.0099999998 
0.0099999998 
0.0099999998 
0.0099999998 
0.010000001 
0.010000001 
0.010000001 
0.010000001 
0.010000002 
0.010000002 
0.010000002 
0.010000002 
+0

Capisco cosa intendi, ma esiste un tipo diverso in cui posso cambiarlo per evitare questo problema? – mike

+1

sì, ad esempio 'np.float64' .. ma si noti che non evita il" problema ", ma rende l'errore più piccolo. – wim

+1

classic leaky astrstration (http://www.joelonsoftware.com/articles/LeakyAbstractions.html). Benvenuto nei galleggianti. – Simon

0

Nota sembra che ci sia un problema con la funzione di pitone round e numpy.float64 tipi. Vedere il seguente esempio:

In [88]: round(np.float64(16.259766999999947), 4) 
Out[88]: 16.259799999999998 

L'unico modo ho potuto risolvere questo problema è quello di convertire il numpy.float64 ad un galleggiante prima di utilizzare la funzione di turno come di seguito:

In [89]: round(float(np.float64(16.259766999999947)), 4) 
Out[89]: 16.2598 
+0

Questo metodo non sembra funzionare per me. Se 'x = 5672.1001', quindi' np.round (float (np.float64 (x)), 1) 'produce' 5672.1000000000004'. –

Problemi correlati