0.0 == -0.0?



  • volkard schrieb:

    Gregor schrieb:

    Das ist ein Verhalten von Fließkommazahlvergleichen, das ich nicht unbedingt intuitiv finde. Deshalb interessiert mich in dem Zusammenhang die Meinung der anderen Forenteilnehmer.

    Ist für mich total intuitiv.
    pow(sqrt(-4),2) ergibt nan
    pow(sqrt(-9),2) ergibt nan
    würde jetzt nan==nan gelten, würde ich gleich denken, daß -4==-9, was nicht unbedingt der Fall ist.

    false ist nicht das gleiche wie "ist nicht unbedingt der Fall". Bei

    a=sqrt(-1)
    a==a?

    ist das Verhalten IMHO nicht sehr intuitiv.

    Hmmm... vielleicht bräuchte man da eine dreiwertige Logik. 🙂



  • Gregor schrieb:

    Hmmm... vielleicht bräuchte man da eine dreiwertige Logik. 🙂

    Ja.
    Aber andererseits sind wir aus dem Mathematikunterricht der Schule schon gewohnt, daß in ähnlicher Weise vorgegangen wird.
    2/0==2/0 ?
    4/0==9/0 ?



  • volkard schrieb:

    Gregor schrieb:

    Hmmm... vielleicht bräuchte man da eine dreiwertige Logik. 🙂

    Ja.
    Aber andererseits sind wir aus dem Mathematikunterricht der Schule schon gewohnt, daß in ähnlicher Weise vorgegangen wird.
    2/0==2/0 ?
    4/0==9/0 ?

    Gilt eigentlich "Infinity == Infinity" nach IEEE?



  • Gregor schrieb:

    Gilt eigentlich "Infinity == Infinity" nach IEEE?

    Hoffentlich nicht!
    Sonst hätte man ja dauernd 10*x==9*x, ohne daß x==0.



  • volkard schrieb:

    Gregor schrieb:

    Gilt eigentlich "Infinity == Infinity" nach IEEE?

    Hoffentlich nicht!
    Sonst hätte man ja dauernd 10*x==9*x, ohne daß x==0.

    Gilt aber. Ich habe gerade mal gesucht und das da gefunden:

    http://compilers.iecc.com/comparch/article/98-07-134

    Erik Runeson wrote:

    > When comparing floating-point numbers, should infinity (Inf) be
    > concidered equal to infinity?

    > Inf == Inf ?

    The IEEE 754 standard for floating-point arithmetics does not say
    anything about this case, but a similar case is:

    The IEEE 754 standard does implicitly define Infinity == Infinity to
    be true. The relevant part of the standard is section 5.7: "Four
    mutually exclusive relations are possible [between two IEEE 754
    values]: less than, equal, greater than, and unordered. The last case
    arises when at least one operand is NaN." Between any pair of
    floating point values exactly one of these four relations is true.
    Therefore, since Infinity is not NaN, Infinity is not unordered with
    respect to itself. Having one of (Infinity < Infinity) and (Infinity
    > Infinity) be true wouldn't be consistent, so (Infinity == Infinity).



  • volkard schrieb:

    Ist für mich total intuitiv...

    Na ja... ich sehe im NaN intuitiv einen Zustand - "not a number" Zustand. Daher, intuitiv, NaN == NaN, true.

    Und 0.0 == -0.0 kann man ja ohne Probleme berechnen. Daher auch true.



  • abc.w schrieb:

    volkard schrieb:

    Ist für mich total intuitiv...

    Na ja... ich sehe im NaN intuitiv einen Zustand - "not a number" Zustand. Daher, intuitiv, NaN == NaN, true.

    Ich sehe darin einen Rechenfehler.
    Daher intuitiv, ein Rechenfehler ist normalerweise nicht gleich dem anderen Rechenfehler.



  • für mich isses false weil das - extra reserviert werden muss 😞



  • Für mich ist es true, denn für mich ist 0.0 das gleiche wie -0.0. Zumindest bei der Programmierung, bei der eigentlichen Mathematik könnte man sich wohl nochmal darum streiten.



  • Gregor schrieb:

    false ist nicht das gleiche wie "ist nicht unbedingt der Fall". Bei

    a=sqrt(-1)
    a==a?

    ist das Verhalten IMHO nicht sehr intuitiv.

    Hmmm... vielleicht bräuchte man da eine dreiwertige Logik. 🙂

    So wie hier? 😃



  • volkard schrieb:

    Gregor schrieb:

    Das ist ein Verhalten von Fließkommazahlvergleichen, das ich nicht unbedingt intuitiv finde. Deshalb interessiert mich in dem Zusammenhang die Meinung der anderen Forenteilnehmer.

    Ist für mich total intuitiv.
    pow(sqrt(-4),2) ergibt nan
    pow(sqrt(-9),2) ergibt nan
    würde jetzt nan==nan gelten, würde ich gleich denken, daß -4==-9, was nicht unbedingt der Fall ist.

    Ich finde es auch intuitiv. NaN dient ja zum signalisieren eines "Silent Errors" (oder wie die genannt werden). Und das -0 = 0 ist, erwartet man ja auch.



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Neuigkeiten aus der realen Welt in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Administrator

    Was ist eigentlich der Grund, wieso man diesen Zustand nicht einfach verboten hat? Also wenn der Wert 0.0 erreicht wird und das Signbit ist gesetzt, so wird es automatisch entfernt. Wäre, von mir aus gesehen, die sinnvollste Lösung gewesen.

    Grüssli



  • Dravere schrieb:

    Was ist eigentlich der Grund, wieso man diesen Zustand nicht einfach verboten hat? Also wenn der Wert 0.0 erreicht wird und das Signbit ist gesetzt, so wird es automatisch entfernt. Wäre, von mir aus gesehen, die sinnvollste Lösung gewesen.

    Ne, das wäre eine schlechte Lösung gewesen. -0.0 kann einem ja immernoch viel Informationen geben zB wenn man berechnet ob ein Punkt links oder rechts neben einer Fläche liegt, dann kann man an dem Vorzeichen das Ergebnis ja auch noch ablesen, wenn die Rechnung wegen mangelnder Präzision Null ergibt.


  • Administrator

    rüdiger schrieb:

    Dravere schrieb:

    Was ist eigentlich der Grund, wieso man diesen Zustand nicht einfach verboten hat? Also wenn der Wert 0.0 erreicht wird und das Signbit ist gesetzt, so wird es automatisch entfernt. Wäre, von mir aus gesehen, die sinnvollste Lösung gewesen.

    Ne, das wäre eine schlechte Lösung gewesen. -0.0 kann einem ja immernoch viel Informationen geben zB wenn man berechnet ob ein Punkt links oder rechts neben einer Fläche liegt, dann kann man an dem Vorzeichen das Ergebnis ja auch noch ablesen, wenn die Rechnung wegen mangelnder Präzision Null ergibt.

    Tut mir leid, aber ich sehe keine praktische Verwendung für sowas:
    1. Der genaue Wert fehlt mir ja immer noch, um den also rauszufinden, muss ich die Berechnung nochmals durchführen mit einer Zahl, welche dies genauer darstellt. Dann werde ich diese Information auch haben.
    2. Ich kann es ausgeben, aber ansonsten nichts im Programmcode damit anfangen. Soweit mir bekannt ist, gibt es schliesslich keine Möglichkeit zu prüfen, ob es jetzt ein positives oder negatives Null ist.

    Ich frage mich, ob sowas wirklich jemals jemand in einer praktischen Anwendung als nützlich empfand? Und wieviele gab es? Wäre es nicht klüger gewesen, diese paar extrem seltenen Sonderfälle auszuklammern?

    Grüssli



  • Dravere schrieb:

    Soweit mir bekannt ist, gibt es schliesslich keine Möglichkeit zu prüfen, ob es jetzt ein positives oder negatives Null ist.

    Stimmt, da würde mir jetzt auch nichts einfallen.





  • Dravere schrieb:

    Tut mir leid, aber ich sehe keine praktische Verwendung für sowas:
    1. Der genaue Wert fehlt mir ja immer noch, um den also rauszufinden, muss ich die Berechnung nochmals durchführen mit einer Zahl, welche dies genauer darstellt. Dann werde ich diese Information auch haben.

    Manchmal braucht man ja nur das Vorzeichen (zB wenn es darum geht, ob ein Punkt links oder rechts von einer Fläche liegt)

    Dravere schrieb:

    2. Ich kann es ausgeben, aber ansonsten nichts im Programmcode damit anfangen. Soweit mir bekannt ist, gibt es schliesslich keine Möglichkeit zu prüfen, ob es jetzt ein positives oder negatives Null ist.

    siehe Tim.



  • Wie genau funktioniert signbit? Wenn ich auf eine negative Zahl prüfen wollte, würde ich einfach x < 0 nehmen, das geht ja aber schlecht, wenn x = 0 ist.



  • Mal als 32-Bit float Variante

    int signbit (float x) {
        return *((uint32_t *)&x) >> 31;
    }
    

Anmelden zum Antworten