Rundungs-Problem



  • Wieso ergibt:

    #include <iostream.h>
    #include <math.h>
    
    int main(void)
    {
    double a=20.15;
    double Ergebnis=floor(a*10.0)/10.0;
    cout<<Ergebnis<<endl;
    double temp=(a-Ergebnis)*100.0;
    cout<<temp<<endl;
    if(temp>=5.0)
    {
    Ergebnis+=0.1;
    }
    cout<<double(Ergebnis);
    }
    

    30.1?
    Nimmt man 10.15 stimmt das Ergebnis,bei 20.15.
    Warum?
    Dieser Code läuft ebenso beim Bcc5.5.1 wie auch VC++ 6.0 schief.Wo liegt mein Denkfehler?Oder woran könnte es liegen?
    MFG,
    g_e.
    PS:mal von der Standart-Konformität usw. abgesehen,mir ist schon klar,das man einiges besser machen sollte,aber in diesem Fall geht es nur um das Problem an sich.



  • Hi,

    mal was ganz blödes. Warum nimmst Du nicht statt floor() einfach ceil()? das macht die Sache doch leichter?.

    grüße Con@n



  • Nochmal Hi,

    also jetzt mit allem Ernst. Ich hab Dein Prob gelöst. schau Dir doch mal Deine 'temp' mit "cout << setprecision(20) << temp" an. Dort wirst Du feststellen, daß dein 'temp' ab einer zahl von über 16 den Wert 5 nicht erreicht.

    Ich glaub, daß liegt in der Art der Speicherung von double zahlen. Die werden ja intern in drei "teile" aufgegliedert. Vorzeichen, Exponent und Mantisse. die Mantisse speichert den Wert an sich, und der Exponent bestimmt die Anzahl der stellen, um die verschoben wird, also die Position des Kommas.
    Für die Mantisse stehen für double nur 53 bit zur verfügung. Das reicht nicht genau aus, um einen wert von .15 zu erzeugen, da dies nur näherungsweise möglich ist.

    Dazu kommt aber auch noch die Zahl, die vor der Kommastelle ist. bis zum wert 15 nimmt sie 4 bit in Anspruch. Daher bleiben noch 49 bits für die Nachkommastellen übrig und der wert wird genauer.

    Wenn jetzt aber eine 16 vor dem Komma steht, dann braucht man schon 5 bit, und für den Rest bleiben dann nur noch 48 bits. So Gott will, ist das ergebnis dann etwas kleiner als .15 und Deine Rechnung geht nicht auf.

    Probier mal 65.15 damit geht es dann wieder.

    Ich hoffe, ich hab das nicht zu kompliziert ausgedrückt. Wenn ja, sag bescheid.

    grüße Con@n

    [Zusatz] naturlich reichen die 49 bit auch nicht, aber das ergebnis ist etwas größer als .15 . daher geht das ganze auch [/Zusatz]

    [ Dieser Beitrag wurde am 07.05.2003 um 13:37 Uhr von Con@n editiert. ]



  • Danke für ide Antwort.Ich habe heute mich den gesamten Tag über mit dem Problem beschäftigt,letztendlich hat sich die Sache aber erledigt.
    Danke!
    g_e.


Anmelden zum Antworten