Gast
#1780424
Hallo zusammen, ich stehe hier gerade vor einem kleinen Problemchen. Ich will mal versuchen es strukturiert zu (be)schreiben: Ziel ist es, eine Funktion zu bauen, die mir "Zwischenwerte" (durch linearisieren) aus einer Wertetabelle generiert. Die Tabelle ist eine 16-bit -> 16-bit "Abbildungstabelle" (abgelegt in 2 arrays pos[] und val[]) und wird in etwa (mit krümmeren Zahlen) wie folgt aus sehen:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
Nun habe ich eine Funktion, welche mir aus einem gegebenen Suchwert (z.B. sw=39000) ein tabellenindex i(=2 im Beispiel) zurück liefert, da pos[i]=38000 <= sw=39000 < pos[i+1]=43000 Was ich nun suche ist eine Funktion die mir im Prinzip nichts anderes berechnet als: f(x) = val[i] + ( sw - pos[i] ) * ( val[i+1] - val[i] ) / ( pos[i+1] - pos[i] ) Im Beispiel: f(x) = 20000 + (39000-38000) * (30000-20000) / (43000-38000) = 20000 + 1/5 * 10000 = 22000 Und nun zu meinem Problem dabei: Wie bekomme ich das hin, dass ich das halbwegs effizeint (in GCC) und ohne verletzung von Wertebereichsbeschränkungen berechne? Die Division lässt sich (im Rahmen meiner Kreativität) nicht durch effizientere Methoden umschiffen, aber: - erst dividieren, dann multiplizieren ergibt eine große Ungenauigkeit, da z.b. der Faktor 1/5 von oben zu 0 abgerundet werden würde. - wohingegen aber erst Multiplizieren, und anschließendes Dividieren einen überlauf der 16-bit zufolge haben wird. einen PC würde ich jetzt mit 32-bit rechnen lassen (bzw. das tut er ja meist eh immer), für meinen Mikrocontroller wird der Code fertig compiliert dann aber wohl ziemlich groß (vermutlich sogar zu groß), da dann auchnoch routinen für 32-bit-rechnung (vom compiler) eingebaut werden müssten. Oder ist das eine nicht übertragbare Erfahrung von den floats, zu denen es ja mehrere Meinungen gibt und ich sie daher diesmal möglichst auslassen möchte. aktuell finde ich also keine nach meiner Meingung sinnvolle bzw. zielführende Lösung an, irgendeine muss ich aber wohl finden. Da ich aber auch noch relativ neu und nur theoretisch Wissend im Mikrocontrollerbereich bin, wäre ich über ein paar Erfahrungen und Ideen zur Lösung meines Problems von euch Profis recht glücklich. Vielen Dank MfG Tobi