double-Vergleich mit NaN, Infinity

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Eclipticon
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

Beitrag von Eclipticon »

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!

Benutzeravatar
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

Beitrag von corpsman »

was ist mit ?

Code: Alles auswählen

try
c := a<>b;
except
c := true;
end;
--
Just try it

Eclipticon
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

Beitrag von Eclipticon »

Ich kann es grad nicht ausprobieren, aber ich befuerchte, dass

Code: Alles auswählen

a := NaN;
b := NaN;
auch eine SIGFPE ausloesen wuerden, obwohl sie gleich sind ...

BeniBela
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

Beitrag von BeniBela »

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

mschnell
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

Beitrag von mschnell »

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

Eclipticon
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

Beitrag von Eclipticon »

Hi Michael, sorry - wie hilft mir die weiter, was ist der Unterschied zu Math.IsNaN() die ich nicht verwenden moecht?

mschnell
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

Beitrag von mschnell »

Eclipticon hat geschrieben:Hi Michael, sorry - wie hilft mir die weiter, was ist der Unterschied zu Math.IsNaN() die ich nicht verwenden moecht?
Den Sinn von "möchte ich nicht verwenden" habe ich nicht verstanden.

-Michael

Eclipticon
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

Beitrag von Eclipticon »

Ich meinte damit, ich moechte keine Konstruktion wie

Code: Alles auswählen

Equal := (IsNan(a) and IsNan(b)) or (IsInfinity(a) and IsInfinity(b)) or (a=b));
verwenden, sondern haette lieber das Verhalten des = oder <> Operators geaendert, wenn das moeglich ist.

SetExceptionMask werd ich mal testen, danke!

Antworten