Nan() und If vergleich

Für allgemeine Fragen zur Programmierung mit PureBasic.
maddinvonfritz
Beiträge: 5
Registriert: 15.11.2023 16:53

Nan() und If vergleich

Beitrag 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
DarkDragon
Beiträge: 6267
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Nan() und If vergleich

Beitrag 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"
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Nan() und If vergleich

Beitrag von STARGÅTE »

Das ist ja komisch. Wieso ist das nicht schon früher aufgefallen.
Ich geh das mal als Bug posten.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
TroaX
Beiträge: 660
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Pop_OS! | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Pop_OS!
Wohnort: NRW
Kontaktdaten:

Re: Nan() und If vergleich

Beitrag 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:
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Pop_OS!
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Pop_OS!
NAS: Fritz.Box :lol:
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
DarkDragon
Beiträge: 6267
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Nan() und If vergleich

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Nan() und If vergleich

Beitrag 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:
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
maddinvonfritz
Beiträge: 5
Registriert: 15.11.2023 16:53

Re: Nan() und If vergleich

Beitrag 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.
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Nan() und If vergleich

Beitrag 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
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten