Forum: Mikrocontroller und Digitale Elektronik Festkommawert mit printf ausgeben


von Stefan (Gast)


Lesenswert?

Hallo,

ich habe eine Variable (int16) die einen Messwert in Zehntel-Auflösung 
repräsentiert. Um Floats zu vermeiden (läuft auf einem kleinen Atmel µC) 
versuche ich mit Festkomma zu arbeiten, und den Wert als string mit 
einer Nachkommestelle zu formatieren:

int16_t x = 189; //18.9
uint8_t xi = x / 10; //Vor Komma
uint8_t xf = abs(x % 10); //Nach Komma
printf("%hd.%hd", xi, xf);

Wenn nun aber x zwischen -9 und 0 ist (also Wert zwischen -0.9 und 0), 
fehlt das Vorzeichen. Hat jemand eine kompakte Idee?

Stefan

von user (Gast)


Lesenswert?

uint8_t xi = x / 10; //Vor Komma

hier ist es doch als "Unsigned Int8" definiert, also ohne Vorzeichen, 
sollte das nicht so lauten

int8_t xi = x / 10; //Vor Komma

von Stefan (Gast)


Lesenswert?

Stimmt, falsch aus dem Code übernommen. Trotzdem passiert folgendes:
x = -5 (Wert -0.5)
xi = -5 / 10 = 0 (Integer Division)
xf = abs(-5 % 10) = 5

-> "0.5" -> Falsch

von Hilde (Gast)


Lesenswert?

Wieso nicht durch 100 und 10 teilen und einmal den Rest aus durch 10? 
Das sollte dir die Zahl in hunderter Zehner und einer zerlegen.
Stichwort Mod und DIV....

von greg (Gast)


Lesenswert?

Stefan schrieb:
> Stimmt, falsch aus dem Code übernommen. Trotzdem passiert folgendes:
> x = -5 (Wert -0.5)
> xi = -5 / 10 = 0 (Integer Division)
> xf = abs(-5 % 10) = 5

Was erwartest du auch sonst von der Berechnung? Behandle das Vorzeichen 
am Besten separat, dann hast du keine Probleme damit.

Z.B. einfach so, und dann mit in das printf:
1
char s = (x >= 0) ? '+' : '-';

von W.S. (Gast)


Lesenswert?

Hilde schrieb:
> Stichwort Mod und DIV....

lieber nicht. Bei allen Toolchaines, die ich kenne, gibt es ldiv_t und 
ldiv.

Beispiel:
#include <stdlib.h>
#include <math.h>
 long L;
 ldiv_t T;

 T = ldiv(L,10);
 L = T.quot;
 MyDigit = T.rem;

Wenn ihr tollen Programmierer schon Vorschläge macht, dann bittesehr 
doch lieber mal vorher schauen, was es so alles in den Standard-Libs 
gibt. Natürlich kann man auch DIV und MOD benutzen, aber ldiv ist 
schneller und sparsamer als das separate Benutzen von Mod und Div.

Vielleicht gibt's auch ein idiv für ganz kleine µC.. ;-)

W.S.

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.