Entwickler-Ecke

Algorithmen, Optimierung und Assembler - IEEE754 Float in Hex


Enzo - Do 09.02.06 18:02
Titel: IEEE754 Float in Hex
Ich habe folgendes Problem: Ich muss die Zahl ihn HEX 43CC70AC ihn Float umwandeln,

das resultat ist 408.8802490234375


Bit 31 Sign Bit 0: + ,1: -

Bits 30 - 23 Exponent Field

Bits 22 - 0 Significand



Meine frage gibt es schon ein fertigen UNIT oder Komponenten oder kann mir jemand Helfen


Ich Bedanke mich

Gruss Enzo


Allesquarks - Do 09.02.06 18:44

Ich nehme mal an das soll ne sinlge float werden. bzw das ist sie schon. Sie ist ja schon binär geschrieben (oder von mir aus auch Hex ist ja dasselbe). Jetzt muss sie nur noch in eine float Variable geladen werden. Wie man das macht ist davon abhängig wie sie eingegeben wird. Das musst du schon dazusagen:

Im Edit-Feld, als array of char (packed non-packed), 32 Bit Variable, oder sonstwas.


Enzo - Do 09.02.06 19:13

Hallo Allesquarks

Es Soll ihn 32 Variable eingegeben werden, also ich gebe das ein 43CC70AC und

es dann soll es mir den Wert ihn Float geben (mit Vorzeichen, komma)


Gruss Enzo


F34r0fTh3D4rk - Do 09.02.06 20:47

floattostr und das da einfach rein sollte doch gehen Oo


Enzo - Do 09.02.06 20:55

Der Standard IEEE 754 sieht folgende rechnerinterne Darstellung für eine Gleitkommazahl vor:


Quelltext
1:
2:
3:
  +---+-------+------------------------------+
  | S |   E   |               F              |
  +---+-------+------------------------------+


Gearbeitet wird mit einer Zahlendarstellung zur Basis 2.

S - Vorzeichen (sign)
1 Bit
0 : Plus, 1 : Minus

E - Exponent
8 Bit (einfach genau), 11 Bit (doppelt genau)

F - Mantisse (fraction)
23 Bit (einfach genau), 52 Bit (doppelt genau)

Gruss enzo

Moderiert von user profile iconChristian S.: Code-Tags hinzugefügt


Allesquarks - Do 09.02.06 21:31

Du verkennst das Problem sofern es überhaupt existiert bzw. erkennst die Lösung nicht. Nebenbei ich weiß wie floats "intern" dargestellt sind. Und deine Hexabfolge codiert genau deine 808,bla in IEEE754 es ist also keine Umwandlung erforderlich, wenn du eine Speicherstelle hast, in der das genauso steht.
Deshalb meine Frage der Eingabe bzw Übergabe. Wenn das Ding so im Ram steht übergibst de nen Pointer und machst nen Typecast. Aber ich denke mal so weit bist du noch nicht, sondern du gibst sie ein also als character.

Deine Antwort bezüglich der Eingabe ist leider kein korrektes Deutsch. Deshalb nehme ich mal an du hast ein EditFeld:

Strtofloat wird das Problem eben nicht lösen, da wenn es überhaupt hex verarbeiten kann, was ich bezweifle bestimmt nicht erwartet, dass ein float fertig codiert eingegeben wird, dann ist ja keine Umwandlung mehr nötig, wofür die Funktion ja eigentlich da ist, sondern sie wird wenn überhaupt eine nach üblicher Schreibkonvention (aufsteigende Potenzen etc.) und mit einem Komma separierte Zahl erwarten. In IEEE754 steht ja kein Komma da (dafür gibt es kein Bit), denn der Standard definiert ja gerade wo es steht, muss also nicht mehr hingeschrieben werden nur beim rechnen beachtet werden, aber das macht die Hardware.
Oder du schreibst dir ne eigene Funktion, die die eingegebene Zahl an eine dword Speicherstelle packt (denn im editfeld ist jedes C,D,2,1 ein byte groß gepackt darf es aber nur 4 Bit groß sein) hierfür würde ich dir die Befehle shiftleft-right oder in Assembler shr shl empfehlen sowie die logischen Grundoperatoren.


