for-schleife
-
wenn ich allerdings
for(double i=0.2; i<=0.3f; i+=0.1) { cout << i; }funkioniert es... komisch
-
Wenn du genaue Werte haben willst, solltest du keine Gleitkommazahlen verwenden - da schleichen sich schneller Rundungsfehler ein als dir lieb sein kann (was dir hier aber auch schon zwei User mitgeteilt haben).
(der Computer rechnet binär und mit einer endlichen Stellenzahl - da kann er nicht einmal den Wert 0.1 exakt darstellen)
-
ja aber läuft nur einmal durch

-
ok dann nehm ich das mal so hin
danke euch

-
@CStoll: fließkommazahlen sind ungenau bei solchen dingen, aber wieso eigentlich?
0.1 + 0.2 = 0.3
oder noch mit weiteren Nachkommastellen?
-
Hallo
Die Rechnung die du da stehen hast bezieht sich ja auch auf Festkommazahlen.
Lies dir mal den Aufbau von Fließkommazahlen durch, du wirst feststellen das diese weit komplizierter als Integers oder Festkommazahlen sind (wobei es in C++ für letzteres keinen eigenen Datentyp gibt)
bis bald
akari
-
Das habe ich vorhin doch schon geschrieben - der Computer rechnet nicht mit Dezimalzahlen, sondern mit Binärzahlen und da ist 0.1 eine unendliche (periodische) Binärzahl, die aus Platzgründen irgendwo abegschnitten werden muß - darum hast du im Speicher keine 0.1, sondern 0.100000015 (oder etwas ähnliches) stehen.
-
fliesskommazahlen werden im binaerformat gespeichert, der Computer speichert ein Vorzeichenbit, dann einen exponenten und eine sogenannte mantisse. In zehnerschreibweise wuerde dann 0,1 * 10^0 aus der 0,1. In Biaerdarstellung saehe das anders aus:
Die negativen Zweierpotenzen sind 0.5, 0.25, 0.125, 0.0625, 0.03125 usw.
0.1 wuerde dann dargestellt alsvorzeichen : 0 //positiv exponent : -3 //da die ersten drei negativen potenzen nicht in 0.1 vorkommen mantisse: 1 // 0.0625 1 // 0.03125 -> Summe 0.09375 0 // 0.015625 passt nicht 0 // 0.0078125 passt nicht 1 // 0.00390625 -> Summe 0.09765625 1 // 0.001953125 -> Summe 0.099605375 . . .Du siehst, unsere schoenen dezimalen Zahlen mit einer Nachkommastelle koennen im zweierbereich unheimlich krumm sein und nie ganz angenaehert werden. Bei additionen kommen Rundungsfehler hinzu, und deshalb ist
0.1 + 0.2 != 0.3
-
jo und deswegen muss er >= in die Forschleife reintun

-
bringt auch nichts. Du kannst nie genau wissen, ob die Zahl die du durch die Additionen produzierst, intern nun groessewr oder kleiner sind als das was du erwartest. 0.1 + 0.2 mag groesser sein als 0.3, aber 0.2 + 0.2 koennte kleiner sein als 0.4, waerend wiederum 0.1+0.3 groesser sein ist als 0.4 - das Verhalten ist fuer den otto-normal-hacker nicht vorhersehbar, es sei denn du weisst exakt, wie dein Compiler die Dinger intern verwaltet und rechnest es jedesmal vorher aus. Da ist der Aufwand, das Ganze mit ints zu bewerkstelligen, deutlich geringer. Schlimmer noch, da der standard nicht genau festlegt, wie die Fliesskommazahlen intern gespeichert werden, ist das Ergebnis derartiger Vergleiche nicht festgelegt und daher das Verhalten deiner Schleife nicht definiert...
-
nun wird mir einiges klarer, dankö 