double/float ==
-
Hallo,
ich verstehe folgendes Problem nicht:assert( 8.12 == (3.00+5.12) ); //Assertion Failed!
Wieso bekommt man hier einen Fehler?
Sogar wenn ich alles typecaste ist das falsch.Ich bin dankbar für jede Antwort :)!
-
http://www.binaryconvert.com/result_double.html?decimal=056046049050
http://www.binaryconvert.com/result_double.html?decimal=051
http://www.binaryconvert.com/result_double.html?decimal=053046049050
-
Danke für ihre Antwort!
Wie kann ich das Problem denn beheben?
-
Questhelp schrieb:
Danke für ihre Antwort!
Wie kann ich das Problem denn beheben?Entweder gibt es kein Problem; oder gar nicht. 5.12000000000000010658141036402 + 3 ist eben einfach nicht 8.11999999999999921840299066389.
-
Das Problem, ich sollte zwei Punkte miteinander vergleichen, aber wenn da nun so ein Fall auftritt, dann funktioniert der Algorithmus ja nicht immer. Das ist schlecht ... Wissen Sie ob das nur ein unglücklicher Fall ist, oder gibt es viele solcher Zahlen mit denen es nicht funktioniert?
-
Vielleicht hilft ja ein definiertes epsilon:
const double epsilon = /* */; assert( std::abs(8.12 - (3.00+5.12) ) < epsilon);
Du kannst es ja mal ausprobieren.
Besser wäre es natürlich, die Mathematik hinter der Gleitkommaberechnung zu verstehen, das ist aber keine Aufgabe für einen Sonntagnachmittag.
Übrigens: std::numeric_limits<T>::epsilon liefert für Nicht-Integertypen den Wert, sodass 1.0+epsilon!=1.0.
-
Questhelp schrieb:
gibt es viele solcher Zahlen mit denen es nicht funktioniert?
Jop.
http://www.cprogramming.com/tutorial/floating_point/understanding_floating_point.html
http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
-
unsure schrieb:
Übrigens: std::numeric_limits<T>::epsilon liefert für Nicht-Integertypen den Wert, sodass 1.0+epsilon!=1.0.
Dann muss man aber auch bedenken, dass das (in der wissenschaftlichen Zahlendarstelleung) für den Exponenten 0 gilt.