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
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
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
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....
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) ? '+' : '-'; |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.