double auf Display

Gast #3916395
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?
Gast #3916401
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.
Gast #3916429
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.
Moderator (Firma: Titel) Persönliche Seite #3916434
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;
#3916454
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 ?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren