![]() |
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:
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:
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; 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 ? |
AW: Arbeiten mit Nan
Unit System.Math bietet die Funktion
Delphi-Quellcode:
. Vielleicht reicht das schon.
IsNan
|
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:
recht unzuverlässig ist.
Const
cNaN = 0.0 / 0.0; 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:
Hier sind nur die Zeilen für den Datentype Singe, da Du diesen verwendest.
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; 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: ![]() 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 ![]() Leider ist dort der derzeitige Fake-Domain ![]() Viel Erfolg! Gruß, Andreas |
AW: Arbeiten mit Nan
Du könntest dort ja ein "Issue" aufmachen und dir die Umstellung der dort angegebenen Domain wünschen...
|
AW: Arbeiten mit Nan
Zitat:
|
AW: Arbeiten mit Nan
Das hängt mit der internen Kodierung von Gleitkomma-Zahlen nach dem IEEE 754 – Standard zusammen: Siehe z. B.:
![]() 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 10:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz