0.0 == -0.0?



  • Umfrage: 0.0 == -0.0?

    Auswahl Stimmen Prozent
    true 73 71.6%
    false 29 28.4%

    Ohne es zu testen und weiter zu lesen...

    Evaluiert doch bitte mal in eurem Kopf den Ausdruck in der Frage und gebt die Antwort an. Dabei handelt es sich in der Fragestellung um den Vergleich zweier Fließkommawerte.

    PS: Es interessieren mich in dieser Umfrage Meinungen und nicht das tatsächliche Verhalten, das man irgendwo nachlesen kann.



  • Bitte markiere exakt den Wert 0.0 auf der Zahlengeraden. Bitte markiere exakt den Wert -0.0 auf der Zahlengeraden. Liegen die beiden Markierungen exakt uebereinander? ... ups, das war ja schon ein Test. Hey, aber was ist, wenn 0.0 eine Zeichenkette (Wort) ist, genau wie -0.0? Dann sind sie ja nicht gleich.

    Daraus folgt: bescheuerte Frage!



  • knivil schrieb:

    Daraus folgt: bescheuerte Frage!

    Nicht jede Frage ist bescheuert, nur weil du sie nicht verstehst. Kleiner Hinweis: Die Frage ist (bis auf das Fragezeichen) gültiger C++ Code. Und jetzt benutz mal deinen Compiler im Kopf. :p



  • knivil schrieb:

    Bitte markiere exakt den Wert 0.0 auf der Zahlengeraden. Bitte markiere exakt den Wert -0.0 auf der Zahlengeraden. Liegen die beiden Markierungen exakt uebereinander? ... ups, das war ja schon ein Test. Hey, aber was ist, wenn 0.0 eine Zeichenkette (Wort) ist, genau wie -0.0? Dann sind sie ja nicht gleich.

    Daraus folgt: bescheuerte Frage!

    Gregor sagt ausdrücklich das es keine Zeichenketten sind sondern Fließkommawerten.

    Zur Frage: Ich würde ein True erwarten, mich aber nicht darauf verlassen, da Flieskommazahlen mit == zu vergleichen generell eine schlechte Idee ist wegen den Rundungsfehlern. Da wird aus 0.0 ganz schnell auch mal 1e-20 oder soetwas.



  • Es kann alles sein. Der Kontext ist nicht angegeben. Kann auch gueltiger Code in einer anderen Programmiersprache sein. Es muss noch nicht mal Code sein, es reicht ja, einen Ausdruck zu evaluieren. Das Zeichenkettenbeispiel ziehlt auf die Darstellung der Null ab. Ich kann das Vorzeichen setzen oder nicht und dann habe ich zwei Darstellungen eines Wertes.



  • 0 ist weder + noch -. von daher kann der Vergleich nicht stattfinden, und -0 gibt es nicht, genauso wie es +0 nicht gibt.



  • Wenn Du in Fließkommadarstellung die Mantisse auf 0.0 setzt, aber das Vorzeichenbit auf negativ packst, gibt es auch -0.0.



  • phlox81 schrieb:

    0 ist weder + noch -. von daher kann der Vergleich nicht stattfinden, und -0 gibt es nicht, genauso wie es +0 nicht gibt.

    Das hast du aber ziemlich willkürlich definiert :p

    Wenn ich in einem Körper -x als additiv Inverses von x definiere (wie es üblich ist), dann gibt es 0 und -0, sie sind nur zufällig dasselbe.



  • Man sollte die Ausgangsfrage vielleicht auf IEEE Gleitkommazahlen einschränken.

    Eine lustige verwandte Frage. Gegeben folgender Code:

    union Foo{
      float f;
      int i;
    };
    //...
    union Foo a, b;
    a.f = 0.0; b.f = -0.0;
    

    Was ist der Wert von a.f == b.f und von a.i == b.i ?



  • undefined behaviour 😃



  • -0.0 = -1*0.0 = 0.0

    => 0.0 == -0.0



  • true auch wenn sich das Bitmuster unterscheidet. FP Vergleiche sind ja nicht einfach Bitmuster vergleiche (zB ist NaN == NaN false, obwohl es das gleiche Bitmuster ist (ups hab nicht gesehen, dass es auch einen NaN == NaN Thread gibt :)))



  • rüdiger schrieb:

    (zB ist NaN == NaN false, obwohl es das gleiche Bitmuster ist ))

    Nein, es gibt unterschiedliche NaNs. Bei IEEE-754-32Bit-Gleitkommazahlen sogar 2^23 Stück. NaNs enthalten so zu sagen noch einen Fehlercode.

    EDIT: Dreher im Exponent verbessert



  • Da bleibt aber nicht viel für die eigentlichen Nutzdaten 😃



  • knivil schrieb:

    Bitte markiere exakt den Wert 0.0 auf der Zahlengeraden. Bitte markiere exakt den Wert -0.0 auf der Zahlengeraden. Liegen die beiden Markierungen exakt uebereinander? ... ups, das war ja schon ein Test. Hey, aber was ist, wenn 0.0 eine Zeichenkette (Wort) ist, genau wie -0.0? Dann sind sie ja nicht gleich.

    Daraus folgt: bescheuerte Frage!

    Dieser Thread und der Thread über "NaN == NaN?" beziehen sich auf die Darstellung der Fließkommazahlen auf Bit-Ebene. Auf Bit-Ebene werden 0.0 und -0.0 eben unterschiedlich dargestellt. Trotzdem gelten sie als gleich. Bei NaN ist es andersherum. Dort kann ein "a==a" false ergeben.

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

    "Wie sollte es eurer Meinung nach sein?"
    "Ist dieses Verhalten überhaupt allen bekannt?" (Ich muss sagen, dass ich letzt etwas von NaN != NaN überrascht wurde.)

    Das sind Fragen, die sich mir da stellen.



  • 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.



  • 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.


Anmelden zum Antworten