Hier ein C-Code für die Multiplikation von 16Bit Zahlen und als Ergebnis
erhält man eine 32Bit Zahl:
uint32_t mul16(uint16_t, uint16_t) ersetzt folgenden Ausdruck:
32Bit = 16Bit * 16Bit
Mit Optimierung -0s dauert die Multiplikation 37 Taktzyklen (inklusive
pop und push der Register). Der Quellcode enthält Inline-Assembler
Anteile, was die Multiplikatin beschleunigt.
Damit ist es mögliche alle Arten von Zahlen (Ganzzahl und
Fließkommahzahlen bis 255) zu rechnen die 16Bit brauchen.
Um Fließkommazahlen zu multiplieren müssen diese natürlich erst ins
Binäre umgerechnet werden. Dies wird so durchgeführt:
Den Ganzzahlligen Dezimalwert in die oberen 8Bit hineinschreiben und den
Dezimalen Kommawert mit 2^8 multiplizieren und diesen Wert in die
unteren 8Bit hinein schreiben. Anschließend steht im 32Bit Ergebnis in
den oberen 16Bit die Ganzzahl und in den unteren 16Bit die Kommazahl.
Der Kommawert ist aber nicht Dezimal. Dieser wird Dezimal dadurch
dargestellt, dass der Kommawert mit 1/(2^16) multipliziert wird.
Als Beispiel: Die Zahl 1,1 gibt in Hex: 0x0119 = 1 im oberen Byte und 25
im niederen Byte.
Dadurch hat man zwar eine Auflösung von nur 0,0039 in Dezimal, aber für
viele Regelungstechnische Aufgaben oder Filter reicht es aus. Da hier
die Geschwindigkeit im vordergrund steht.
Verbesserungen und Optimierungen sind erwünscht.
Gruß Alex.