32bit binär nach 32bit float(Speziell)
-
Hi Alle,
mein Problem ist, das ich eine binäre 32bit
Zahl habe, die ich zwar nach 32bit float
umrechnen kann, aber ein anderes Ergebnis bekomme,
als z.b. von dem Linux Programm <ghex>(Gnome).
Das Programm ist dabei nicht entscheidend, alle
Hexeditoren haben mir den gleichen 32bit float wert
angezeigt.Der binär Wert ist:
00000000 00000000 10000000 10111111
Oder:
0000 0000 0000 0000 1000 0000 1011 1111
Oder:
0 00000000 00000001000000010111111Das erste bit besagt das es eine positive
32bit float Zahl ist.Die nächsten 8 bit sollen den Exponent ergeben.
Dazu rechnet man die 8bit in dezimal um, was 0 ist
und zieht davon 127 ab, dies ergibt -127.
Aslo würde die float Zahl normalerweise wie folgt
berechnet:
(1+2-8+2-16+2-18+2-19+2-20+2-21+2-22+2-23)*2^-127Wie auch immer müsste dies laut dem Programm eine 32bit
float Zahl sein:
1,000000e+00
Wobei in dem Programm Little Endian aktiviert ist.
Ist standardmäßig aktiviert. Deaktiviere ich es
kommt eine andere 32bit float Zahl raus.Wichtig ist mir zu wissen, nicht ob sein Ergebnis richtig
ist oder meins, sondern wie er darauf kommt. Sein
Ergebnis ist definitiv richtig, da ein fertiges octave
skript die gleichen 32bit float Zahlen ausgibt.
Dieses Skript wurden von Entwicklern geschrieben, deren
Software ich nutze...blablabla(unwichtig, außer Jemand
möchte es hören
)Hier noch eine zweites beispiel.
Die 32bit binär Zahl,
00000000 00000000 00000000 11000000
soll die 32bit float Zahl,
-2,000000e+00
ergeben.Oder die 32bit binär Zahl:
00000000 00000000 10010000 01000001
soll
+18
ergeben.Hat da Jemand ne Idee wie der hex Editor und das octave
skript auf diese 32bit float kommen ?In wikipedia steht noch was unter "Interpretation des
Zahlenformats":
http://de.wikipedia.org/wiki/IEEE_754
Dies habe ich aber leider nicht ganz verstanden.Grüße Markus
-
Du hast das Stichwort schon genannt: "Little Endian"
Während du den Binärwert direkt rechnen willst, interpretieren die Programme das als Speicherbereich im Little-Endian-Format.
Du rechnest also direkt mit
00000000 00000000 10000000 10111111Während unter Berücksichtigung des Little-Endian-Formats eigentlich das Wort
10111111 10000000 00000000 00000000die Grundlage für die Umrechnung bildet.
Trotzdem kommt da nicht 1,000000e+00 sondern -1,000000e+00 heraus. Da hast du wohl in deinem Beitrag geschludert.

Beim Rest sitmmt es aber:
00000000 00000000 00000000 11000000 Speicherbereich Little Endian 11000000 00000000 00000000 00000000 Datenwort -2.0 Float-Wert 00000000 00000000 10010000 01000001 Speicherbereich Little Endian 01000001 10010000 00000000 00000000 Datenwort 18.0 Float-Wert
-
Mitleid schrieb:
Du hast das Stichwort schon genannt: "Little Endian"
Während du den Binärwert direkt rechnen willst, interpretieren die Programme das als Speicherbereich im Little-Endian-Format.
Du rechnest also direkt mit
00000000 00000000 10000000 10111111Während unter Berücksichtigung des Little-Endian-Formats eigentlich das Wort
10111111 10000000 00000000 00000000die Grundlage für die Umrechnung bildet.
Trotzdem kommt da nicht 1,000000e+00 sondern -1,000000e+00 heraus. Da hast du wohl in deinem Beitrag geschludert.

