yearTime*year!=static_cast<int>(yearTime*year) tut nicht immer was es soll



  • ok, ich hab ne schleife

    bool function(double yearTime){
        //...
        int year=0;
        do{
            ++year;
            //...
        }while(yearTime*year!=static_cast<int>(yearTime*year));
        //...
    }
    

    sie soll genau dann abrechen, der wert von yearTime*year gleich seinem vorkommateil ist(dh hinterm komma steht nichts mehr).

    bei manchen testwerten funktioniert es ganz gut, aber bei solchen werten wie 0.26 oder 0.1 lande ich in einer endlosschleife. liegt das an den berühmt-berüchtigten unendlichen binärbrüchen? wie kann ich das umgehen?



  • Ja, das liegt an den berühmt berüchtigten periodischen Zahlen im Binärsystem. Das kannst du höchstens umgehen, wenn du ein eps festlegst und die Abfrage so gestaltest:

    fabs(yearTime*year-static_cast<int>(yearTime*year)) < eps
    

    Ne andere Möglichkeit fällt mir im Moment nicht ein (ausser den Algorithmus zu überdenken).



  • algo überdenken geht schlecht,da der user eine beliebige zahl eingeben können muss, und irgendwie muss ich ja auch rausbekommen, wann ein interval zuende ist(hoffentlich vertu ich mich nicht mit dem ausdruck^^)

    btw: was macht,bzw was sollte die von dir gepostete codezeile mit der zahl machen?



  • das soll nur überprüfen ob die differenz kleiner als eps ist. eps ist in dem fall eine von dir gewählte genauigkeit.



  • aber weist du was ich komisch finde?
    wenn ich

    cout<<yearTime*year<<"\n"<<static_cast<int>(yearTime*year);
    

    schreibe, dann gibt er mir beide male 1 aus, das programm hält aber an der entsprechenden stelle im code aber nicht an.

    ein weietres problem mit deinem eps:
    die sache muss leider absolut genau sein, bricht die schleife zu früh ab, wird das ergebnis nicht nur ungenau, sondern absolut falsch.

    dieses problem wird dadurch noch forciert, dass ich werte mit ca 10stellen hinterm komma erwarten muss,dass eps muss also eine sehr sehr niedrige toleranz haben, und ob das reicht, um die ungenauigkeiten durch die endlosen binärbrüche auszugleichen..ich weis nicht



  • Funktioniert es, wenn eps die geringstmögliche Differenz zweier double-Werte ist (DOUBLE_EPSILON o.ä. in float.h) ? 🙂


Log in to reply