Pages: [1]   Go Down
Author Topic: float Deviation  (Read 486 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 10
Probier's mal mit Gemütlichkeit...
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 271
Posts: 21879
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Alles klar!
Danke Uwe und Mekanax natürlich auch.
« Last Edit: February 01, 2013, 01:32:08 pm by piterek0815 » Logged

Pages: [1]   Go Up
Jump to: