Forum: Mikrocontroller und Digitale Elektronik AVR-GCC: Ausgabe einer Festkommazahl


von Markus (Gast)


Lesenswert?

Wie kann ich eine Festkommazahl (Beispiel 8 Bit: 0110 1000 == 0.8125) 
als ASCII-String ("0.8125") ausgeben? Gibt es im AVR-GCC dazu eine 
Funktion?

von DerDan (Gast)


Lesenswert?

Hallo,

je nach Controller hätte ich wenig Hemmungen vorher in ein float zu 
wandeln

mfg

von Markus (Gast)


Lesenswert?

DerDan schrieb:
> Hallo,
>
> je nach Controller hätte ich wenig Hemmungen vorher in ein float zu
> wandeln
>
> mfg

Das ist für mich keine Lösung, da die Float-Library für meinen 
ATTiny2313 einfach zu groß ist.

von Dietrich L. (dietrichl)


Lesenswert?

Markus schrieb:
> (Beispiel 8 Bit: 0110 1000 == 0.8125)

Bei diesem Beispiel (Kommastelle ist zwischen D7 und D6) kannst Du
104 (=b110 1000) * 10000 / 128 = 8125 rechnen,
Ergebnis mit itoa in einen String wandeln und "0." vor diesen String 
hängen.

Ob es da etwas eleganteres gibt weiß ich nicht :-(

Gruß Dietrich

von Markus (Gast)


Lesenswert?

Dietrich L. schrieb:
> Markus schrieb:
>> (Beispiel 8 Bit: 0110 1000 == 0.8125)
>
> Bei diesem Beispiel (Kommastelle ist zwischen D7 und D6) kannst Du
> 104 (=b110 1000) * 10000 / 128 = 8125 rechnen,
> Ergebnis mit itoa in einen String wandeln und "0." vor diesen String
> hängen.
>
> Ob es da etwas eleganteres gibt weiß ich nicht :-(
>
> Gruß Dietrich

Vielen Dank.

von Stephan (Gast)


Lesenswert?

Hi,

Die 10000 ist leider nicht richtig!
1/128 ist 0,0078125, demnach wäre 1 => 10000000

....kannst Du 104 (=b110 1000) * 10000000 / 128 = 8125000 rechnen.....

Oder vertue ich mich da?

von Markus (Gast)


Lesenswert?

Das Originalbeispiel von Dietrich ist richtig:

104 * 10000 / 128 = 8125

Ich habe die 3stellige Ausgabe gewählt und Divisor und Dividend gekürzt, 
dann passt das Zwischenergebnis, wenn FP = 0111 1111, in eine 16-Bit 
Variable.

Beispiel:

104 * 125 / 16 = 812,5

von Falk B. (falk)


Lesenswert?


von W.S. (Gast)


Lesenswert?

Markus schrieb:
> Das ist für mich keine Lösung, da die Float-Library für meinen
> ATTiny2313 einfach zu groß ist.

Dann mach es doch selbst und zu Fuß:

1. pack deine 8 Bit Zahl in eine 16 Bit Zahl. Nennen wir sie hier mal 
ZETT.
2. starte deinen Ergebnis-String mit "0."
3. multipliziere die Zahl mit 10
4. nimm den High-Teil der Zahl als Ziffer
   ( Ziffer = '0' + (ZETT>>8; )
   und füge sie an deinen Ergebnis-String an
5. entferne den High-Anteil ( ZETT = ZETT & 255; )
6. wiederhole 3..5 so oft du willst

W.S.

von Blechschaden (Gast)


Lesenswert?

(Beispiel 8 Bit: 0110 1000 == 0.8125) aus dem 1. Beitrag

                       "0."
0x68 * 10 = 0x410
'0' + High(0x410) ->   "0.4"
(0x410) & 0xFF = 0x10

0x10 * 10 = 0xA0
'0' + High(0xA0) ->    "0.40"
(0xA0) & 0xFF = 0xA0

0xA0 * 10 = 0x640
'0' + High(0x640) ->   "0.406"
(0x640) & 0xFF = 0x40

0x40 * 10 = 0x400
'0' + High(0x400) ->   "0.4064"
(0x400) & 0xFF = 0x00

Wo liegt mein Fehler?

von Carl D. (jcw2)


Lesenswert?

Vielleicht daß die FixP-Zahl nicht bis fast 1 (0.8) sondern bis fast 2 
(1.7) geht und deshalb auch das Ergebnis der Rechnung mit Annahme "fast 
1" nur die Hälfte ist. In Klammern jeweils das FixPoint-Format.

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.