F34r0fTh3D4rk - Do 09.02.06 21:40

ich sagte ja auch floattostr, wenn er da so gebraucht: floattostr(FFFFFF) sollte dasansich gehen, andersrum ist das ne andere sache


Allesquarks - Do 09.02.06 21:45

eben nicht erstens will er doch nen float bekommen und keinen string und außerdem gibt floattostr dann 408,bla aus und selbst wenn es Hex ausgibt, dann 27,CD oder so und eben keine.

Nebenbei wenn du an der Darstellung noch nen bischen fas änderst ginge das evt. mit dem Assembler-Befehl "loadbinarycodeddecimal", würde ich aber von abraten, da BCD's arg aus der Mode sind außerdem kann es sein, dass dieser Befehl auch nur integer lädt.


F34r0fTh3D4rk - Do 09.02.06 21:48

Zitat:
ich muss die Zahl ihn HEX 43CC70AC ihn Float umwandeln


ist für mich eindeutig


Delphi-Quelltext
1:
2:
  floatzahl := $43CC70AC;
  caption := floattostr(floatzahl);


Enzo - Do 09.02.06 21:59

Ich hab folgendes auprobiert



procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Text:=floattostr($43CC70AC);
end;


das Resultat ist 1137471660 und sollte aber 408.8802490234375

gruss enzo


F34r0fTh3D4rk - Do 09.02.06 22:03

1137471660 gibt auch der window rechner bei der umwandlung von hex to float aus


Allesquarks - Do 09.02.06 22:04

Jetzt schreib nochmal bitte genau was du tun möchtest.

CDFbla eingeben und 408,CD ausgegeben bekommen oder CDFbla eingeben und eine float variable erhalten mit der man weiterrechnet?...


Enzo - Do 09.02.06 22:12

Ich bekomme via Rs232 4Byte in Hex (43CC70AC) dieser Wert sollte ihn Float Umgewandelt
werden. Das es keine normale umwandlung geht es mit FLOATTOSTR nicht .

0 10000111 110011000111000010101100 = 43CC70AC
+---+-------+------------------------------+
| S | E | F |
+---+-------+------------------------------+


Gearbeitet wird mit einer Zahlendarstellung zur Basis 2.

S - Vorzeichen (sign)
1 Bit
0 : Plus, 1 : Minus

E - Exponent
8 Bit (einfach genau), 11 Bit (doppelt genau)

F - Mantisse (fraction)
23 Bit (einfach genau), 52 Bit (doppelt genau)


Allesquarks - Do 09.02.06 22:20

Weiß zwar immer noch nicht was was du tun willst aber


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var   mysingletemp:integer;   mysinglep:PSingle;   mysingle:single;
begin   
mysingletemp:=$43CC70AC;
mysinglep:=@mysingletemp;
mysingle:=mysinglep^;
floattostr(mysingle);
end;


Enzo - Do 09.02.06 22:35

Hallo Allesquarks
Genau das wollt ich, da ich mich mit dem Handbuch zu viel Beschaeftigt habe und im Handbuch Gleitkommazahlen Berechnung nach IEEE 754 verlangt wird ,bin fast verückt geworden mit (Rechnen un Umrechnen ) .

Und schau da mit wenigen Zeilen ist da Ergebnis RICHTIG.(Warum bin ich nicht draufgekommen???????)


ICH BEDANKE MICH VOM GANZEN HERZEN

Gruss Enzo


afk - Do 09.02.06 22:37

Hallo Enzo,

hab Deine Nachfrage zum Thread von gestern [http://www.delphi-forum.de/viewtopic.php?t=55625] gerade erst gesehen. Hier die Lösung von gestern nochmal vereinfacht:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
function HexToSingle(Value: String): Single;
var
  IntValue: Integer;
  FloatValue: Single absolute IntValue;
begin
  IntValue:=StrToInt('$'+Value);
  Result:=FloatValue;
end;

Das müßte das entsprechende Resultat bringen.

Gruß Axel


uall@ogc - Do 09.02.06 23:40

Ohne extra Variable und absolute Vergewaltigung:


Delphi-Quelltext
1:
PInteger(@mysingle)^ := $43CC70AC;