| Autor | Beitrag | 
| Enzo Hält's aus hier
 Beiträge: 11
 
 
 
 
 | 
Verfasst: Do 09.02.06 17: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 17: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 18: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 19: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 19: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 20: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 20: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 20: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 20: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 20: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 21: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 21: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 21: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 21: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 21: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 21: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 22: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
 | 
|  |