Autor Beitrag
Enzo
Hält's aus hier
Beiträge: 11



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 510

Win XP Prof
Delphi 7 E
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Do 09.02.06 20:47 
floattostr und das da einfach rein sollte doch gehen Oo
Enzo Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Do 09.02.06 20:55 
Der Standard IEEE 754 sieht folgende rechnerinterne Darstellung für eine Gleitkommazahl vor:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 510

Win XP Prof
Delphi 7 E
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 510

Win XP Prof
Delphi 7 E
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Do 09.02.06 21:48 
Zitat:
ich muss die Zahl ihn HEX 43CC70AC ihn Float umwandeln


ist für mich eindeutig

ausblenden Delphi-Quelltext
1:
2:
  floatzahl := $43CC70AC;
  caption := floattostr(floatzahl);
Enzo Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Do 09.02.06 22:03 
1137471660 gibt auch der window rechner bei der umwandlung von hex to float aus
Allesquarks
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 510

Win XP Prof
Delphi 7 E
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 510

Win XP Prof
Delphi 7 E
BeitragVerfasst: Do 09.02.06 22:20 
Weiß zwar immer noch nicht was was du tun willst aber

ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 102

Win 2K, Win XP
Delphi 2006 Arch., Delphi 6 Ent., MS-SQL 2005 & 2000
BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Do 09.02.06 23:40 
Ohne extra Variable und absolute Vergewaltigung:

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

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit