Epsilon um auf 0.0 zu testen?



  • Hi,
    ich habe eine kurze Frage. Wenn ich einer Fließkommazahl 0.0 zuweise und danach auf 0.0 testen will, muss ich mir dann auch ein Epsilon einfallen lassen?

    double d = 0.0
    if( d == 0.0 ) // Ok? Oder brauche ich hier ein Epsilon?
    {
    }
    

    Danke im Voraus.



  • ist okay.

    edit: ich wollte den thread raussuchen denn das hier wurde schonmal gefragt. leider nicht gefunden.

    die begründung war soviel mir ist dass gleich geschriebene literale deterministisch in die datentypen gewandelt werden.



  • Habe gerade auch einen Thread gefunden: http://www.c-plusplus.net/forum/197511-full

    Ist aber wohl nicht der, den du meinst, sagt aber auch, dass es ok ist. 🙂


  • Mod

    Dir ist schon klar, wie Fließkommazahlen repräsentiert werden? 0.0 kann genau dargestellt werden (mit Mantisse 0), damit ist auch kein Fehler-basiertes Vergleichen notwendig.



  • Dir ist schon klar das der C++ Standard nicht definiert wie Fließkommazahlen repräsentiert werden?


  • Mod

    üpsilon schrieb:

    Dir ist schon klar das der C++ Standard nicht definiert wie Fließkommazahlen repräsentiert werden?

    Dir ist schon klar dass 0 in allen Fließkommazahl-Repräsentationen exakt darstellbar ist?



  • Arcoth schrieb:

    Dir ist schon klar dass 0 in allen Fließkommazahl-Repräsentationen exakt darstellbar ist?

    Beleg?



  • Arcoth schrieb:

    üpsilon schrieb:

    Dir ist schon klar das der C++ Standard nicht definiert wie Fließkommazahlen repräsentiert werden?

    Dir ist schon klar dass 0 in allen Fließkommazahl-Repräsentationen exakt darstellbar ist?

    Du hast dich da offensichtlich verrannt. Arbeite mal an der Formulierung, so wird das nix. (Ja, ich weiß was du meinst, aber das steht da einfach nicht. Und normalerweise ist das was du meinst in solchen Diskussionen auch für dich irrelevant).


  • Mod

    zätt schrieb:

    Arcoth schrieb:

    Dir ist schon klar dass 0 in allen Fließkommazahl-Repräsentationen exakt darstellbar ist?

    Beleg?

    Öh... 😃

    Gut, wie wäre es damit: "In allen gängigen/relevanten Fließkommazahl-Formaten ist 0 exakt darstellbar." Das ist ohne Zweifel wahr.

    Edit: Eine Fließkommazahldarstellung die 0 nicht exakt darstellen kann, ist sowieso Bullshit, worüber diskutieren wir überhaupt!?



  • Arcoth schrieb:

    Gut, wie wäre es damit: "In allen gängigen/relevanten Fließkommazahl-Formaten ist 0 exakt darstellbar." Das ist ohne Zweifel wahr.

    Sofern sie nicht aus irgendeiner Rechnung hervorgeht.



  • out schrieb:

    Arcoth schrieb:

    Gut, wie wäre es damit: "In allen gängigen/relevanten Fließkommazahl-Formaten ist 0 exakt darstellbar." Das ist ohne Zweifel wahr.

    Sofern sie nicht aus irgendeiner Rechnung hervorgeht.

    Ich habe die letzten 3 Jahre andere Erfahrungen mit VS08/12 gemacht.

    Bei mir ist 0.0 oft nicht exakt dargestellt. Ebenfalls ist 0.0 nicht immer +0.0. Es kann genauso -0.0 sein. Also bitte, wenn ihr mit wissen so protzen wollt dann informiert euch doch bitte erst mal über die Realität.

    wir vergleichen auf 10^-8 und fahren damit ganz gut. Ebenfalls sorgen wir dafür das -0.0 zu einem Vorzeichenlosen 0.0 wird.



  • +0.0 und -0.0 "compare equal" laut IEEE Standard.
    Möchtest Du ausdrücken, dass MSVC wirklich 0.0 als irgendetwas anderes als +-0.0 in eine Konstante gießt? Das habe ich noch nicht erlebt, aber kann ja durchaus sein...



  • Ich habe erst zu spät gesehen das der TE nicht das Ergebnis einer Operation meint sondern ein "0.0".

    -10.0 + 10.0 ergab mal bei tests -0.0. Dies wurde bei einem

    double r = -10.0;
    double dRet = r + 10.0;
    
    if( dRet == +0.0 )
    return true;
    return false;
    

    nicht mit true beantwortet. Ich weiß nicht mehr welcher Compiler es war, aber meine Quellen hatten damals auch dieses Problem und war nicht die Rede von

    "+0.0 und -0.0 "compare equal" laut IEEE Standard."



  • das, dass man ergebnisse von operationen mit epsilon vergleichen sollte, steht hier gar nicht zur debatte. es geht um die konsistenz der umwandlung der literale zu der tatsächlichen repräsentation der typen. ausserdem sind +0.0 und -0.0 nach ieee 754 bitweise nicht gleich, daher ist der vergleich auch sinnentfremdet.


  • Mod

    asfdlol schrieb:

    ausserdem sind +0.0 und -0.0 nach ieee 754 bitweise nicht gleich, daher ist der vergleich auch sinnentfremdet.

    Sie sind aber nach dem genannten Standard trotzdem "gleich" bei Vergleichen. Der Unterschied zwischen den beiden ist vor allem das Ergebnis, wenn man 1./+0. und 1./-0. berechnet.


  • Mod

    out schrieb:

    Arcoth schrieb:

    Gut, wie wäre es damit: "In allen gängigen/relevanten Fließkommazahl-Formaten ist 0 exakt darstellbar." Das ist ohne Zweifel wahr.

    Sofern sie nicht aus irgendeiner Rechnung hervorgeht.

    Ja, korrekt.

    Ich habe die letzten 3 Jahre andere Erfahrungen mit VS08/12 gemacht.

    Das heißt, du behauptest, nach der Initialisierung

    double d = 0;
    

    Hat d einen anderen Wert als 0, und wenn ich d mit irgendeinem anderen double multipliziere, kommt auch nicht 0 heraus? Um das geht es hier, nicht um irgendwelche Vorzeichen.



  • Conventional wisdom says that you should never compare two floats for equality – you should always use an epsilon. Conventional wisdom is wrong.

    I’ve written in great detail about how to compare floating-point values using an epsilon, but there are times when it is just not appropriate. Sometimes there really is an answer that is correct, and in those cases anything less than perfection is just sloppy.

    So yes, I’m proudly comparing floats to see if they are equal.

    - Bruce Dawson

    Wenn du testen willst, ob der Wert genau gleich 0.0 ist, dann ist es auch in Ordnung mit == zu vergleichen.

    Wenn du z.b. eine Funktion hast, die 0.0 als Rückgabewert zurückliefert um eine Fehlersituation anzuzeigen (unabhängig davon ob das jetzt gutes Interfacedesign ist oder nicht ;)), dann macht es keinen Sinn hier mit einem Epsilon zu prüfen, da du ja bereits weißt dass der Wert eben genau 0.0 ist.



  • Desdemona schrieb:

    dann macht es keinen Sinn hier mit einem Epsilon zu prüfen, da du ja bereits weißt dass der Wert eben genau 0.0 ist.

    Joa, das ist bei mir der Fall.

    Danke euch alle 🙂



  • dasisthoffentlichwahr schrieb:

    out schrieb:

    Arcoth schrieb:

    Gut, wie wäre es damit: "In allen gängigen/relevanten Fließkommazahl-Formaten ist 0 exakt darstellbar." Das ist ohne Zweifel wahr.

    Sofern sie nicht aus irgendeiner Rechnung hervorgeht.

    Ich habe die letzten 3 Jahre andere Erfahrungen mit VS08/12 gemacht.

    Bei mir ist 0.0 oft nicht exakt dargestellt. Ebenfalls ist 0.0 nicht immer +0.0. Es kann genauso -0.0 sein. Also bitte, wenn ihr mit wissen so protzen wollt dann informiert euch doch bitte erst mal über die Realität.

    wir vergleichen auf 10^-8 und fahren damit ganz gut. Ebenfalls sorgen wir dafür das -0.0 zu einem Vorzeichenlosen 0.0 wird.

    Wenn du 0.0 reintust, dann ist nachher 0.0 drinnen. Und dann kannst du ohne Epsilon gegen 0.0 vergleichen.

    Wenn du irgendwas rumrechnest, wo 0.0 rauskommen sollte, dann ist das Ergebnis natürlich nicht unbedingt 0.0 🙄
    Und ob -0.0 oder +0.0 spielt beim Vergleich keine Rolle, da gilt -0.0 == +0.0.


Log in to reply