IEEE 754, single precision in Python
Verfasst: Montag 30. März 2009, 17:41
Hallo zusammen,
IEEE 754 schreibt vor, wie eine Gleitkommazahl mit einfacher Genauigkeit zu bilden ist. Die Frage ist, ob Python schon mit entsprechenden Zahlen arbeitet und wie das Datenformat ist.
Hintergund: Ein Stückchen Hardware liefert genau solche Werte und ich muß diese Werte lesen, verstehen und ggf. verändert wieder schreiben können. Das heißt, ich lese 4 Bytes und schreibe 4 Bytes. Mein Python läuft auf Windows.
Ich habe mir mal das Beispiel aus Wikipedia hergenommen:
http://de.wikipedia.org/wiki/IEEE_754
und einwenig Codiert, um an die Byterepräsentation einer Fließkommazahl zu kommen:
So, wenn man sich die 4 Bytes [0x33, 0x33, 0x93, 0x41] anguckt und sie binär aufschreibt, erhält man:
etwas umsortieren hilft und man kommt zu der Darstellung im wiki-Beispiel:
Jetzt frage ich mich nun: Wie liddle- oder big-endian ist das, was ich da sehe, eigentlich? Ist meine Interpretation der Zahlen richtig?
Gruß und Danke,
Christoph
PS: Gibt es eine elegantere Methode, um an die Bytes zu kommen?
PPS: Kann mir jemand sagen, warum im obigen Beispiel
zu einem Absturz der Python-Konsole führt?
IEEE 754 schreibt vor, wie eine Gleitkommazahl mit einfacher Genauigkeit zu bilden ist. Die Frage ist, ob Python schon mit entsprechenden Zahlen arbeitet und wie das Datenformat ist.
Hintergund: Ein Stückchen Hardware liefert genau solche Werte und ich muß diese Werte lesen, verstehen und ggf. verändert wieder schreiben können. Das heißt, ich lese 4 Bytes und schreibe 4 Bytes. Mein Python läuft auf Windows.
Ich habe mir mal das Beispiel aus Wikipedia hergenommen:
http://de.wikipedia.org/wiki/IEEE_754
und einwenig Codiert, um an die Byterepräsentation einer Fließkommazahl zu kommen:
Code: Alles auswählen
>>> from ctypes import c_float, c_uint8, cast, POINTER
>>> pFloat = (c_float*1)()
>>> byteArray = cast(pFloat, POINTER(c_uint8))
>>> pFloat[0] = 18.4
>>> [byteArray[i] for i in range(0,4)]
[51, 51, 147, 65]
>>> pFloat[0]
18.399999618530273
Code: Alles auswählen
0011 0011 0011 0011 1001 0011 0100 0001
6 7 4 5 2 3 0 1
Code: Alles auswählen
0_100 0001 1_001 0011 0011 0011 0011 0011
Vorzeichen _ Exponent _ Mantisse
Gruß und Danke,
Christoph
PS: Gibt es eine elegantere Methode, um an die Bytes zu kommen?
PPS: Kann mir jemand sagen, warum im obigen Beispiel
Code: Alles auswählen
>>> [a for a in byteArray]