2014-05-20 12 views
5

Wenn ich eine float64 Nummer zu einer float32 Zahl ich ein seltsames Ergebnis erhalten konvertieren:float64 Umstellung auf float32 gibt unerwartetes Ergebnis

In [22]: np.float32(20140131.0) 
Out[22]: 20140132.0 

Warum ist das passiert?

+0

http://stackoverflow.com/questions/16963956/difference-between-python-float-and-numpy-float32 – Pavel

+3

http://www.binaryconvert.com/result_float.html?decimal=050048049052048049051049046048 – Pavel

Antwort

7

20140131.0 kann nicht als 32-Bit-Integer dargestellt werden.

32 bit float

64 bit float

mit Schwimmern, innerhalb jeder Reihe sind die Zahlen gleichmäßig beabstandet sind.

Also ist es (1 + M) * 2^(E)

so ist 20140131,0 im Bereich von 2^24 bis 2^25. Es gibt 16.777.216 Nummern in diesem Bereich, aber nur 8.388.608 darstellbare Floats. Sie können also nur gerade Zahlen darstellen.

Da in 32-Bit-Gleitkommazahlen nur 23 Bit für die Mantisse vorhanden sind, können ganze Zahlen nur bis zu 2^24 dargestellt werden. Darüber hinaus . Wobei epsilon die Differenz zwischen zwei benachbarten Gleitkommazahlen ist.

Wie für Python schwimmt, ich glaube, dass sie wie folgt arbeiten:

Floats in Python sind in der Regel nicht mehr als 32 Bit oder 64 Bit, so ist dies kein Problem. Die Länge wird automatisch angepasst. Kaufen Sie sie zu bestimmten Typen, so sehen Sie den Mangel an Auflösung. Mit 64-Bit-Ganzzahlen gibt es 52 Bits in der Mantisse, so dass Sie dieses Problem erst sehen, wenn Sie über 2^53 gehen.

Auch die Art und Weise, wie die Zahl auf den nächsten Gleitkommawert gerundet wird, wird normalerweise systemweit definiert (denke ich), aber Pythons Casting mag dies übersteuern, ich bin nicht ganz damit vertraut.