Autor |
Beitrag |
Enzo
Hält's aus hier
Beiträge: 11
|
Verfasst: Do 09.02.06 18:02
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
      
Beiträge: 510
Win XP Prof
Delphi 7 E
|
Verfasst: 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 
Hält's aus hier
Beiträge: 11
|
Verfasst: 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
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Do 09.02.06 20:47
floattostr und das da einfach rein sollte doch gehen Oo
|
|
Enzo 
Hält's aus hier
Beiträge: 11
|
Verfasst: 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 Christian S.: Code-Tags hinzugefügt
|
|
Allesquarks
      
Beiträge: 510
Win XP Prof
Delphi 7 E
|
Verfasst: 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
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: 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
      
Beiträge: 510
Win XP Prof
Delphi 7 E
|
Verfasst: 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
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: 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 
Hält's aus hier
Beiträge: 11
|
Verfasst: 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
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Do 09.02.06 22:03
1137471660 gibt auch der window rechner bei der umwandlung von hex to float aus
|
|
Allesquarks
      
Beiträge: 510
Win XP Prof
Delphi 7 E
|
Verfasst: 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 
Hält's aus hier
Beiträge: 11
|
Verfasst: 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
      
Beiträge: 510
Win XP Prof
Delphi 7 E
|
Verfasst: 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 
Hält's aus hier
Beiträge: 11
|
Verfasst: 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
      
Beiträge: 102
Win 2K, Win XP
Delphi 2006 Arch., Delphi 6 Ent., MS-SQL 2005 & 2000
|
Verfasst: Do 09.02.06 22:37
Hallo Enzo,
hab Deine Nachfrage zum Thread von gestern 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
_________________ Man muß sparn wo mn knn !
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Do 09.02.06 23:40
Ohne extra Variable und absolute Vergewaltigung:
Delphi-Quelltext 1:
| PInteger(@mysingle)^ := $43CC70AC; |
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|