Beim Rest sitmmt es aber:
00000000 00000000 00000000 11000000 Speicherbereich Little Endian 11000000 00000000 00000000 00000000 Datenwort -2.0 Float-Wert 00000000 00000000 10010000 01000001 Speicherbereich Little Endian 01000001 10010000 00000000 00000000 Datenwort 18.0 Float-WertHey, hab auch noch mal en frage.
würde aus
00000000 00000000 10000000 10111111im little endian nicht
11111101 00000001 00000000 00000000werden?
Gruss
-
muh@mäh schrieb:
Hey, hab auch noch mal en frage.
würde aus
00000000 00000000 10000000 10111111im little endian nicht
11111101 00000001 00000000 00000000werden?
Gruss
Um in Vokard-Manier zu antworten: Nope!
-
Also sind bytes immer in der gleichen order? da gibts kein little oder big endian? Und in größeren datentypen sind die bytes einfach ungedreht?
-
Es kommt darauf an, wie dein Prozessor gebaut ist. Grundsätzlich sind der Phantasie keine Grenzen gesetzt. Du könntest auch einen Prozessor löten, der jedes Bit im Speicher adressieren kann, dann könnte man es so organisieren, dass dein Behauptung von vorhin auch richtig ist.
Die Grenzen entstehen aber sobald es sinnvoll im Sinne von effizient sein soll. Und bei einer Speicherorganisation in Bytes macht es nur Sinn das Datenwort ebenfalls in Bytes aufzuteilen und diese dann unter bestimmten Konventionen im Speicher abzulegen (Big-Endian, Little-Endian, Alignment-Regeln, ...)
32Bit Datenworte werden von rechts nach links notiert, d.h. das "0te Bit" steht ganz rechts:
Bit 31 -> 01000001 10010000 00000000 00000000 <- Bit 0Also, ist auch das niedrigste Byte rechts.
Notationen von Speicherbereichen machen eigentlich nur Sinn, wenn die Speicheradressen auch dabei stehen. Geht man von Little Endian aus und notiert die Speicherstellen aufsteigend von links nach rechts, dann kannst du sagen die Bytes aus dem Datenwort werden "verdreht".
Speicher:
00000000 00000000 10010000 01000001 ________|________|________|________|________| Byte 305|Byte 306|Byte 307|Byte 308|Byte 309| ...Notiert man den Speicher anders, also z.B. absteigend von links nach rechts, dann verdreht sich nichts.
01000001 10010000 00000000 00000000 ________|________|________|________|________| Byte 315|Byte 314|Byte 313|Byte 312|Byte 311| ...Man muss einfach darauf achten, dass bei Little-Endian das niedriegste Byte (Bit 0 bis Bit 7) auf der niedriegsten Adresse ist und die anderen dann entsprechend anordnen.
-
danke

-
Hallo,
ich bin ganz offenbar im richtigen Forum. Folgendes Problem quält nicht: Aus einem Standalone-Messgerät aus den 90er Jahren lese ich einen Datenstream aus, direkt in den PC rein übr serielle SN.
Solange es um ascii geht alles easy. Aber es sind auch Zahlen in dem Stream, die in einem FP-Format abgelegt sein dürften.
Wenn mich nicht alles täuscht wird dafür ein 4-Byte Format verwendet. Aber trotz Tüftelns bekomme ich einfach nicht heraus, wie die Zahlen im Array abgelegt oder angeordnet sind. Beispiel: ich lese
b1 b2 b3 b4
0100.0000.0111.0010.1000.1111.0101.1010Das dürfte einem der vier Werte entsprechen, die ich zufällig auf dem Display des Messgerätes erkannt habe 55.5, 139.0, 39.8 oder 15.0.
Aber der Binär-String ist mit der gängigen EEE 7xxx-Codierung (S1e5m23 ..usw.) nicht in Einklang zu bringen.
KLeine Hilfe: Messgerät geöffnet und geschaut, welche CPU. Sieht aus wie ein 16 Bit Datenbus, CPU durch Kleber und Kratzer unkenntlich gemacht. Leider. Evtl Intel-kompatibles Zeug (also wohl: little endian).
Mehr habe ich nicht als Anhaltspunkte. Wer hat eine Ahnung, wie die Werte abgelegt oder "versteckt" sind?
Danke
Vick