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 :-)
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.
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.
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...
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