Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   FreePascal Nicht nachvollziehbares NaN (https://www.delphipraxis.net/166607-nicht-nachvollziehbares-nan.html)

implementation 21. Feb 2012 15:29

Delphi-Version: 5

Nicht nachvollziehbares NaN
 
Hallo liebe Forengenossen,

irgendwie bin ich heute blind. An folgender Stelle bekomme ich immer NaN raus und finde meinen Fehler nicht :shock:

Delphi-Quellcode:
procedure SummonScreenfill(const callback: TStatPointEvent; const iter: TIteration; const col: TIterColorization; const w: complex; const x1,x2,y1,y2: double);
var x,y: word; itc: byte; fix: complex; at: complex;
begin
  for y := 0 to 479 do
    for x := 0 to 639 do begin
      at.r := x*((x2-x1)/640)+x1;
      if ((x2-x1))=nan then Writeln('oops =(');
      at.i := y*((y2-y1)/480)+y1;
      if at.i=nan then Writeln(':(');
      fix := iter(at,w,itc);
      callback(x,y,col(itc,fix));
    end;
end;
Laut Writeln sind x1=-1 und x2=1 (sowie y1=-1, y2=1). Demnach müsste x2-x1 doch =2 sein, oder erliege ich da einer geistigen Umnachtung? Aber nein, es werden immer brav 'oops =(' und ':(' ausgegeben.
Was mache ich falsch? :cry:

Medium 21. Feb 2012 15:38

AW: Nicht nachvollziehbares NaN
 
Subtraktion und Addition können eigentlich nie NaN sein, es sei denn ein beteiligter Operand ist NaN - dann ist es das Ergebnis immer. Ich würde aber zunächst den Vergleich mit "nan" raus werfen, da es eine ganze Menge verschiedener NaNs gibt. Nimm da besser mal die Math.IsNan() Funktion, und schau was dabei rum kommt. (Die Konstante "nan" kannte ich bisher nichtmals :))

Edit: Auch ggf. interessant
Zitat:

Zitat von Wikipedia
Vergleicht man zwei NaNs auf Gleichheit, dann besteht Ungleichheit.


Bummi 21. Feb 2012 15:42

AW: Nicht nachvollziehbares NaN
 
Ich kenne mich mit Freepascal nicht aus unter Delphi ist NaN = 0.0 / 0.0
so daß
Delphi-Quellcode:
 x1 := 1;
 x2 := 1;
 if (x1+x2) = nan then Showmessage('Err');
das bereits zu einer Exception führt, gibt es bei Dir IsNan() ?

himitsu 21. Feb 2012 15:43

AW: Nicht nachvollziehbares NaN
 
Die Konstante NaN ist zum manuellen Setzen da.
IsNan ist zum Prüfen.

Genauso wie beim Infinity, NegInfinity und IsInfinite,
bzw. wie beim True und dem IF.

Delphi-Quellcode:
if ((x2-x1))=nan then Writeln('oops =(');

Hätte man auch vor der Schleife prüfen können. Ändern tut es sich ja nicht.


Ach ja, wie NaN und Infinity ausgewertet werden, hängt von den FPU-Einstellungen ab.
NaN könnte auch locker mal als 0 interpretiert werden.

implementation 21. Feb 2012 15:49

AW: Nicht nachvollziehbares NaN
 
Ups, ja, ihr habt Recht :duck:
In Wirklichkeit ist es doch nicht NaN, sondern 2.

Tschuldigung :oops:

himitsu 21. Feb 2012 16:16

AW: Nicht nachvollziehbares NaN
 
Wozu eigentlich diese Prüfungen?

Du willst doch nicht etwa überwachen, ob es irgendwelche Überläufe, in den Berechnungen gab.
Dafür sollte selbst Lazarus eine passende Überlaufprüfung bereitstellen. :angle:

Namenloser 21. Feb 2012 16:50

AW: Nicht nachvollziehbares NaN
 
Zitat:

Zitat von Medium (Beitrag 1152157)
Edit: Auch ggf. interessant
Zitat:

Zitat von Wikipedia
Vergleicht man zwei NaNs auf Gleichheit, dann besteht Ungleichheit.


Interessanter ist hier, was nicht im Artikel steht: Wenn man einen konkreten Wert mit NaN vergleicht, kommt (anscheinend) immer Gleichheit heraus.

[edit]
Btw, was auf Wikipedia steht, stimmt zumindest unter meinem Delphi mit Standard-FPU-Einstellungen auch nicht. Ich habe gerade mal ein kleines Testprogramm geschrieben – egal, was man mit NaN vergleicht, sei es irgendeine Beliebige Zahl, NaN oder Infinity, es kommt immer True heraus.
[/edit]

Warum das so festgelegt wurde, weiß ich auch nicht. Ich bin auch schon ein paar mal darüber gestolpert, aber nicht weil ich mit der Konstanten NaN verglichen hätte, sondern weil ich zwei Variablen verglichen habe, von denen eine „zufälligerweise“ NaN war.


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