Festkommawert mit printf ausgeben

Gast #3506079
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
Gast #3506145
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) ? '+' : '-';
Gast #3507306
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.

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