Go Down

Topic: float Deviation (Read 534 times) previous topic - next topic

piterek0815

Hallo zusammen,
kann jemand diese Abweichung erklären?
Das Programm soll Zahlen von 0 bis 10 in Schritten von 0,1 ausgeben,
Das Ergebnis ist jedoch so:
Die Schleife durchläuft den Wert 10 garnicht!
(ich verwende Micro und UNO R3)

Programm:

void setup()
{
Serial.begin(9600);
}


void loop()
{
   for (float x=0; x<=10; x=x+0.1)
    {
       Serial.println(x,10);
    }

   delay(10000);
}

Output:

0.0000000000
0.1000000000
0.2000000000
0.3000000000
0.4000000000
0.5000000000
0.6000000000
0.7000000476
0.8000000953
0.9000000953
1.0000001192
1.1000001430
1.2000001668


8.7999973297
8.8999977111
8.9999980926
9.0999984741
9.1999988555
9.2999992370
9.3999996185
9.5000000000
9.6000003814
9.7000007629
9.8000011444
9.9000015258

Mekanax

Hi Piterek,
ist doch klaro, 9,9 + 0,1 wäre >10...
Das Problem ist halt die Ungenauigkeit bei floats. Rechne doch mit (long) integer - nach dem Motto increment um 1 entspricht 0,1 und für die Ausgabe wieder durch 10 teilen.
MfG   Mekanax

uwefed

Das ist fisologisch bei Fließkommazahlen. Sie können zwar einen sehr großen Bereich an Werten abdecken (3.4028235E+38 bis -3.4028235E+38) aber haben nur eine Genauigkeit von 6 bis 7 Ziffern. Daher kommen diese Rundungsfehler.
Die Lösung hat Mekanax  bereits gezeigt.
http://arduino.cc/en/Reference/Float

Grüße Uwe

piterek0815

#3
Jan 28, 2013, 11:09 am Last Edit: Feb 01, 2013, 07:32 pm by piterek0815 Reason: 1
Alles klar!
Danke Uwe und Mekanax natürlich auch.

Go Up