2014-11-24 15 views
13

Zajmuję się problemami zmiennoprzecinkowymi w funkcji Pandas read_csv. W moim dochodzeniu, znalazłem to:Numpy float64 vs Python float

In [15]: a = 5.9975 

In [16]: a 
Out[16]: 5.9975 

In [17]: np.float64(a) 
Out[17]: 5.9974999999999996 

Dlaczego wbudowane float Pythona i np.float64 typ z Pythona daje różne wyniki? Myślałem, że są to zarówno podwójne C++?

+1

Należy również zauważyć, że funkcja 'read_csv' Pandy używa własnej superszybkiej konwersji typu string-to-float, która jest * nie * poprawnie zaokrąglona. Zatem po wyeksportowaniu wartości i ponownym jej odczytaniu, odzyskana wartość może wynieść 1 lub 2 uly różną od oryginału. –

Odpowiedz

12
>>> numpy.float64(5.9975).hex() 
'0x1.7fd70a3d70a3dp+2' 
>>> (5.9975).hex() 
'0x1.7fd70a3d70a3dp+2' 

Są one takie same. Czym różnią się ich reprezentacje; rodzimy typ Pythona używa reprezentacji "zdrowej", a typ NumPy używa dokładnej reprezentacji.

+0

Przez reprezentację masz na myśli sposób, w jaki jest drukowany na ekranie? – mchangun

+0

Za pomocą metody '__repr __()' lub jej odpowiednika na poziomie C, tak. –

+1

Prawdziwie * dokładna * reprezentacja faktycznie byłaby 5,99749999999999960920149533194489777088165283203125, która jest dokładną wartością dziesiętną 64-bitowego float, który otrzymasz, gdy oceniasz literał "5.9975". –