Forum: Mikrocontroller und Digitale Elektronik avr: Runden von Festkommazahlen


von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

ich stehe grad auf dem Schlauch:

ich führe eine Festkomma-Multiplikation von zwei 16-Bit-Festkommazahlen 
durch, das Ergebnis hat 32bit:

r2:r5 = r16:r17 * r20:r21
1
     clr        r25
2
     fmuls  r17, r21
3
     movw  r4, r0
4
     fmul  r16, r20
5
     movw  r2, r0
6
     adc  r4, r25
7
     fmulsu  r17, r20
8
     sbc  r5, r25
9
     add  r3, r0
10
     adc  r4, r1
11
     adc  r5, r25
12
     fmulsu  r21, r16
13
     sbc  r5, r25
14
     add  r3, r0
15
     adc  r4, r1
16
     adc  r5, r25

Vom Ergebnis interessieren mich aber nur die höherwertigen 16 bit, also 
r4:r5. Natürlich kann ich r2:r3 einfach ignorieren, richtigerweise 
gehört aber gerundet. Nur - wie mach ich das am besten?

0.5 addieren wäre eine Möglichkeit, aber ich könnte ja auch auf Bit 7 in 
r3 prüfen, oder?

Noch dazu können die zahlen negativ sein, wenn ich immer Richtung null 
runden will, komme ich da um eine Vorzeichenprüfung (und damit einen 
branch) herum? Gibts da einen genialen Trick?

Danke, Michi (der fmul entdeckt hat und liebt, aber noch ziemlich 
schwimmt :-)

von Karl H. (kbuchegg)


Lesenswert?

Michael Reinelt schrieb:

> 0.5 addieren wäre eine Möglichkeit, aber ich könnte ja auch auf Bit 7 in
> r3 prüfen, oder?

Könntest du.

> Noch dazu können die zahlen negativ sein, wenn ich immer Richtung null
> runden will, komme ich da um eine Vorzeichenprüfung (und damit einen
> branch) herum?

> Danke, Michi (der fmul entdeckt hat und liebt, aber noch ziemlich
> schwimmt :-)

Ehe es Foren gab, behalfen sich die Programmierer damit, dass sie die 
Dinge manchmal einfach ausprobiert haben und Testzahlen durch die 
Algorithmen gejagt haben, von denen sie sich vorher überlegt haben, was 
eigentlich rauskommen müsste. Diese Erwartung haben sie dann mit dem 
tatsächlichen Ergebnis verglichen, wobei sie sich für alle möglichen 
auftretenden Sonderfälle entsprechende Testfälle überlegt haben. Das hat 
das Verständnis der Sache ungemein erhöht und die Lernkurve enorm 
angestachelt. Ich finde, diese 'Tradition' sollte nicht abkommen. Es 
sind immer 2 Paar verschiedene Schuhe, ob man in einem Forum einfach 
eine Antwort bekommt, oder ob man sich die Sache selbst erarbeitet hat. 
Selbst wenn letzteres etwas länger dauert.

Langer Rede, kurzer Sinn: warum probierst du deine Ideen nicht einfach 
aus? Sei es in realen Codebeispielen auf dem µc oder einzelne Fälle auf 
Papier aufgedröselt in Einzelbits. Bei Multiplikation gibt es jetzt 
nicht so wahnsinnig viele Fälle der Vorzeichenkonstellationen.

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Karl Heinz schrieb:
> warum probierst du deine Ideen nicht einfach
> aus?

Ja, da hast du recht :-) ich könnte das ja auch zum Anlass nehmen, mein 
printf-Ökosystem (gottseidank hab ich ein eigenes) um Fract-Support 
auszubauen.

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Michael Reinelt schrieb:
> ich könnte das ja auch zum Anlass nehmen, mein
> printf-Ökosystem um Fract-Support
> auszubauen.

Heidenei, da steig ich ja von einem Schlauch auf den nächsten, auf dem 
ich jetzt stehe...

Ich krieg momentan geistig nicht auf die Reihe, wie man _Fract in 
string-darstellung wandelt. Kann gcc bzw. die libc das? Mein Google sagt 
mir, dass die funktion wohl ktoa() heissen wollte, aber soweit ich sehen 
konnte hat sich noch keine gefunden der das implementiert hat? Oder 
täusche ich mich?

Zur Not mach ich das ja auch "zu Fuß", aber ich hab momentan ein 
Blackout wie ich das angehe...

von Georg (Gast)


Lesenswert?

Michael Reinelt schrieb:
> Noch dazu können die zahlen negativ sein

Man kann alle möglichen Rundungsregeln definieren, aber wenn man 
negative Zahlen auch zum grösseren Wert hin rundet (also einfach + 0,5), 
dann wird

4,5 + 0,5 = 5,0 -> 5
-4,5 + 0,5 = -4,0 -> -4

D.h. Belastung und Gutschrift von jeweils EUR 4,50 würden in der Summe 1 
EUR Guthaben ergeben, eine wundersame Geldvermehrung.

Daher muss kaufmännisch der BETRAG gerundet werden, und das ist auch das 
üblichste.

Georg

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.