Seite 1 von 1
[gelöst]MinGW4.7 + double + Rundungsfehler?
Verfasst: 24. September 2013 07:43
von Codiac
Hallo zusammen,
ich habe folgendes Problem:
Code: Alles auswählen
double SOLL = 6.8;
double TOLERANZ = 0.1;
double IST = 6.9;
bool ZU_GROSS = (IST > (SOLL + TOLERANZ)); //ZU_GROSS == true! :-(
Sieht aus wie ein Rundungsfehler. Hat Jemand eine Erklärung bzw. Lösung, denn eigentlich liegt IST ja (gerade noch) in der Toleranz.
Danke,
Marcel
Re: MinGW4.7 + double + Rundungsfehler?
Verfasst: 24. September 2013 11:42
von veeman
Das liegt an der Natur eines double, dass einige Zahlen beim Rechnen nicht den exakten wert ergeben sondern bedingt durch die Binäre Darstellung sich Abweichungen ergeben (bei float ist es nicht anders).
siehe auch
Double-precision_floating-point_format
Re: MinGW4.7 + double + Rundungsfehler?
Verfasst: 24. September 2013 14:36
von Codiac
Hallo veeman,
danke für Deine Antwort. Trotzdem bleiben für mich drei Fragen offen:
Warum muss ich schon bei der ersten Nachkommastelle damit kämpfen?
Gibt es einen genaueren Weg, den IST-/SOLL-Vergleich hinzubekommen?
Falls nicht: Warum existiert die New Yorker Börse noch?
Grüße,
Marcel
Re: MinGW4.7 + double + Rundungsfehler?
Verfasst: 24. September 2013 16:06
von veeman
Der Grund sollte im Verlinkten Artikel beschrieben werden.
Wie schon gesagt hängt das von der Binären Darstellung ab und nicht jede (nachkomma) Stelle kann exakt dargestellt werden.
Einfachste Gegenmaßnahme die Tolleranz häher setzen (zB. 0.10005).
Andere möglichkeit; Wert und Toleranz mit einer Zehnerpotenz multiplizieren, expliziet in ein int konvertieren und vergleichen.
Re: MinGW4.7 + double + Rundungsfehler?
Verfasst: 25. September 2013 08:59
von Codiac
Multiplikation + INT-Vergleich, genau. Das war der Schubs in die richtige Richtung.
Danke für die Hilfe,
Marcel