[gelöst]MinGW4.7 + double + Rundungsfehler?

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
Codiac
Beiträge: 21
Registriert: 23. Mai 2013 11:00

[gelöst]MinGW4.7 + double + Rundungsfehler?

Beitrag 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
Zuletzt geändert von Codiac am 25. September 2013 09:00, insgesamt 1-mal geändert.
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: MinGW4.7 + double + Rundungsfehler?

Beitrag 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
Codiac
Beiträge: 21
Registriert: 23. Mai 2013 11:00

Re: MinGW4.7 + double + Rundungsfehler?

Beitrag 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
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: MinGW4.7 + double + Rundungsfehler?

Beitrag 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.
Codiac
Beiträge: 21
Registriert: 23. Mai 2013 11:00

Re: MinGW4.7 + double + Rundungsfehler?

Beitrag von Codiac »

Multiplikation + INT-Vergleich, genau. Das war der Schubs in die richtige Richtung.

Danke für die Hilfe,
Marcel
Antworten