Forum: Mikrocontroller und Digitale Elektronik Bei der Berechnung von Kommazahlen "float" vermeiden


von Stefan KM (Gast)


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?

von Jörg B. (manos)


Lesenswert?

5158/256=20
256*20=5120
5158-5120=38
38*10=380

380/256=1
380-256=124
124*10=1240

1240/256=4
usw...

von Benedikt K. (benedikt)


Lesenswert?

Vorkomma: 5158/256=20
Nachkomma: (5158&255)*100/256=14,84375 also 14
Das ergibt dann 20,14°C
Mann kann auch noch richtig runden:
Nachkomma: ((5158&255)*100+128)/256=15,34375 also 15

von Stefan KM (Gast)


Lesenswert?

Danke.

Eine Frage nich.
Was soll das "&" bedeuten. Heißt das logische Verknüpfung?

von Bob (Gast)


Lesenswert?

ja, das ist ein logisches UND, somit wird der Rest der sich nicht durch 
256 teilen lässt berechnet.

von Walter S. (waldo)


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

von Matthias L. (Gast)


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 ;-)

von Falk B. (falk)


Lesenswert?


von Johannes M. (johnny-m)


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)

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.