double-Vergleich mit NaN, Infinity
-
- Beiträge: 292
- Registriert: Sa 5. Feb 2011, 20:38
- OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
- CPU-Target: 32Bit
- Wohnort: Wien
double-Vergleich mit NaN, Infinity
Hi,
ich wuerde gerne einige Vergleiche von doubles mit dem <> Operator anstellen. Diese doubles koennen jedoch auch die "Werte" NaN und Infinity annehmen, was bei jedem Vergleich einen SIGFPE erzeugt.
Kann ich diesen Verhalten mit einem Compiler switch aendern (dass beispielsweise (a <> b) true liefert, wenn a = 34.34 und b = NaN) oder muss ich mir da einen eigenen Operator bauen, der diesen Vergleich implementiert?
IsNaN moechte ich hier nicht verwenden, weil's den Code einfach verkompliziert.
Danke!
ich wuerde gerne einige Vergleiche von doubles mit dem <> Operator anstellen. Diese doubles koennen jedoch auch die "Werte" NaN und Infinity annehmen, was bei jedem Vergleich einen SIGFPE erzeugt.
Kann ich diesen Verhalten mit einem Compiler switch aendern (dass beispielsweise (a <> b) true liefert, wenn a = 34.34 und b = NaN) oder muss ich mir da einen eigenen Operator bauen, der diesen Vergleich implementiert?
IsNaN moechte ich hier nicht verwenden, weil's den Code einfach verkompliziert.
Danke!
- corpsman
- Lazarusforum e. V.
- Beiträge: 1629
- Registriert: Sa 28. Feb 2009, 08:54
- OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
- CPU-Target: 64Bit
- Wohnort: Stuttgart
- Kontaktdaten:
Re: double-Vergleich mit NaN, Infinity
was ist mit ?
Code: Alles auswählen
try
c := a<>b;
except
c := true;
end;
--
Just try it
Just try it
-
- Beiträge: 292
- Registriert: Sa 5. Feb 2011, 20:38
- OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
- CPU-Target: 32Bit
- Wohnort: Wien
Re: double-Vergleich mit NaN, Infinity
Ich kann es grad nicht ausprobieren, aber ich befuerchte, dass
auch eine SIGFPE ausloesen wuerden, obwohl sie gleich sind ...
Code: Alles auswählen
a := NaN;
b := NaN;
-
- Beiträge: 321
- Registriert: Sa 21. Mär 2009, 17:31
- OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
- CPU-Target: 64 Bit
Re: double-Vergleich mit NaN, Infinity
Da gibt es das für: http://www.freepascal.org/docs-html/rtl ... nmask.html" onclick="window.open(this.href);return false;
Keine Ahnung, ob es funktioniert.
Und isNan kann bei älteren fpc-Versionen auch SIGFPE auslösen, wenn man nan-Werte übergibt
Keine Ahnung, ob es funktioniert.
Und isNan kann bei älteren fpc-Versionen auch SIGFPE auslösen, wenn man nan-Werte übergibt
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: double-Vergleich mit NaN, Infinity
Jedi helps:
http://wiki.delphi-jedi.org/wiki/JCL_Help:IsNaN@Double" onclick="window.open(this.href);return false;
The implementation is:
function IsNaN(const Value: Double): Boolean; overload;
begin
Result := FloatingPointClass(Value) = fpNaN;
end;
(FloatingPointClass) is implemented in ASM.
-Michael
http://wiki.delphi-jedi.org/wiki/JCL_Help:IsNaN@Double" onclick="window.open(this.href);return false;
The implementation is:
function IsNaN(const Value: Double): Boolean; overload;
begin
Result := FloatingPointClass(Value) = fpNaN;
end;
(FloatingPointClass) is implemented in ASM.
-Michael
-
- Beiträge: 292
- Registriert: Sa 5. Feb 2011, 20:38
- OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
- CPU-Target: 32Bit
- Wohnort: Wien
Re: double-Vergleich mit NaN, Infinity
Hi Michael, sorry - wie hilft mir die weiter, was ist der Unterschied zu Math.IsNaN() die ich nicht verwenden moecht?
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: double-Vergleich mit NaN, Infinity
Den Sinn von "möchte ich nicht verwenden" habe ich nicht verstanden.Eclipticon hat geschrieben:Hi Michael, sorry - wie hilft mir die weiter, was ist der Unterschied zu Math.IsNaN() die ich nicht verwenden moecht?
-Michael
-
- Beiträge: 292
- Registriert: Sa 5. Feb 2011, 20:38
- OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
- CPU-Target: 32Bit
- Wohnort: Wien
Re: double-Vergleich mit NaN, Infinity
Ich meinte damit, ich moechte keine Konstruktion wie
verwenden, sondern haette lieber das Verhalten des = oder <> Operators geaendert, wenn das moeglich ist.
SetExceptionMask werd ich mal testen, danke!
Code: Alles auswählen
Equal := (IsNan(a) and IsNan(b)) or (IsInfinity(a) and IsInfinity(b)) or (a=b));
SetExceptionMask werd ich mal testen, danke!