Frage zum Vergleich mit fmod



  • Hallo Allerseits,
    Ich habe ein kleines Problem mit der Funktion fmod. Und zwar möchte ich wissen, ob eine Zahl durch eine andere (konsante) Zahl teilbar ist. Hier mein Code:

    long double epsilon = numeric_limits<long double>::epsilon();
    if(fmod(time,0.04L) <= epsilon)
    {
        //mache etwas
    }
    

    Die Ausgabe dabei ist:

    Ergebnis von fmod: 2e-19
    Wert von epsilon:  1.8e-19
    

    ("time" ist übrigens auch long double, als Compiler benutzte ich mingw 32bit).

    Meine Frage ist nun: Gibt es einen "Standard Weg" das Ergebnis von fmod zu prüfen? Irgendwie widerstrebt mir der Gedanke in meinen Code eine magic Number einzuführen, zB:

    if(fmod(time,0.04L) <= 8*epsilon)
    


  • Vielleicht sollte ich noch erwähnen, dass "time" den Wert 10 hat (für das Beispiel).
    Hier der entsprechende Code mit Ausgabe in codepad
    http://codepad.org/zjBEO3g9


  • Mod

    fmod schrieb:

    Meine Frage ist nun: Gibt es einen "Standard Weg" das Ergebnis von fmod zu prüfen?

    Nein. Jedoch schließe ich aus deiner Benutzung des epsilons hier, dass du nicht wirklich weißt, was dieses epsilon aus limits bedeutet. Daher erst einmal Lesestoff:
    http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
    http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm

    Die richtige Antwort musst du dir selber nach Bedarf geben: Wie genau soll das Ergebnis sein, ob die Zahlen teilbar sind. Soll das Ergebnis exakt sein, so ist der Datentyp falsch gewählt und du solltest vielleicht eher mit Brüchen arbeiten.


Anmelden zum Antworten