Genauigkeit von float-Werten ändert sich
-
Hallo zusammen,
in einer Text-Datei stehen eine Reihe von float-Werten, die ich einlesen lassen.
Die Text-Datei sieht etwa so aus:0.9 3.1 1.5 ...
In meinem Programm ist etwa folgendes zu finden:
// ... istringstream is( strLine ); // strLine = eine Zeile aus der Datei float v = 0; is >> v;
Ich musste feststellen, dass beim Einlesen manchmal die Genauigkeit der float-Werte geändert wird:
// 0.9 (in Datei) cout << "wert = " << setprecision(12) << v << endl; // ==> 0.899999976158
Ich hätte hier etwas wie 0.900000000 erwartet.
Auf das Problem bin ich beim Vergleichen von float-Werten gestoßen, wo in einer if-Abfrage zwei Werte, die gleich sein sollten, als ungleich erkannt wurden.Hatte jemand von euch bereits ein ähnliches Problem? Wie kann ich es umgehen?
Dank und Grüsse
-
Float-Werte sollte man niemals auf Gleichheit prüfen.
-
tjoa schrieb:
Float-Werte sollte man niemals auf Gleichheit prüfen.
Danke für deine Antwort. Die Aussage war mir neu. Welche Optionen habe ich denn, wenn ich doch mal in die Verlegenheit gerate?
-
Welche Optionen habe ich denn, wenn ich doch mal in die Verlegenheit gerate?
float f1 = 1.5; float f2 = 1.5; float epsilon = 0.00001; if( (f1 > f2-epsilon) && (f1 < f2+epsilon) ) { .. }
-
Danke.
-
das ist so weil der computer "kommazahlen" natürlich auch binär speichert. so ist aber z.b. 0.4 in binärdarstellung periodisch. dementsprechend kann er gar kein 0.4 speichern. so entstehen diese ungenauigkeiten.
-