Hallo Forum,
da ich Zeitkritisch den Sinus berechnen muss (<200 Takte),
habe ich mir überlegt den Sinus so zu implementieren:
Was haltet ihr von dieser Methode?
@ hubert (Gast)
>da ich Zeitkritisch den Sinus berechnen muss (<200 Takte),>habe ich mir überlegt den Sinus so zu implementieren:>Was haltet ihr von dieser Methode?
Gut, kann man aber noch auf 1/4 von 2*Pi reduzieren. Man hat dann halt 4
Fallunterscheidungen.
MFG
Falk
Wenn die Berechnung zeitkritisch ist, würde ich auf die Rekursion
verzichten und die Unterteilung der Werte in die vier Quadranten
explizit hinschreiben:
1
signedcharsinus(unsignedcharp){
2
if(p>AnzahlinTabelle*3)
3
return-tabelle[AnzahlinTabelle*4-p];
4
if(p>AnzahlinTabelle*2)
5
return-tabelle[p-AnzahlinTabelle*2];
6
if(p>AnzahlinTabelle)
7
returntabelle[AnzahlinTabelle*2-p];
8
returntabelle[p];
9
}
Oder natürlich, wenn genug Speicher da ist, die Tabelle so groß
machen, dass sie alle vier Quadranten umfasst.
@ yalu (Gast)
>Wenn die Berechnung zeitkritisch ist, würde ich auf die Rekursion>verzichten und die Unterteilung der Werte in die vier Quadranten>explizit hinschreiben:
Fast richtig. Aber bei dir dauert die Funktion für verschiedene
Quadranten unterschiedlich lang. Besser so. Binärer Baum.
[c]
signed char sinus(unsigned char p){
if(p>AnzahlinTabelle*2) {
if(p>AnzahlinTabelle*3)
return -tabelle[AnzahlinTabelle*4-p];
else
return -tabelle[p-AnzahlinTabelle*2];
}
else {
if(p>AnzahlinTabelle)
return tabelle[AnzahlinTabelle*2-p];
else
return tabelle[p];
}
}
[c]
>Oder natürlich, wenn genug Speicher da ist, die Tabelle so groß>machen, dass sie alle vier Quadranten umfasst.
Das kann ja jeder ;-)
MFG
Falk
Hast recht. Damit ist die Berechnung im worst Case eine Abfrage
schneller. Hatte auch die Idee, aber erst, nachdem ich den Code schon
getippt hatte ;-)