![]() |
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:
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.
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; Was mache ich falsch? :cry: |
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:
|
AW: Nicht nachvollziehbares NaN
Ich kenne mich mit Freepascal nicht aus unter Delphi ist NaN = 0.0 / 0.0
so daß
Delphi-Quellcode:
das bereits zu einer Exception führt, gibt es bei Dir IsNan() ?
x1 := 1;
x2 := 1; if (x1+x2) = nan then Showmessage('Err'); |
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. |
AW: Nicht nachvollziehbares NaN
Ups, ja, ihr habt Recht :duck:
In Wirklichkeit ist es doch nicht NaN, sondern 2. Tschuldigung :oops: |
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: |
AW: Nicht nachvollziehbares NaN
Zitat:
[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 18:03 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-2025 by Thomas Breitkreuz