for mit zuwenig durchläufen?
-
Hi,
ich hab ein problem mit meinem code. Aus irgendeinem Grund scheint der compiler das <= Zeichen nur als < zu interpretieren. Sobald ich nur ganze Zahlen benutze (double i = 0; i <= 5; i = i + 1), läuft die Schleife 6 mal durch, mit den Kommazahlen nur 5 mal.
Habe ich da irgendwo einen logischen Fehler drin?
#include <stdio.h> void main(void) { for (double i = 1.0; i <= 1.5; i = i + 0.1) printf("i = %f\n\r", i); }
-
Du solltest Fließkommatypen nicht als Zählvariablen benutzen. Der Wert 0.1 lässt sich z.B. in double oder float nicht genau ablegen. Dadurch kommt es zu Fehlern, die sich durch die wiederholte Inkrementierung aufsummieren.
Benutze int (oder einen anderen Ganzzahltyp) als Zählvariable und rechne damit bei jedem Durchlauf den Fließkommawert aus:
#include <stdio.h> void main(void) { for (int i = 0; i <= 5; ++i) printf("i = %f\n\r", 1.0 + i / 10.0); }
-
also bei mir laueft das ganze 5x durch (sowohl komma als auch ganzzahl)
ist auch irgendwie logisch:1.0 + 5*(0.1) = 1.5
1 + 5*(1) = 5'void main' ist nicht korrekter ANSI-C - code!
mein compiler meint bei initzialisierung in for: <error: `for' loop initial declaration used outside C99 mode>
-
blank schrieb:
1 + 5*(1) = 5
gemeint ist 0 + 5*(1) = 5
-
blank schrieb:
blank schrieb:
1 + 5*(1) = 5
gemeint ist 0 + 5*(1) = 5
Nunja, würden Fließkommazahlen exakt sein, so würde das ganze schon sechs mal laufen, je einmal für die folgenden Werte: 1.0, 1.1, 1.2, 1.3, 1.4, 1.5
Da 0.1 in Dualdarstellung allerdings eine Periode hat (0.000110011001100110011...) muss bei der Darstellung im Rechner gerundet werden. Erfolgt dabei eben eine Aufrundung, so ist in der Variable statt 1.5 eine Zahl, die schon etwas größer als 1.5 ist und darum wird die Schleife dafür nichtmehr durchlaufen.
-
mawis schrieb:
Nunja, würden Fließkommazahlen exakt sein, so würde das ganze schon sechs mal laufen, je einmal für die folgenden Werte: 1.0, 1.1, 1.2, 1.3, 1.4, 1.5
Da 0.1 in Dualdarstellung allerdings eine Periode hat (0.000110011001100110011...) muss bei der Darstellung im Rechner gerundet werden. Erfolgt dabei eben eine Aufrundung, so ist in der Variable statt 1.5 eine Zahl, die schon etwas größer als 1.5 ist und darum wird die Schleife dafür nichtmehr durchlaufen.
okay stimmt, ich hab mich ein bisschen von der problemdarstellung verwirren lassen
-
Ok, danke. Dann weiß ich, das es nicht an falscher Logik, sondern an Unwissenheit lag.
-
es heißt int main! Und vor allem wenn man in ANSI C Forum postet!