Bei der Berechnung von Kommazahlen "float" vermeiden

Gast #760125
Lesenswert?

Hallo zusammen.

Ich möchte gern eine Temperatur mit zwei Nachkommastellen anzeigen (in 
einem Display angesteuert von einem ATMega64).

Meine Temperatur ist zunächst ein Integer mit 256 Multipliziert, z.B. 
5158 für 20,15°C.

Wie kann ich die Nachkommastelle berechnen ohne den Datentypen float zu 
verwenden?
Die Berechnung 5158/256=20; auf Integer Ebene, und die Nachkommastelle?
Wird das Modulo berechnet?

Oder komme ich nicht drumherum?
#760167
Lesenswert?

Hallo,
ich würde das ganze mit 100 multiplizieren und durch 256 dividieren:

5158*100/256 = 515800/256 = 2014,844

Wenn Du nun diese Zahl nach BCD wandelst hast Du 2 Nachkommastellen!

Das Ergebnis der Multiplikation ist eine 32Bit oder 24Bit Zahl. Du 
addierst 128 dazu um zu runden. Dann nimmst Du das Byte 1 und 2 und 
wandelst das nach BCD.

Das ganze geht gut in Assembler!

Waldo
Gast #760191
Lesenswert?

>Meine Temperatur ist zunächst ein Integer mit 256 Multipliziert, z.B.
>5158 für 20,15°C.

Das sind doch beste Vorraussetzungen:
Also:
-highbyte von 5158 (20) auf die Anzeige schaffen,              20
-Punkt darstellen,                                             20,

-lowbyte von 5158 (38) mit 10 multiplizieren =>380,
-highbyte des Ergebnisses (01) zur Anzeige schaffen,           20,1

-lowbyte von 380 (124) mit 10 multiplizieren =>1240,
-highbyte des Ergebnisses (04) zu Anzeige schaffen,            20,14

-lowbyte von 1240 (216) mit 10 multiplizieren =>2160,
-highbyte des Ergebnisses (08) zu Anzeige schaffen,            20,148

-lowbyte von 2160 (112) mit 10 multiplizieren =>1120,
-highbyte des Ergebnisses (04) zu Anzeige schaffen,            20,1484
...
und so weiter, je nachdem, wieviel Stellen du willst...
(oder Abrruch bei Nullen im Lowbyte)

PS: 5158/256 = 20,1484...
Das Verwenden des HighBytes ersetzt! das /256 !
Einfacher bekommst dus nicht ;-)
#760269
Lesenswert?

Bob wrote:
> ja, das ist ein logisches UND,
Nein, es ist ein bitweises UND. Die Operation "x&255" ist eine andere 
Schreibweise für "x%256" (x modulo 256). Jeder anständige C-Compiler 
macht aber aus einem "%256" automatisch eine dem "&255" entsprechende 
Operation (bei 8-Bit-Rechnern bedeutet das einfach: "Nimm nur das 
Low-Byte für die anschließende Operation").

Generell gilt
x % 2^n = x & (2^n - 1)

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