For schleife inkrementieren

coolnes

Grünschnabel
Hallo an alle,

ich habe eine Hausaufgabe auf in Programmieren und ich komme bei einem Teilproblem nicht weiter.

Ich habe z.B. folgenden Code:
PHP:
#include<stdio.h>
int main(int argc, char* argv[])
{
float x=1, dx;
 for(dx=0;dx<=x;dx=dx+0.1)
{
     printf("x:%f | dx:%f\n", x, dx);
}

getchar();

}

Ich habe also x=1 und möchte das dx von 0 bis 1 in 0.1 schritten läuft jedoch geht es nicht. Wenn ich es ausführe ist das letzte dx 0.9

Ich hoffe Ihr könnt mir helfen, danke!
 
Hallo,

das ist ein Rundungsfehler. Die letzte Addition von 0.1 ergibt nämlich nicht genau 1.0 sondern etwas mehr, so dass die Abbruchbedingung erfüllt wird.
Der Grund liegt darin, dass die Zahl 0.1 als binäre Gleitkommazahl perodisch ist, also im binären Zahlensystem nicht exakt darstellbar ist: 0.000110011001100110011...

Wenn du dir mal ein paar mehr Nachkommastellen anzeigen läßt, wirst du das sehr schnell sehen:
C++:
for( dx = 0; dx <= x; dx += 0.1 )
{ 
    printf("x:%12.10f | dx:%12.10f\n", x, dx);
}

Ich würde daher als Laufvariable einen int-Wert verwenden und in der Schleife durch 10 dividieren:
C++:
for( int i = 0; i <= 10; i++ )
{ 
    float dx = i/10.0;
    ...
}
Gruß
MCoder
 
Zurück