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 | pos[] -> val[]
|
2 | --------------
|
3 | 35000 -> 25000 ("steigende" und "fallende" Werte sind möglich!!!)
|
4 | 36000 -> 18000
|
5 | 38000 -> 20000
|
6 | 43000 -> 30000
|
7 | 50000 -> 40000
|
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