mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Festkommazahl


Autor: Piet (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

zb
  uint8_t  i;     // Format: 2 Nachkommabits
                  //   Zahl ist also das 4-fache der richtigen Zahl
                  // 4.5  wird also als 18 gespeichert
  char Buffer[10];

  i = 18;
  sprintf( Buffer, "%d,%02d", i / 4 , i % 4 );      // Ausgabe ist dann "4,50"
  lcd_puts( Buffer );

Autor: df1as (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: df1as (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und noch ein Beispiel mit einer Nachkommastelle:

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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Piet (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Schorsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: df1as (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: df1as (Gast)
Datum:

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


Hatte mich vertippt.

Autor: Piet (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

vielen Dank hatt wunderbar geklappt.

mfg piet

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.