Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi floatingpoint Werte aus Datei auslesen? (https://www.delphipraxis.net/29950-floatingpoint-werte-aus-datei-auslesen.html)

eXistence 17. Sep 2004 09:15


floatingpoint Werte aus Datei auslesen?
 
hi,
ich versuche mich gerade an einem Datei-Konverter. Die Quelldatei liegt Binär vor und ich hab ne Doku an welcher Stelle welche Werte hinterlegt sind.
Characters und Integer-Werte kann ich auch problemlos auslesen, nur an den floatingpoint-Werten scheitere ich bislang.
ich weiß zwar, wie sie aufgebaut sein sollten, aber irgendwie komme ich trotzdem nicht weiter.

Gibts irgendwo ein Tutorial oder ne Anleitung, damit ich ne ungefähre Vorstellung davon bekomme, wie das funktionieren sollte?
(die Such-Funktion brachte mich leider nicht weiter...)

So funzt es erwartungsgemäß nicht:
Delphi-Quellcode:
function TForm1.GetDouble(scrStream : TStream; iPos : integer) : double;
var   dDouble      :   double;

begin
  scrStream.seek(iPos, soFromBeginning);
  scrStream.readbuffer(dDouble, 8);

  stats.Lines.Add(FloatToStrF(dDouble, ffFixed, 15, 10));


  Result := 1;

end;
zwar bekomme ich einen Wert, aber er entspricht nicht dem, was dort eigentlich stehen sollte...

Aufbau sieht laut Doku so aus:

Delphi-Quellcode:
bit 63                                                   0
+---+-----------+----------------------------------------+
|s | e10..e0   |          f51..f0                       |
|   |           |                                        |
+---+-----------+----------------------------------------+

1 bit  11 bits                    52 bits
Hat jemand nen Tipp für mich, wie ich da vorgehen muss?

Dax 17. Sep 2004 14:39

Re: floatingpoint Werte aus Datei auslesen?
 
Weisst du, wie die Float-Werte gespeichert wurden?
Ob Big- oder Small-Endian macht da nämlich schon einen Unterschied.
Oder ganz banal: Vielleicht wurde ein Single-, Real- oder Extended-Wert geschrieben, anstatt Double zu benutzen.

Insider2004 18. Sep 2004 11:57

Re: floatingpoint Werte aus Datei auslesen?
 
Was bekommst du denn?

eXistence 20. Sep 2004 09:12

Re: floatingpoint Werte aus Datei auslesen?
 
Laut Doku handelt es sich um "IEEE-IEEE-754 Big-Endian Floating Point (Sun, SGI, Convex, HP)"

der Floatingpoint-wert soll sich dann folgendermaßen berechnen:

(-1)**s * 2**(e-1023) * 1.f

(bezogen auf den vorher geposteten Aufbau)

"s" gibt einfach das Vorzeichen an, "e" habe ich als integer-wert ausgelesen, Kopfzerbrechen bereitet mir aber noch f.
Es gibt in Delphi keinen 64bit-unsigend-integer-typ... was mache ich also mit dieser 52-bit-zahl?
Wie lese ich diesen Teil also aus und wie hänge ich ihn an die 1 dran?

oder gibts noch ne andere Variante?


EDIT:
@Insider2004: mit "scrStream.readbuffer(dDouble, 8);" bekomme ich z.B. 1,62211632842598E-319 raus, obwohls eigentlich 512 sein sollte...
die entsprechenden bytes im Hex-Editor sehen so aus: 40 80 00 00 00 00 00 00

Steve 20. Sep 2004 14:23

Re: floatingpoint Werte aus Datei auslesen?
 
Lies die Zahl Byte für Byte (Byte1, Byte2, ... Byte8) ein, ändere die Reihenfolge der Bytes (Byte8, Byte7, ... Byte1), setz die Bytes wieder zusammen und Du hast den "Delphi-Double"

Gruß
Stephan

eXistence 20. Sep 2004 14:51

Re: floatingpoint Werte aus Datei auslesen?
 
@Steve: danke, du bist mein Held des Tages =)
an dem Problem knabber ich nun schon seit Tagen...


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz