_tcstod Rundungsfehler ?



  • Bei mir passiert unter meinem VisualStudio 2008 reproduzierbar gerade etwas ganz komisches. Und zwar wurde bei mir der CString (buffer = "3.01") mit der Funktion _tcstod zu double (version = 3.009999999998) konvertiert (s.a. Debug-Screenshot). Da ich über Google auf den ersten Trefferseiten nichts gefunden habe, wollte ich hier einfach mal nachfragen, ob es dafür irgendeine plausible Erklärung gibt.

    Beheben, bzw. des Fehler abfangen, werde ich schon irgendwie hinbekommen. Ist halt nur etwas ungünstig, wenn ich mich nicht auf die Standardfunktionen verlassen kann.

    Debug-Screenshot:
    http://www.monika.ag/Downloads/_tcstod_Rundungsfehler.gif

    Oder habe ich vielleicht einfach nur das Revival des berühmten Pentium I Rechenfehlers nicht mitbekommen?

    System: Windows 7 64 Bit, Intel i7-2630QM (weitere Informationen auf Nachfrage)



  • Versuch mal probehalber version = 3.01; dann wird dir sicher was auffallen, nämlich das gewisse Zahlen, u.a. 3.01, keine exakte Entsprechung in double besitzen.


  • Mod



  • Danke für die schnelle Hilfe. Hätte nicht gedacht das double schon Dezimalzahlen mit nur zwei Nachkommastellen nicht mathematisch richtig Abbilden kann. Aber selbst ein if-Abfragen funktionieren problemlos.

    double d1(3.01); // -> im Debugger steht "3.0099999999999998"
    ASSERT(d1 == 3.01);



  • peter_s schrieb:

    Danke für die schnelle Hilfe. Hätte nicht gedacht das double schon Dezimalzahlen mit nur zwei Nachkommastellen nicht mathematisch richtig Abbilden kann.

    Schon bei einer Dezimalstelle, 0.1 geht auch nicht. Das liegt daran, dass solche Zahlen im Binärsystem periodisch sind. So wie 1/3 im Zehnersystem der periodische Dezimalbruch 0.3333... ist, genauso ist 1/10 im Binärsystem periodisch.



  • peter_s schrieb:

    Danke für die schnelle Hilfe. Hätte nicht gedacht das double schon Dezimalzahlen mit nur zwei Nachkommastellen nicht mathematisch richtig Abbilden kann. Aber selbst ein if-Abfragen funktionieren problemlos.

    double d1(3.01); // -> im Debugger steht "3.0099999999999998"
    ASSERT(d1 == 3.01);

    Man fragt keine double/float Werte auf Gleichheit ab.



  • Nachtrag:

    Deine Abfrage funktioniert nur, weil natürlich auch in der Abfrage 3.01 zunächst in ein Double konvertiert wird und der Konvertierungsfehler auftritt. Deswegen stimmt dann auch der Vergleich wieder.


Anmelden zum Antworten