Vergleich von double



  • Hallo zusammen,

    ein (wahrscheinlich) ganz einfache Frage:
    Liefert der Code immer yes oder können nach der
    Zuweisung eines Wertes auch Differenzen vorhanden sein?

    double d = 0.0;
            if(d == 0.0)
                    std::cout << "yes" << std::endl;
            else
                    std::cout << "no" << std::endl;
    

    Gruß,
    Frank



  • ich weiss nicht ob genau dieser code immer true liefern wird aber generell kannst du von ner kleinen ungenauigkeit ausgehen, zb wenn du sowas machst

    for(double i = 0.0; i != 10.0; i += 0.1);
    

    ist es vermutlich eine endlosschleife weil nach 10 iterationen i 9.99999 oder 10.000001 oder so sein wird

    deswegen wenn du double werte vergleichst solltest du dir nen sehr kleinen bereich um das double herum waehlen der eine toleranz darstellt, auf die art

    for(double i = 0.0; !floatingPointEquals(i, 10.0); i += 0.1);
    

    und floatingPointEquals schaut ist etwas wie

    bool floatingPointEquals(double source, double desired)
    {
       return abs( source - desired ) < FLOATING_POINT_TOLERANCE;
    }
    


  • Was du da machst sollte man generell nie machen. Man vergleicht nicht Fließkommazahlen auf Gleichheit. Du solltest immer den Wert vom Erwartungswert abziehen und den Betrag des Ergebnisses auf Unterschreitung einer Schranke prüfen.
    Für den speziellen Fall 0.0 kann ich dir das jetzt nicht sagen. Möglicherweise ist 0.0 wirklich glatt Null und das würde gehen. Ich würde das da nicht machen.



  • Ich denke dass das Ganze auch von dem Compiler anhängt, welcher man benutzt. Denn meine Erfahrungen zeigten, dass je nachdem welche Gleitkommakonsistenz bzw. -optimierungen ich einstellte, unterschiedliche Ergebnisse herauskamen. (Das war übrigens eine meiner ersten Fragen im Forum warum sich Debug und Release Version unterscheiden)

    Generell empfehle auch ich den Einsatz von Epsilon Regionen. Diese sollte aber möglichst klein gehalten werden, da diese auch durchaus Fehler verursachen können.

    Alternativ kann man auch versuchen andere Algorithmen zu verwenden, welche weniger Rundungsfehler verursachen. Dies ist und bleibt aber ein meines Erachtens Recht schwieriges Thema (Bsp: Summation von N Zahlen <-> Kahan Summe)



  • Wenn der Variablen d exakt der Wert 0.0 zugewiesen wird und danach (ohne weitere Veränderung der Variablen d) auf diesen Wert geprüft wird, dann kann man davon ausgeehen, dass der Vergleich wahr ist. Wird der Wert 0.0 aber irgendwie errechnet, kann man diese Annahme nicht mehr treffen.

    Auch wenn 0.0 vielleicht nicht exakt als double dargestellt werden kann, wei Double-Literale 0.0 werden auf das gleiche Bitmuster abgebildet und sind somit gleich.



  • Nur der Vollständigkeit halber: Dem IEEE 754 nach ist 0.0 immer exakt darstellbar. Bei Berechnungen gilt natürlich das vorher gesagte, da werden Rundungsfehler wahrscheinlich dafür sorgen, dass nicht mehr 0.0 herauskommt.




Anmelden zum Antworten