Simon schrieb:
> Ein wirklich guter Trick!
Letztendlich ist die allgemeine Aufgabe hier:
"Dividieren per Multiplikation mit Kehrwert"
Denn es soll ja eigentlich der Eingangswert e=0..899 durch den Divisor
d=56,25 geteilt werden, um ein Resultat r im Bereich 0..15 zu bekommen:
Umgestellt sieht das dann so aus:
Das kann man jetzt erweitern durch eine Zweierpotenz:
Umgestellt sieht das dann so aus:
Das 1/2^n ist eine Division durch eine Zweierpotenz und damit in
Hardware nur ein "Ignorieren" der unteren Bits, also nur ein
Umverdrahten.
Bleibt also leztlich wieder nur die Aufgabe den mittleren Term 2^n/d zu
optimieren. Mit ein wenig probieren oder Erfahrung kommt man da dann
recht schnell auf eine "Magic Number", die die Eigenheiten der Hardware
(z.B. Breite der zur Verfügung stehenden Multiplizierer) berücksichtigt.
Und so komme ich im Fall hier mit einer Divivson durch 2^20 also dem
Abschneiden der unteren 20 Bits auf den Wert 2^20/56.25 = 18641.
Dieser Wert war dann auch der erste, den ich intuitiv ins Rennen
geworfen hatte.
Der zweite im
Beitrag "Re: Effizienter Weg gesucht um zu prüfen, ob Variable im Bereich liegt"
aufgezeigte Weg ist eigentlich mathematisch falsch, weil er nicht wie
gewünscht durch 56,25 teilt, sondern die Bereichsendwerte 0 und 899 auf
die Bereichsendwerte 0 und 2^24-1 zueinander skaliert. Das resultiert in
einer geringfügig anderen Steigung der Zuordnung (im Promillebereich).
Es entspricht quasi dem Fehler, den ich mache, wenn ich einen
10-Bit-AD-Wandler mit 0..5V so umrechne: U = 5.0*adw/1023 oder so U =
5.0*adw/1024.
Im ersten 1023er-Fall kommt bei einer Eingangsspannung von 5.0V eben
auch 5.00V auf die Anzeige, im eigentlich korrekten 1024er-Fall steht
auf der Anzeige nur 4,99V.