Forum: Mikrocontroller und Digitale Elektronik double auf Display


von u_SD (Gast)


Lesenswert?

Hallo,

ich hatte schon einen älteren Thread mit folgenden Problem. Ich habe 
eine Funktion mit der ich doubles problemlos direkt auf dem Display 
ausgeben kann. Dies funktioniert wunderbar.

Jetzt versuche ich Rechenoperationen auszuführen und das Ergebnis auf 
dem Display auszugeben.
1
double amount;
2
unsigned char anzahl;
3
anzahl = 1; // 2,3,4,5,6,7,8,9,10, ... 
4
amount = anzahl * 0.01; // 0.02, 0.05 
5
integertodisplay_mehrstellig_double(amount);

Die Anzeige klappt tadellos, AUßER wenn anzahl eine Potenz von 5 ist, 
also wenn anzahl = 5,10,15,20... ergibt sich einer fehlerhafte Anzeige, 
nämlich z.B. 5*0.01 = 0.04; 10*0.01= 0.09; 10*0.02 = 0.19 usw.

jemand eine Ahnung woran das liegen könnte?

von Stefan F. (Gast)


Lesenswert?

> anzahl * 0.01

anazhl ist vom Typ unsigned char
0.01 ist von Typ float

Das Ergebnis dieses Ausdruckes ist daher vom Typ float, also weniger 
genau als double. Ich schätze, dass bei der automatischen Konvertierung 
von float nach double ein Rundungsfehler auftritt.

von u_SD (Gast)


Lesenswert?

> von float nach double ein Rundungsfehler auftritt.

hmm, danke schon einmal.

Ich habe es mal mit
1
amount = anzahl * (double)0.01;

ohne Erfolg versucht!

von Dr. Sommer (Gast)


Lesenswert?

Falsch, 0.01 ist vom Typ double. Aber double ist zB bei AVR exakt das 
selbe wie float (32bit). Das ist ein Rundungsfehler, denn 0.01 ist nicht 
darstellbar, sondern nur 0.0099999... Überrascht? Dann lies noch mal 
genau durch wie floating point funktioniert, und stelle fest dass es 
für deinen Zweck wahrscheinlich ungeeignet ist.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

u_SD schrieb:
> 5*0.01 = 0.04;
5*0.01 ist mit verschwindend geringem Fehler 0.4999999
Und wenn du die ganzen 9 abschneidest, dann hast du die "falsche" 
Anzeige.

> Ich habe es mal mit  amount = anzahl * (double)0.01;
> ohne Erfolg versucht!
Dann probiere es mal mit Aufrunden für die Anzeige:
amount = anzahl * (double)0.01 + 0.005;

von Kai S. (zigzeg)


Lesenswert?

u_SD schrieb:
> Ich habe
> eine Funktion mit der ich doubles problemlos direkt auf dem Display
> ausgeben kann. Dies funktioniert wunderbar.

Ich glaube gerade in dieser Funktion steckt das Problem: Man muss bei 
der Anzeige immer korrekt runden. Wie schon erwaehnt wird so dann aus 
0.04999999 dann das korrekte 0.05.

Genaueres kann man aber ohne die Funktion zu kennen nur raten. Post doch 
mal diese Funktion ?

von u_SD (Gast)


Lesenswert?

> Dann probiere es mal mit Aufrunden für die Anzeige:
> amount = anzahl * (double)0.01 + 0.005;

Super, das funktioniert in der Tat.

Vielen Dank für die Erklärungen an Alle!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.