Das ist schneller und wenns denn unbedingt sein muss, kann man das Ergebnis ja immer noch in den Floatwert umrechnen. Mit ein wenig Nachdenken kann man solche Floatrechnungen aber oft umgehen.
Man kann die LUT auch mit einer Initialisierungsroutine bestimmen und die Gewichtungen dort als Parametersatz mitgeben. So wären (niederfrequente) Änderungen zur Laufzeit möglich:
Eine LUT ist bei 16 Werten tatsächlich auch ein guter Ansatz.
aber nicht als float, etwas oversized...
Was denn? 16 floats sind 64 Byte groß. Das ist ggf. kürzer als ein Programm. Und ints sind bei einer 32-Bit-Maschine gleichgroß.
Ich würde hier bis mindestens zu einer 256er-LUT gehen. Für 16-Bit-Eingangswerte dann auf zwei 256er-LUTs splitten und Low- und High-Byte-Anteile addieren. Für 32 Bit analog 4 LUTs.
Der Unfug bei Floats ist die für jede Addition zusätzlich erforderliche
Hin- und Hershifterei. Nicht jedem ist der Rechenaufwand egal.
Barrel-Shifter und Co-Prozessoren wurden aber schon erfunden, oder? Wenn die Vorgabe Floats sind, dann sind das eben Floats. Umso mehr sind daher LUTs angesagt. Da gibt es nur load und store.
Meine langjährige Erfahrung: wer so eine Frage stellt, verwendet Floats nicht unbedingt deshalb, weil er sie für die Aufgabe auch tatsächlich braucht. Siehe meinen ersten Post zu diesem Thema...
Barrel-Shifter und Co-Prozessoren wurden aber schon erfunden ...
Was erfunden wurde, ist spätestens dann egal, wenn es um einen konkreten µC geht. Dann kommt es nämlich nur darauf an, wie dieser konkrete µC HW-mäßig ausgestattet ist und was per SW emuliert werden muss.
Aber noch geht es ja nur darum, Peter vom Schlauch herunter zu helfen.
Ob irgendwelcher Optimierungsaufwand lohnt, hängt sowieso von der konkreten Anwendung bzw. vom sportlichen Ehrgeiz ab.
Einfach 3,8,15 und 22 in Ihren Summen in die LUT und erst am ende einen
schönen float draus machen, wenn überhaupt wirklich nötig...
Und dann wird statt 0.3 auf einmal 0.31841 und statt 0.8 0.79876 verlangt - und dann?
Hier steht ausdrücklich "zum Beispiel":
Peter N. schrieb im Beitrag #7397371:
Das ist klar und sicher, aber eine variable extra loop (mit shift) ist ungünstig, wenn das auch ohne geht.
In den AVR/Tiny Cores von Spence Konde wurde die Arduino Standard shiftout/in() Funktion entspr. meinem Vorschlag ersetzt. Spence Konde hat zuvor umfangreich detailierte Tests durchgeführt und weitere Varianten erprobt. Ziel war maximal shift speed.
Bei einer Ganzzahl von 32 Bit stehen für die Ziffern bis zu 31 Bit zur Verfügung (ein Bit von den 32 fürs Vorzeichen).
Wenn man die Ganzzahl also optimal normiert, hat man 8 Bit mehr für gültige Stellen zur Verfügung, also ein Faktor 256 mehr in der Auflösung.
Man könnte auch über die Abstände als Ganzzahl rechnen..
Das würde für ein anderes Problem (Ganzzahl) in anderen Fällen (mehr Punkte) mit speziellen Randbedingungen (kein Abstand> 8 oder 16 Bit) Speicherplatz sparen können. Zulasten von Laufzeit und Code. Hier sehe ich keinen Vorteil zur Kiss-Lösung