Probleme mit Fliesskommazahlen....



  • Hallo,

    ich hab folgendes Problem: Ich habe eine double variable, in die der Wert 64.1 gespeichert werden soll. Leider zeigt mit mein Debugger jedoch an, dass ein minimal kleinerer Wert in der Variable gespeichert wird.

    double test = 0.0; //==> Debugger-output: 0.000000000000000
    test = 64.1; //==> Debugger-output: 64.099999999999994

    Wie krieg ich denn das hin, dass wirklich auch das in der Variable steht, was ich schreibe????? Denn der minimale Unterschied bereitet mir bei spaeteren Rechnungen probleme...hat jemands ne Idee???? DANKE...

    ps: Zur Erklaerung: Der eigentliche code sollte die 64.1 aus einer Textbox lesen, was ich so mache:
    char buf[100];
    this->textBox.GetWindowText(buf, 100);
    sscanf(buf, "%lf", &test);

    ==> das Problem ist hier genau das gleiche wie oben..:(..hab auch schon %lg und so ausprobiert....;(

    VIELEN DANK....



  • 64.1 ist in double nicht exakt darstellbar, mit diesem Problem wirst du also leben müssen.



  • Die primitiven Fließkommatypen sind sehr primitiv. 😉
    Mit anderen Worten: Ungenau. Mit long double kannst du es eventuell verbessern, macht aber nicht viel Sinn. Wenn die Genauigkeit wichtig ist, musst du einfach andere Klassen verwenden, die dies für dich übernehmen. Für Geldbeträge ist es daher ratsam einfach Ganzzahlen, also int/long etc, zu nehmen und in der kleinsten Einheit zu rechnen.

    Selbst 0.5 - 0.1 - 0.1 - 0.1 - 0.1 - 0.1 ist nicht 0.0. 😉



  • Ja rechne doch mit integer zahlen, dann nimmst du einfach 641 als 64.1 also merkst dir das das sozusagen mal 10 genommen ist. Macht man auch bei vielen mikrocontrollern, da dort auch keine fließkommazahlen funktionieren.
    Bei deinen berechnungen, wenn du etwas dazu addierst, addierst du die zahl mal 10 genommen.



  • Fliesskommazahlen werden in Computern in der Regel nicht als Dezimalzahl sondern ebenfalls als Binärzahl mit Exponent zur Basis 2 dargestellt. Das bietet zwar den Vorteil, dass die Hardware schneller rechnet, aber den großen Nachteil, dass sich Dezimalzahlen nicht unbedingt als Binärzahl darstellen lassen (zB 0.1). Daher kommt es schnell zu Rundungsfehlern!

    Du kannst entweder einfach damit leben oder eben Dezimalzahlarithmetik implementieren (zB BCD-Zahlen oder die Vorschläge mit Fixkommadezimalzahlen).

    Converter19 schrieb:

    Ja rechne doch mit integer zahlen, dann nimmst du einfach 641 als 64.1 also merkst dir das das sozusagen mal 10 genommen ist. Macht man auch bei vielen mikrocontrollern, da dort auch keine fließkommazahlen funktionieren.
    Bei deinen berechnungen, wenn du etwas dazu addierst, addierst du die zahl mal 10 genommen.

    Bei Multiplikation und Division ist es aber nicht mehr so trivial und man muss korrigieren

    X * 10^-1 * Y * 10^-1 = U * 10^-2

    X * 10^-1 / Y * 10^-1 = V



  • rüdiger schrieb:

    Fliesskommazahlen werden in Computern in der Regel nicht als Dezimalzahl sondern ebenfalls als Binärzahl mit Exponent zur Basis 2 dargestellt. Das bietet zwar den Vorteil, dass die Hardware schneller rechnet, aber den großen Nachteil, dass sich Dezimalzahlen nicht unbedingt als Binärzahl darstellen lassen (zB 0.1). Daher kommt es schnell zu Rundungsfehlern!

    Bei Dezimaldarstellung kommt es auch zu Rundungsfehlern.

    Der einzige Unterschied: Im Dezimalsystem sind auch Brüche, die im Nenner den Primfaktor 5 haben, exakt darstellbar. Dadurch eignet es sich z.B. für Geldbeträge. Für allgemeine Anwendungen, z.B. physikalische Simulationen, ist die Dezimaldarstellung nicht besser geeignet.


Anmelden zum Antworten