eine Rechnung, zwei Ergebnisse



  • Hallo,
    ich habe seit Kurzem angefangen, mich mit C++ zu beschäftigen.

    Ich hab ein Programm geschrieben, das folgende Rechnung ausführt:

    (in Worten: Fünf ZweiDrittel minus 117 geteilt durch 33)

    cout.precision(16);
    cout<<5+2/3-((117)/(3*11));
    

    Zu Meiner Überraschung kam genau 2 raus, obwohl 2,121212121212 rauskommen müsste. Gut, Rundungsfehler dachte ich.

    Dann habe ich die Rechnung ein wenig umgestellt:

    cout.precision(16);
    long double test,test2,test3,test4;
    test =5+2/3;
    test2=117;
    test3=3*11;
    test4=test-(test2/test3);
    cout<<test4;
    

    Als Ergebnis für test4 kommt hier 1,454545454545 raus (was für einen Rundungsfehler doch schon ziemlich krass wäre).

    Ich habe schon etliche Klammer hinzugefügt und wieder weggenommen, ausdrücke wie 3*11 zusammengefasst, das programm dauernd neu kompliert, den Variabelntyp zu float bzw Double geändert, usw, aber ohne Veränderung des Ergebnisses.
    Achja, ich benutze den CodeBlocks-Compiler.

    Wo liegt mein Fehler? :>

    mfg

    Satru



  • cout.precision(16);
            cout << 5.0+2.0/3.0-117.0/(3.0*11.0);
    

    Das Ergebnis von 2/3 ist 0, da 2 und 3 sind vom Typ int, es sind also ganze Zahlen!
    Das Ergebnis von 2.0/3.0 ist 0.666 das ist das was du willst, diese Zahlen sind dann vom Typ float!
    Du musst also eine der beiden Zahlen vor der Division jeweils
    in eine Flieskommzahl umwandeln damit du das Ergebnis bekommst.



  • In C++ musst du unterscheiden zwischen Ganzzahlen und Kommazahlen. 'int' und 'long' z.B. können nur ganze Zahlen darstellen, float und double Kommazahlen. Ausdrücke wie '1' oder '123' sind Ganzzahlen, Ausdrücke wie '2/3' ist eine Division von Ganzzahlen und hat das Ergebnis 0 (Nachkommateil fällt weg). Du solltest eher float oder double als Datentypen benutzen, dazu '2./3.' (oder auch '2.f/3.f'), der Punkt führt dazu, dass die entsprechende Zahl als Kommazahl interpretiert wird, kommt dann also wirklich 0.6666666666 raus.
    Beachten muss man aber auch noch, dass in float und double aufgrund des Formats nicht alle Zahlen 'korrekt' dargestellt werden können, '1./10.', was 0.1 ergeben würde, wird dann z.B. intern als 0.099999999999999 dargestellt. Das muss man bei Vergleichen oder der Ausgabe berücksichtigen, dann läuft alles glatt 🙂

    Achso, das mit 0.1 vs 0.0999999999 war nur ein Beispiel, weiß grad nicht, ob's in diesem Fall so ist, könnte auch glatt 0.1 sein oder 0.1000000000001 oder so..



  • Vielen Dank für die schnelle Antwort 🙂

    was für ein dummer Fehler :>

    dann kann ich ja jetzt munter weiter programmieren 😃


Log in to reply