Mein Computer rechnet falsch // 1.2 - 1 != 0.2



  • Moin,
    erstmal vorweg ich weiß nicht ob es eine MFC frage ist *hoff*.

    Also nun zu meinem Problem. Ich Reche ganz leichte Sachen mit VS7.0. Und bekomme immer falsche Ergebnise, obwohl ich meiner Meinung nach richtige Datentypen verwende. Ist Microsoft doof oder ich?

    Was mach ich falsch, bei den folgenen Gleichung bekomme ich immer was falsches raus:

    1.2f - 1 = 0.20000004768371582
    (float)1.2 - (int)1 = 0.20000004768371582
    (double)1.2 - (int)1 = 0.19999999999999996
    (double)1.2 - (int)1 = 0.19999999999999996
    1.2 - 1 = 0.19999999999999996
    (long double)1.2 - (long double)1 = 0.19999999999999996



  • Das liegt am Typ double.



  • Ahh Haa und wie mach ich es richtig? Ohne double? Also mit Float Rechnet er auch bei mir falsch:

    (float)((float)1.2 - (float)1) 0.20000005 float



  • Ups meinte:
    (float)((float)1.2 - (float)1) = 0.20000005



  • Hatte mal das gleiche Problem. Das hängt wohl mit der Berechnung der Datentypen, wenn du rundest, stimmt es meistens wieder.



  • *will nicht glauben*
    Also ich kann mit

    float(Signed):
    Min 1.17549e-38
    Max 3.40282e+38
    Kommastellen: 6

    double(Signed):
    Min 2.22507385851e-308
    Max 1.79769313486e+308
    Kommastellen: 15

    darstellen. Aber das alles nützt doch nix, wenn ich damit Rechnen will, da ich runen muß/soll!? Es gibt doch auch Mathematik Programme mit was für einen Datentyp rechnen die denn? Haben die sich extra eigene Datentypen geschreiben?



  • Wo ist das Problem 😕

    double a=1.2, b=1.0;
    printf( "%.15lf - %.15lf = %.15lf\n", a, b, a-b);
    // Ausgabe:
    // 1.200000000000000-1.000000000000000=0.2000000000000000;
    


  • Hast du deinen Compi übertaktet? Dann kann er auch falsch rechnen...

    so long



  • Hast du deinen Compi übertaktet? Dann kann er auch falsch rechnen...

    Wäre dann nicht das Betriebssystem eher abgestürzt?



  • Nicht unbedingt, da gibts doch so ein Proggie, da kann man einen Test machen. Bei der kleinsten Abweichung eines Ergebnisses schlägt es Alarm.
    Das nimmt man, um zu testen, ob der Compi trotz Übertaktung) noch genau rechnet. Der rechnet ja nicht nur falsch, wenn er zu heiß ist, sondern auch, wenn die Spannung zu hoch ist. Da kannst du auch mit der WaKü kühlen, trotzdem falsche Ergebnisse.



  • Schwupi hat unrecht.

    es ist schlicht der typ double, der gar nicht 308 genaue stellen hat, sondern viel weniger.
    er stellt die zahlen eher da als b*2^m.
    b nennt man basis und m nennt man mantisse.
    so, wie eir es auch gewohnt sind, wenn wie 3,18*10^134 sagen. und mit rechenfehlern wie 3,18*10^134 + 1.23*10^23 == 3,18*10^134.
    dazu kommt noch unterstützend, daß 0.2 im binärsystem nicht glatt aufgeht, und dort ein periodischer dezimalbruch steht (und hinten sicher stellen abgeschnippelt erden).



  • Ich wollte ja auch nicht recht haben, sonder habe nur vermutet, ob es auch daran liegen kann.

    Aber deine Antwort erstaunt mich, hätte ich nicht gewusst. Na ja, wieder was gelernt...

    so long


Anmelden zum Antworten