Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
24.11.2014, 13:44 (Dieser Beitrag wurde zuletzt bearbeitet: 24.11.2014 14:05 von sumsi.)
Mein Gerät gibt mir einen HEX-String im IEEE-754 Format als Ergebnis zurück, welchen ich in eine Zahl zur weiteren Verrechnung umwandeln muss.
Dabei habe ich folgendes Format:
SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM
Von Hand habe ich bereits eine Zahl umgewandelt, ich komme bei 39 B1 B0 EB auf ca. 5,28*10^-5.
In Labview habe ich dies noch nicht erreicht.
Dabei gehe ich folgendermaßen um:
Ich wander HEX in Binär um, für S ergibt sich ein positives Vorzeichen. Als Exponent E ergibt sich 114.
M rechne ich folgendermaßen um: 1. Bit * 1, 2. Bit mal 1/2, 3. Bit mal 1/4 usw.
Am Ende ergibt die Summe aus M*^(E-127) mein Ergebnis.
Um dies zu lösen habe ich schon einiges probiert, u.a. mit TypeCast in SGL umwandeln, Hexadezimalstring in Zahl, bin aber noch nicht auf das richtige Ergebnis gekommen. Habe auch schon einige Varianten aus dem Forum probiert, bis jetzt hat nichts geholfen.
Kann ich dies einfach lösen bzw. gibt es die möglichkeit meinen HEX-String in Binär zu wandeln, um daraus meinen Wert zu berechnen?
Mal ins Blaue geraten... der HEX-String sollte als Zahl 0.000338919 ergeben?
Üblicherweise sind solche Umrechnungen immer Typecast/Unflatten Operationen. Dabei gibt's dann halt noch eine paar Eigenheiten bzgl. Stringdarstellung u./o. Endianess.
ich habe mir jetzt mal eure Vorschläge angeschaut, erstelle ich mir diese in LabView so erhalte ich das gleiche Ergebnis wie macmarvin.
Inzwischen habe ich in meiner Berechnung per Hand noch einen Fehler gefunden, sodass ich für 39 1B B0 EB nun als Ergebnis ca. 1,48*10^-4 erhalte und für C1 48 00 00 ergibt sich -12,5. Die -12,5 kann ich mit der Umwandlung von GerdW nachfolziehen und erhalte auch diese als Ergebnis.
Nun habe ich mir ein kleiner Programm erstellt, welches mir einen Binär-Wert in String umwandelt und die entsprechenden Binärfolgen eingegeben.
für 39 1B ... erhalte ich mein von Hand gerechnetes Ergebnis von 1,48*10^-4
für C1 48 ... erhalte ich -12,5 (sowohl über Variante von GerdW und Handrechnung nachvollziehbar)
Wo liegt jetzt der Fehler? Bin ich zu blöd das ganze von Hand auszurechnen oder ist in meinem VI ein Fehler integriert? Falls ich mein VI nutzen möchte muss ich jedoch vorab meine HEX-Werte noch in Binärcode umwandeln. Wie geht dies?
Ich habe inzwischen gemerkt, dass die Mantisse nicht nur aus 23 Bits besteht sondern das als Bit 1 noch eine 1 hinzugefügt ist.
Kann mir jemand weiterhelfen? Steh grad irgendwie total auf der Leitung.
Vielen Dank
25.11.2014, 09:26 (Dieser Beitrag wurde zuletzt bearbeitet: 25.11.2014 09:55 von jg.)
Habe mir den Thread jetzt auch angeschaut. Aus rein schöngeistigem Interesse, es ist also gewissermaßen off-Toppic, habe ich die manuelle Konvertierung von #4, #5 so verschlimmbessert:
Das ist aber alles keine Konvertierung nach IEE754, sondern nur eine amateurhafte "Vorstudie" dazu. Denn die Sonderfälle (Überlauf, Unterlauf, NaN, Ínf, -Inf, 0, -0) gehören auch zur Norm und sind hier nicht mit implementiert.
So, bin gerade mal wieder an dieser Stelle am weiterbasteln und inzwischen auf ein neues Problem gestoßen.
Warum macht es einen Unterschied, ob ich meinen Hex-String als normalen String (in Hex-Darstellung) oder direkt als Hex-String (mit Zahl nach Hex-String erzeugt) an meinen Typecast anlege?
wenn ich z.B. 41A0 als normalen String angebe, erhalte ich 20 (gewünschtes Ergebnis), bei Hex-String 1,65081E-7 als Ergebnis? Was mache ich hier schon wieder falsch?
Schon mal Danke für Lösungsvarianten.
Sumsi
15.04.2015, 15:22 (Dieser Beitrag wurde zuletzt bearbeitet: 15.04.2015 15:23 von GerdW.)
Du hast noch nicht verstanden, wie Daten im Speicher abgelegt werden und wie sie interpretiert werden…
Zitat:Hex-String als normalen String (in Hex-Darstellung)
Dies würde ich nicht als "normalen String", sondern als "String in Hex-Darstellung" bezeichnen.
Zitat:direkt als Hex-String (mit Zahl nach Hex-String erzeugt)
Das wiederum ist ein "normaler String"…
Zitat:wenn ich z.B. 41A0 als normalen String angebe, erhalte ich 20 (gewünschtes Ergebnis), bei Hex-String 1,65081E-7 als Ergebnis?
Das muss also heißen: wenn ich z.B. 41A0 als String in Hex-Darstellung angebe, erhalte ich 20 (gewünschtes Ergebnis), bei "normalem String" 1,65081E-7 als Ergebnis?
Das Problem ist: das Typecast erwartet eine bestimmte Abfolge von Daten, hier 4 Bytes, um sie in einen SGL umzuwandeln. Du musst diese 4 Bytes bereitstellen, und zwar so, wie es im Standard IEEE754/854 beschrieben wird!
Ob du diese 4 Bytes als U8-Array oder als String bereitstellst, ist dabei nebensächlich. Wichtig ist nur, dass es eben 4 Bytes mit den korrekten Datenwerten sind…