Forum: Mikrocontroller und Digitale Elektronik Festkommazahl


von Piet (Gast)


Lesenswert?

Hallo,

ich will eine 8 Bit Variable als Festkommazahl auf einem LCD Display 
anzeigen lassen. Aber wie krieg ich das Komma an die richtige Stelle?

mfg piet

von Karl H. (kbuchegg)


Lesenswert?

zb indem du dir Vorkomma und Nachkommaanteil getrennt in Textform 
erzeugen lässt.
Vorkomma ausgeben
',' ausgeben
Nachkomma ausgeben

zb
1
  uint8_t  i;     // Format: 2 Nachkommabits
2
                  //   Zahl ist also das 4-fache der richtigen Zahl
3
                  // 4.5  wird also als 18 gespeichert
4
  char Buffer[10];
5
6
  i = 18;
7
  sprintf( Buffer, "%d,%02d", i / 4 , i % 4 );      // Ausgabe ist dann "4,50"
8
  lcd_puts( Buffer );

von df1as (Gast)


Lesenswert?

Ansatz ist ok, das Beispiel stimmt aber nicht ganz. Wenn du zwei 
Nachkommastellen ausgeben willst, musst du schon die Zahl um 100 größer 
führen und dann i/100 und i%100 ausgeben. Oder, wenn es Schrittweite 1/4 
= 0,25 sein soll, muss man den mod-4-Anteil noch mit 25 multiplizieren:

unsigned int u = 19;
sprintf (aucTemp, "%u,%02u", u/4 , (u%4) * 25);  // 4.75

oder

unsigned int u = 476;
sprintf (aucTemp, "%u,%02u", u/100 , u%100);  // 4.76

(Passt aber so nur von 0,00 bis 2,55 in 8 Bit!)

Bei vorzeichenbehafteten Zahlen ist, insbesondere mit der %-Operation, 
besondere Vorsicht geboten. Ich benutze beim print() immer lieber %u, 
wenn es ohne Vorzeichen sein soll.

von Karl H. (kbuchegg)


Lesenswert?

df1as schrieb:

> führen und dann i/100 und i%100 ausgeben. Oder, wenn es Schrittweite 1/4
> = 0,25 sein soll, muss man den mod-4-Anteil noch mit 25 multiplizieren:

Äh.
Danke für die Korrektur. Da war ich wohl etwas abgelenkt

von df1as (Gast)


Lesenswert?

Und noch ein Beispiel mit einer Nachkommastelle:

unsigned int u = 196;
sprintf (aucTemp, "%u,%u", u/10 , u%10);  // 19,6.

von Falk B. (falk)


Lesenswert?


von Piet (Gast)


Lesenswert?

Hallo,

erstmal danke für die Antworten.


> unsigned int u = 476;
> sprintf (aucTemp, "%u,%02u", u/100 , u%100);  // 4.76

> (Passt aber so nur von 0,00 bis 2,55 in 8 Bit!)

schon ausprobiert, klappt gut.

wie muss ich die Variable jetzt deklarieren, dass ich in denn Bereich 
0,00 - 35,00 komme?

mfg piet

von Schorsch (Gast)


Lesenswert?

Piet schrieb:
> wie muss ich die Variable jetzt deklarieren, dass ich in denn Bereich
> 0,00 - 35,00 komme?

Wenn du schnell rechnen können willst: 6 Bit vor'm Komma, zwei danach. 
Geht dann halt bis 63, und verschenkt so Auflösung.

Alternative: Div/Mod 36.

von df1as (Gast)


Lesenswert?

Hast du denn mehr als 8 Bit zur Verfügung?

Sonst z. B. eine 16-Bit-Variable, "uint16_t" oder ähnlich. Hängt vom 
Compiler ab. Ich nehme für 16 Bit "unsigned short".

3500 muss hineinpassen, wenn du Hundertstel anzeigen willst.

unsigned short usWert = 3499;
printf ("%u,%02u", usWert/100, usWert%100);  // 34,99

Wenn es doch nur 8 Bit sind, kannst du mit der Einheit 1/5 rechnen:

unsigned char ucWert = 174;
printf ("%u,%u", usWert/5, (usWert%5) * 2);  // 34,8

von df1as (Gast)


Lesenswert?

unsigned char ucWert = 174;
printf ("%u,%u", ucWert/5, (ucWert%5) * 2);  // 34,8


Hatte mich vertippt.

von Piet (Gast)


Lesenswert?

Hallo,

vielen Dank hatt wunderbar geklappt.

mfg piet

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.