Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Arbeiten mit Nan (https://www.delphipraxis.net/206582-arbeiten-mit-nan.html)

v2afrank 8. Jan 2021 14:21

Arbeiten mit Nan
 
Ich habe hier ein mit Delphi 2006 erstelltes Projenkt. Da bekomme ich über eine Schnittstelle einen Datenstrom und wandle diesen Wert in eine Floatzahl um. Jetzt kam ein Hardwareker darauf mir unter Umständen ein Nan zu senden. Dabei knallt es jetzt bei mir. Ich habe das mal auf folgende Funktion runtergebrochen
Delphi-Quellcode:
function HexAsciiStr2Float(str: Cardinal): Extended;
var
  n: Integer;
  p: ^byte;
  p2: ^byte;
  s: single;
begin
  s := 0;
  p := @s;
  p2 := @str;

  for n := 1 to 4 do
  begin
    p^ := p2^;
    inc(p, 1);
    inc(p2, 1);
  end;
  result := s;//Hier steht im debugger s='nan'
end;
procedure TForm1.Button1Click(Sender: TObject);
var Nan2:Cardinal;

begin
   NaN2:=$FFBFFFFF;
   HexAsciiStr2Float(Nan2);
end;
er durchläuft die HexAsciiStr2Float und hat auch in s bzw. in Result NAN drinstehen. Wenn das Programm dann allerdings zu Button1click zurückspringt kommt eine Fehlermeldung illegale Gleitkommaoperation. Warum ? Wie kann ich das abfangen. Laut Hardware gibt es bei Ihnen folgende NANS:
Quiet NANs (+): 7FC00000 - 7FFFFFFF
Quiet NANs (-): FFC00001 - FFFFFFFF

Signalling NANs (+): 7F800001 - 7FBFFFFF
Signalling NANs (-): FF800001 - FFBFFFFF

Da bin ich jetzt echt überfragt. Kann mir jemand helfen ?

Uwe Raabe 8. Jan 2021 14:31

AW: Arbeiten mit Nan
 
Unit System.Math bietet die Funktion
Delphi-Quellcode:
IsNan
. Vielleicht reicht das schon.

Andreas13 8. Jan 2021 16:00

AW: Arbeiten mit Nan
 
Hallo,
meine frühere Erfahrung mit Delphi 5 hat gezeigt, daß die damals in System.pas (heute: System.Math.pas) verwendete Deklaration NaN für "Not a Number"
Delphi-Quellcode:
Const
  cNaN = 0.0 / 0.0;
recht unzuverlässig ist.
Seither benutze ich daher die Bibliothek AMath.pas "Unit für akkurate mathematische Methoden" von Wolfgang Ehrhardt (= unser verstorbener Gammatester), die immer zuverlässig funktioniert. Er hat u. a. dort folgende Deklarationen benutzt:
Delphi-Quellcode:
Const
  NaNSHex    : THexSglA = ($ff,$ff,$ff,$7f); {a single quiet NaN as hex}
  sNaNSHex   : THexSglA = ($01,$00,$80,$7f); {a single signaling NaN as hex}
...
VAR
    NaN_s      : single absolute NaNSHex;      {a single quiet NaN}
    sNaN_s     : single absolute sNaNSHex;     {a single signaling NaN}
...
function IsNaNS(s: single): boolean;
  {-Return true if s is a NaN}
var
  L: longint absolute s;
begin
  IsNaNS := (L and $7F800000 = $7F800000) and (L and $7FFFFF <> 0);
end;
Hier sind nur die Zeilen für den Datentype Singe, da Du diesen verwendest.
Am besten benutzt Du gleich seine mathematische(n) Bibliothek(en) – welche System.Math.pas ersetzen und ergänzen – und u.a. im Webarchiv zu finden sind: http://web.archive.org/web/*/wolfgang-ehrhardt.de
Bitte hierbei beachten, daß Wolfgang Ehrhardt's letzter Datenbestand vom 28. Dezember 2018 stammt.

Im Jahre 2019 wurde sein Domain von Fremden übernommen ("gekapert") und sein bekannter Name wird derzeit mißbräuchlich für Glückspiele verwendet.

Eine Alternative zum Webarchiv ist https://github.com/chadilukito/www.wolfgang-ehrhardt.de
Leider ist dort der derzeitige Fake-Domain www.wolfgang-ehrhardt.de eingetragen. Vielleicht kann jemand, der dort die Berechtigung hat, den Eintrag ändern.

Viel Erfolg!
Gruß, Andreas

TurboMagic 10. Jan 2021 10:25

AW: Arbeiten mit Nan
 
Du könntest dort ja ein "Issue" aufmachen und dir die Umstellung der dort angegebenen Domain wünschen...

v2afrank 11. Jan 2021 06:49

AW: Arbeiten mit Nan
 
Zitat:

Zitat von Andreas13 (Beitrag 1480605)
Hallo,
meine frühere Erfahrung mit Delphi 5 hat gezeigt, daß die damals in System.pas (heute: System.Math.pas) verwendete Deklaration NaN für "Not a Number"
Delphi-Quellcode:
Const
  cNaN = 0.0 / 0.0;
recht unzuverlässig ist.
Seither benutze ich daher die Bibliothek AMath.pas "Unit für akkurate mathematische Methoden" von Wolfgang Ehrhardt (= unser verstorbener Gammatester), die immer zuverlässig funktioniert. Er hat u. a. dort folgende Deklarationen benutzt:
Delphi-Quellcode:
Const
  NaNSHex    : THexSglA = ($ff,$ff,$ff,$7f); {a single quiet NaN as hex}
  sNaNSHex   : THexSglA = ($01,$00,$80,$7f); {a single signaling NaN as hex}
...
VAR
    NaN_s      : single absolute NaNSHex;      {a single quiet NaN}
    sNaN_s     : single absolute sNaNSHex;     {a single signaling NaN}
...
function IsNaNS(s: single): boolean;
  {-Return true if s is a NaN}
var
  L: longint absolute s;
begin
  IsNaNS := (L and $7F800000 = $7F800000) and (L and $7FFFFF <> 0);
end;
Hier sind nur die Zeilen für den Datentype Singe, da Du diesen verwendest.
Am besten benutzt Du gleich seine mathematische(n) Bibliothek(en) – welche System.Math.pas ersetzen und ergänzen – und u.a. im Webarchiv zu finden sind: http://web.archive.org/web/*/wolfgang-ehrhardt.de
Bitte hierbei beachten, daß Wolfgang Ehrhardt's letzter Datenbestand vom 28. Dezember 2018 stammt.

Im Jahre 2019 wurde sein Domain von Fremden übernommen ("gekapert") und sein bekannter Name wird derzeit mißbräuchlich für Glückspiele verwendet.

Eine Alternative zum Webarchiv ist https://github.com/chadilukito/www.wolfgang-ehrhardt.de
Leider ist dort der derzeitige Fake-Domain www.wolfgang-ehrhardt.de eingetragen. Vielleicht kann jemand, der dort die Berechtigung hat, den Eintrag ändern.

Viel Erfolg!
Gruß, Andreas

Erst einmal vielen Dank. So hat es funktioniert. Ich hatte zuerst einen Aufruf mit IsNaN(s) drin, welches auch zu einer illegalen Gleitkommaoperation geführt hat. IsNaNS(s) hat aber funktioniert. Eigentlich würde mich ja interessieren was da los ist, allerdings glaube ich das ich es nicht verstehen werde

Andreas13 11. Jan 2021 09:49

AW: Arbeiten mit Nan
 
Das hängt mit der internen Kodierung von Gleitkomma-Zahlen nach dem IEEE 754 – Standard zusammen: Siehe z. B.: https://de.wikipedia.org/wiki/IEEE_754

Wolfgang Ehrhardt’s Bibliotheken sind exakt, fehlerarm und zuverlässig. Allerdings stellen sie einen ziemlich konzentrierten Code dar, der auch für die mathematisch versierten Benutzer oft schwer zu verstehen ist. Auch die spärlichen Kommentare erklären die Funktionsweise der einzelnen Routinen und deren Benutzung leider nicht ausreichend. Es wird immer auf Original-Publikationen und auf verwendete Quellen verwiesen. Seine Bibliotheken sind zwar sehr wertvoll, allerdings eine harte Kost, und der verborgene Schatz muß oft erst gehoben werden...

Aber in unserem Forum sind einige Unerschrockene dabei, die sich mit einigen Aspekten Gammatester’s Routinen auseinandersetzen und ihre Erkenntnisse der Allgemeinheit zur Verfügung stellen. An dieser Stelle herzlichen Dank an alle!
Gruß, Andreas


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:48 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