Seite 1 von 1

Nan() und If vergleich

Verfasst: 08.02.2024 00:15
von maddinvonfritz
Wenn ich folgenden Code ausführe ist der If Vergleich wahr, egal bei welcher Zahl.
Ist das richtig so und warum?

Code: Alles auswählen

Define.d Number = NaN(), Number1 = 1.2

If Number = Number1
  Debug "Number = " + StrD(Number1)
EndIf

Debug Number

Re: Nan() und If vergleich

Verfasst: 08.02.2024 07:52
von DarkDragon
Ich kann es gerade nicht testen am Telefon. Der Vergleich sollte immer falsch sein, nicht immer wahr. Wenn er immer wahr ist ist es ein bug.

https://stackoverflow.com/a/1573715

IEEE 754

Not a Number = keine Zahl und ist sowas wie "ich hab da was, weiß aber nicht was es ist, aber eine Zahl ist es nicht"

Re: Nan() und If vergleich

Verfasst: 08.02.2024 08:10
von STARGÅTE
Das ist ja komisch. Wieso ist das nicht schon früher aufgefallen.
Ich geh das mal als Bug posten.

Re: Nan() und If vergleich

Verfasst: 08.02.2024 09:58
von TroaX
Ich bin verwirrt. Warum prüfst du bitte NaN mit einer Fließkommazahl, wenn in der Hilfe folgendes steht:
Gibt den speziellen Fließkommawert zurück, welcher 'Not a Number' (keine Zahl) repräsentiert. Dieser Wert wird von ungültigen Berechnungen zurückgegeben, wie z.B. Berechnung der Quadratwurzel von einer negativen Zahl.
Und dazu steht da noch folgendes:
NaN ist ein spezieller Wert. Die Verwendung von NaN in jeglichen Berechnungen mit anderen Werten wird wiederrum den Wert NaN zurückgeben. Die IsNaN() Funktion kann verwendet werden, um zu überprüfen, ob eine Variable den Wert NaN repräsentiert.
Ich sehe den Bug nicht so richtig. Um auf NaN zu prüfen, gibt es eine spezielle Prozedur, die wahrscheinlich genau deswegen eingeführt wurde, weil ein normaler Vergleich auf Bedingung zwangsläufig immer auf #True hinausläft.

Das mag etwas verwirrend sein. Aber wie man NaN richtig prüft steht ja in der Prozeduren-Beschreibung von NaN() :shock:

Re: Nan() und If vergleich

Verfasst: 08.02.2024 10:29
von DarkDragon
TroaX hat geschrieben: 08.02.2024 09:58 Ich sehe den Bug nicht so richtig. Um auf NaN zu prüfen, gibt es eine spezielle Prozedur, die wahrscheinlich genau deswegen eingeführt wurde, weil ein normaler Vergleich auf Bedingung zwangsläufig immer auf #True hinausläft.

Das mag etwas verwirrend sein. Aber wie man NaN richtig prüft steht ja in der Prozeduren-Beschreibung von NaN() :shock:
Es gibt einen Standard, der beschreibt welche Auswirkungen NaN hat und der wurde nicht eingehalten. Eigentlich müsste der Vergleich immer false sein, nicht true.

Re: Nan() und If vergleich

Verfasst: 08.02.2024 13:23
von STARGÅTE
TroaX hat geschrieben: 08.02.2024 09:58 Ich sehe den Bug nicht so richtig. Um auf NaN zu prüfen, gibt es eine spezielle Prozedur, die wahrscheinlich genau deswegen eingeführt wurde, weil ein normaler Vergleich auf Bedingung zwangsläufig immer auf #True hinausläft.
Das mag etwas verwirrend sein. Aber wie man NaN richtig prüft steht ja in der Prozeduren-Beschreibung von NaN() :shock:
Es stimmt, dass es die Funktion IsNaN() gibt, um eine Fließkommazahl dahingehend zu prüfen.
Der Grund ist (oder hätte es sein sollen) aber, dass eben jeder Vergleich mit NaN() eigentlich immer zu False führen sollte und man daher nicht auf NaN() = NaN() prüfen kann, weil dies auch False zurück gibt (geben sollte).

Aber das ist in gewisser Weise der Programmiersprache vorbehalten, wie es darauf reagiert.
Was aber nicht sein kann ist, dass NaN() > 3.14 wahr sein soll, gleichzeitig aber NaN() = 3.14 auch wahr ist, dann aber wiederum NaN() < 3.14 falsch ist und die Ausgabe im ASM-backend unterschiedlich zum C-backend ist.

Code: Alles auswählen

Define.d Number1 = NaN()
Define.d Number2 = 3.14

If Number1 > Number2
  Debug StrD(Number1) + " > " + StrD(Number2)
EndIf
If Number1 < Number2
  Debug StrD(Number1) + " < " + StrD(Number2)
EndIf
If Number1 = Number2
  Debug StrD(Number1) + " = " + StrD(Number2)
EndIf
ASM hat geschrieben:NaN > 3.14
NaN = 3.14
C hat geschrieben:

Re: Nan() und If vergleich

Verfasst: 08.02.2024 22:35
von maddinvonfritz
Stargate danke für das melden des Bugs.

TroaX
Mir ist es aufgefallen weil ich eine Matrix geladen habe in der theoretisch alle reellen Zahlen vorkommen können. Es gibt aber auch leere Felder, denen habe ich NaN zugewiesen.
Als ich nach Feldern gesucht habe die z.B. = 1 sind wurden mir auch die Felder übergeben die ein NaN enthalten und das sollte normalerweise nicht passieren.

Re: Nan() und If vergleich

Verfasst: 09.02.2024 17:16
von mk-soft
Ist ein ASM Bug.

Mit C-Backend stimmt teilweise das Ergebnis.

Code: Alles auswählen

Define.d Number, Number2 = 1.2

; ASM OK, C-Backend Bug ?
Number = Sqr(-1)
If Number = NaN()
  Debug "If / Ok: Number = NaN()"
Else
  Debug "Else / Bug: Number = NaN()"
EndIf

; ASM OK, C-backend Ok
Number = Sqr(-1)
If IsNAN(Number)
  Debug "If / Ok: IsNaN(Number)"
Else
  Debug "Else / Bug: IsNaN(Number)"
EndIf

; ASM Bug, C-Backend Bug
Number2 = 1.2
If Number = Number2
  Debug "If / Bug: Number = Number2"
Else
  Debug "Else / Ok: Number = Number2"
EndIf