Forum: Mikrocontroller und Digitale Elektronik double / float Problem


von Peter H. (lalido)


Lesenswert?

Hallo Leute,

ich brauche Informationen bezüglich dem Umgang mit float bzw. double 
Datentypen.

(Ich programmiere auf einem Atmega128 mit AVR Studio.)
Warum erhalte ich bei den unteren Beispielen schon ab der 9. bzw. 8 
Stelle Rundungsfehler? Die Datentypen float und double werden doch mit 4 
Byte (32 bit) dargestellt? Kann mir jemand den Hintergrund erklären?
1
unsigned char temp[200];
2
double f=123.1234567;
3
4
dtostrf( f, 12, 7, temp);   //Double in String wandeln
5
printf("\r\n1: %s",temp);
6
// Ausgabe: 1:  123.1234550 --> an der 9. Stelle ist ein Rundungsfehler aufgetreten
7
8
fk=12345678.1234567;
9
dtostrf( fk, 12, 7, temp);   //Double in String wandeln
10
printf("\r\n3: %s",temp);
11
// Ausgabe: 2: 12345677.6142120 --> an der 8. Stelle ist ein Rundungsfehler aufgetreten

von Andreas K. (a-k)


Lesenswert?

Weil float=double nur auf 7 Stellen genau ist. Vergiss den Exponenten 
nicht, der braucht auch Platz.

von Freizeitbastler (Gast)


Lesenswert?


von Peter H. (lalido)


Lesenswert?

Vielen Dank für Eure Beiträge!

Das 1. Bit (MSB = Bit 31) gibt das Vorzeichen an.
Die nächsten 8 Bit (Bits 30 downto 23) repräsentieren den Exponent.
Und somit bleiben nur noch 23 Bits für die Mantisse übrig.
(2^23 ergibt 8.388.608 --> also nur 7 Stellen Genauigkeit.)

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.