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