double mit %



  • Hallo,

    bei einer Aufgabe soll ich eine double Zahln einlesen und bestimmen ob sie eine ganze Zahl ist oder nicht.
    Na gut, falls die eine integer wäre, könnte ich es einfach mit dem % operator prüfen - ist aber nicht... Wie soll ich dann vorgehen? 😉

    danke im vorwärts



  • Ne, fall sie ein int wäre bräuchtest Du garnichts mehr prüfen. Sie wäre automatisch eine Ganzzahl. Aber genau da liegt auch die Lösung. Caste das ganze in einen int und schau ob die Differenz 0 ist. Bzw. benutze eine Rundungsfunktion aus <cmath> und überprüfe, ob die gerundete Zahl die Zahl selbst ist.

    MfG Jester



  • Bei doubles immer epsilon-Vergleiche, sonst kriegst du Probleme mit Rundungsfehlern. Zum Beispiel gibt das hier:

    #include <iostream>
    
    int main() {
      const double EPSILON = 0.0001;
    
      double d = 2313.0 / 327.33;
    
      d *= 3.0;
      d *= 109.11;
    
      if(d - (int) d == 0.0)
        std::cout << "d - (int) d == 0" << std::endl;
    
      if(d - (int) d < EPSILON)
        std::cout << "d - (int) d < EPSILON" << std::endl;
    
      return 0;
    }
    

    bei mir:

    d - (int) d < EPSILON
    

    aus, der direkte Vergleich mit 0 schlägt also fehl. Welches System wie rundet, ist unterschiedlich, und der Compiler kann die Multiplikationen u.U. rausoptimieren, von daher kann es sein, dass dieser spezielle Vergleich bei dir funktioniert, aber im Grunde sind doubles ungenaue Datentypen, deswegen muss man diesen Epsilon-Kram machen.



  • Warum ist das in obigem Beispiel so? Kann das jemand exakt und nachvollziehbar erklären?



  • Jester: weil ich ein Anfänger in diese Sprache bin, wirst du mir bitte erklären wie ich die Rundfunktion da anwenden kann, oder wengstens irgendwelche URL wo man das lesen kann?...

    LG



  • nimm zum Beispiel floor (rundet ab) aus <cmath> mit google dürftest Du einiges dazu finden.


Anmelden zum Antworten