NaN == NaN?



  • rüdiger schrieb:

    Normalerweise hat man doch kein anderes NaN verfügbar oder hast du a == sqrt(-1.0) gemacht?

    In Java gibt es die Konstante Float.NaN. Hmmm... vielleicht sollte es die besser doch nicht geben. 😃

    EDIT: In dem Zusammenhang ist auch das Verhalten von Float.equals in Java interessant:

    Note that in most cases, for two instances of class Float, f1 and f2, the value of f1.equals(f2) is true if and only if

    f1.floatValue() == f2.floatValue()

    also has the value true. However, there are two exceptions:

    • If f1 and f2 both represent Float.NaN, then the equals method returns true, even though Float.NaN==Float.NaN has the value false.
    • If f1 represents +0.0f while f2 represents -0.0f, or vice versa, the equal test has the value false, even though 0.0f==-0.0f has the value true.

    This definition allows hash tables to operate properly.



  • Die Definition von equals ist für Java notwendig, da man sonst keine Möglichkeit hätte, Float/Double konsequent als key zu verwenden. Würde equals für NaN.equals NaN false zurückliefern, wäre dieser key tot und man könnte an die Werte höchstens noch mittels iterator rankommen.

    Das betrifft aber auch nur die Wrapper Klassen. Das Verhalten der Primitive ist für mathematische Operationen ausschlaggebend.



  • Tim schrieb:

    Errrrm, nein. a ist inf, b ist inf. inf == inf gilt. Diff ist NaN weil Inf - Inf.

    Das ist mir durchaus klar. Was ich bloß damit sagen will ist dass beide Variablen equal1 und equal2 das gleiche ausdrücken wenn a und b != NaN sind, aber nicht im Fall dass wenn a == NaN und b == NaN ist.

    Aus diesem Grunde bin ich ein Freund von Exceptions, welche bei einer Division durch Null direkt eine Exception werfen und so darauf hinweist dass das Ergebnis vermutlich kompletter Müll ist. Die Begründung hast du oben. Zwei mögliche Vergleichsoperatoren welche nur im Fall a=NaN, b=NaN unterschiedliche Ergebnisse liefern. Deswegen ist für mich die Frage ob NaN == NaN ist Unfug.

    Übrigens als Diff Wert kommt bei mir -1.#IND000000 heraus. Jetzt könnte man natürlich auch fragen ob -1.#IND000000 == Nan ist. :p



  • Bitte ein Bit schrieb:

    Tim schrieb:

    Errrrm, nein. a ist inf, b ist inf. inf == inf gilt. Diff ist NaN weil Inf - Inf.

    Das ist mir durchaus klar. Was ich bloß damit sagen will ist dass beide Variablen equal1 und equal2 das gleiche ausdrücken wenn a und b != NaN sind, aber nicht im Fall dass wenn a == NaN und b == NaN ist.

    für a und b NaN kommt doch beidesmal false raus. Ich versteh nicht was du zeigen willst. Zumal fabs(a-b)==0 nicht das gleiche ist, wie a==b . FP ist keine Mathematik mit reellen Zahlen!

    Und NaN == NaN ist sehr wohl definiert (eben false).



  • rüdiger schrieb:

    für a und b NaN kommt doch beidesmal false raus. Ich versteh nicht was du zeigen willst.

    Du meinst wohl equal1 und equal2. Die sind bei mir unterschiedlich denn bei meinem System scheint wohl Nan == Nan zu gelten, trotz Definition.

    Zumal fabs(a-b)==0 nicht das gleiche ist, wie a==b. FP ist keine Mathematik mit reellen Zahlen!

    Thema verfehlt. Du kannst von mir aus gerne den Wertebereich von a und b auf 0.0,1.0,NaN festlegen und bei mir wäre immer noch equal1 und equal2 unterschiedlich.

    Generell verstehe ich nicht warum man mit Nan Werten weiterrechnen will bzw. Vergleiche mit solchen Werten machen will. Ein IsNan() finde ich noch in Ordnung aber ansonsten nichts mehr.



  • Bitte ein Bit schrieb:

    rüdiger schrieb:

    für a und b NaN kommt doch beidesmal false raus. Ich versteh nicht was du zeigen willst.

    Du meinst wohl equal1 und equal2. Die sind bei mir unterschiedlich denn bei meinem System scheint wohl Nan == Nan zu gelten, trotz Definition.

    Bei deinem Beispiel ist a==b natürlich true und fabs(a-b)<0.0 false. Was aber (wie Tim bereits gesagt hat) daran liegt, dass eben a und b nicht NaN sondern eben Inf sind.

    Bitte ein Bit schrieb:

    Generell verstehe ich nicht warum man mit Nan Werten weiterrechnen will bzw. Vergleiche mit solchen Werten machen will. Ein IsNan() finde ich noch in Ordnung aber ansonsten nichts mehr.

    Das würde vorallem bedeuten, dass die IEEE754 Designer ein Exceptionsystem für alle Sprachen hätten festlegen müssen. Es gibt ja die Traps. Aber leider scheinen keine Sprachen native dafür ein System anzubieten. Das man in glibc ein Trap in ein SIGFPE umwandeln kann, ist zwar ok aber auch nicht wirklich hilfreich.

    Der Sinn ist halt, dass man bei einem NaN einfach am Ende schauen kann, ob die Rechnung stimmt oder nicht. Ein Exceptionsystem würde das alles verkomplizieren. W. Kahan führt da zB die Ariane5 an.



  • @rüdinger
    Ich könnte heulen. 😃 Was ist denn jetzt bitte der Unterschied zwischen Nan, Inf (-1.INF) und -1.#IND ??? 😕

    Der Sinn ist halt, dass man bei einem NaN einfach am Ende schauen kann, ob die Rechnung stimmt oder nicht. Ein Exceptionsystem würde das alles verkomplizieren. W. Kahan führt da zB die Ariane5 an.

    Verstehe ich nicht. 😕 Kannst du mir mal einen Link auf den Artikel geben ?



  • Bitte ein Bit schrieb:

    @rüdinger
    Ich könnte heulen. 😃 Was ist denn jetzt bitte der Unterschied zwischen Nan, Inf (-1.INF) und -1.#IND ??? 😕

    http://docs.sun.com/source/806-3568/ncg_goldberg.html

    Bitte ein Bit schrieb:

    Verstehe ich nicht. 😕 Kannst du mir mal einen Link auf den Artikel geben ?

    http://www.eecs.berkeley.edu/~wkahan/JAVAhurt.pdf



  • Danke für die Links 🙂



  • rüdiger schrieb:

    http://docs.sun.com/source/806-3568/ncg_goldberg.html

    What Every Computer Scientist Should Know About Floating-Point Arithmetic

    Oh, das ist nix für mich... 😃



  • ist das nicht logisch, da brauch ich nicht mal zu überlegen ?

    float a = "Not a Number";
    float b = "Siehe a";
    (b != a) == true // !!!
    


  • Tim06TR schrieb:

    ist das nicht logisch, da brauch ich nicht mal zu überlegen ?

    float a = "Not a Number";
    float b = "Siehe a";
    (b != a) == true // !!!
    

    NaN ist aber eben auch nur ein Wert, der die Bedeutung "Not a Number". Sonst ist NaN gar nichts. NaN ist kein Apfel und keine Birne Du kannst also nicht sagen, dass NaN != NaN sein muss, weil Birne und Apfel keine Zahlen sind.


Anmelden zum Antworten