Festkommadarstellung Zahlen <0,1 fehlerhaft

Gast #7122479
Guten Tag,

ich programmiere gerade eine Festkommadarstellung in 32bit. Ich brauche 
3 Vorkomma- und 2 Nachkommastellen(10 Vorkommabits, 22 Nachkommabits). 
Zur Ausgabe habe ich mir diese kleine Routine geschrieben. Diese 
funktioniert soweit auch, allerdings werden Zahlen <0,1 falsch 
ausgegeben. Wenn ich einfach mal mit einer For-Schleife alle Zahlen 
durchprobiere, fängt die Ausgabe bei 0,1 an und nicht bei 0,01. Ich 
finde allerdings den Fehler einfach nicht. Hat hier jemand mit mehr 
Erfahrung eine Idee?

Grüße
Klaus
1
void printInt(int data)
2
{
3
  int Vorkomma = (data & 0xFFC00000) >> 22;  
4
  int Nachkomma = data & 0x3FFFFF;
5
  Nachkomma = ((Nachkomma * 100) + (2097152)) / 4194304;
6
  printf("%d,%d\r\n", Vorkomma, Nachkomma);
7
}
Gast
Es faengt schon damit an dass:

> 10 Vorkommabits
eben nicht fuer
> 3 Vorkomma- ... stellen
reichen. Da fehlt schon mal das Bit fuer das Vorzeichen.

Ansonsten muss man eine Q10.22 Zahl nur mit ihrem
Skalierungsfaktor multiplizieren, um sie als Gleitkommazahl
zu erhalten.
Gast
ich habe vergessen zu erwähnen, dass ich nur unsigned Integer brauche, 
deshlab sollten 10 Vorkommabits eigentlich reichen, oder? Die Ergebnisse 
sind ja richtig außer wenn ein Ergebnis <0,1 herauskommt.
Gast
Klaus schrieb:
> 3 Vorkomma- und 2 Nachkommastellen(10 Vorkommabits, 22 Nachkommabits).

Und dann meinst du, das mit printf zum Schluß zu machen. Hmm...

Hier mal etwas aus dem Stegreif:
(hoffentlich nicht vergaloppiert)
1
 // ganzen Teil ausgeben
2
 tmp = data >> 22;      
3
 Dezi_Out(tmp);
4
 Char_Out(".");
5

6
 // Nachkommastellen ohne Rundung ausgeben
7
 i = 0;
8
 tmp = data & 0x3FFFFF; // gebrochenen Teil abtrennen
9
 while (i<2)            // nur 2 Nachkommastellen machen
10
 { tmp = tmp & 0x3FFFFF; 
11
   tmp = 10 * tmp;
12
   ch = "0" || (tmp >> 22);
13
   Char_Out(ch);
14
   ++i;
15
 }

W.S.
Gast
Klaus schrieb:
> Tatsache, vielen Dank für die Antwort. Da hätte ich wahrscheinlich noch
> lange dran gesessen :D.
>
> Schönes Restwochenende

Das ist aber nur die halbe Miete. Du musst noch dafür sorgen, daß die 
'Nachkomma' Variable maximal 2-stellige Werte annehmen kann, sonst wird 
wieder nur Mist angezeigt. Bei deiner Formel geht der Wertebereich bis 
100.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 4 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.