Ich möchte sowohl den Sinus als auch den Co-Sinus eines Wertes zusammen berechnen (zum Beispiel um eine Rotationsmatrix zu erstellen). Natürlich könnte ich sie wie nacheinander separat berechnen a = cos(x); b = sin(x);
, aber ich frage mich, ob es einen schnelleren Weg gibt, wenn beide Werte benötigt werden.
Bearbeiten: Um die bisherigen Antworten zusammenzufassen:
Vlad sagte, dass es den Befehl asm gibt, der
FSINCOS
beide berechnet (fast zur gleichen Zeit wie ein Anruf anFSIN
allein).Wie Chi bemerkt hat, wird diese Optimierung manchmal bereits vom Compiler durchgeführt (bei Verwendung von Optimierungsflags).
caf wies darauf hin, dass funktionen
sincos
undsincosf
wahrscheinlich verfügbar sind und direkt durch einfaches einschließen aufgerufen werden könnenmath.h
Der Tanascius- Ansatz zur Verwendung einer Nachschlagetabelle wird kontrovers diskutiert. (Auf meinem Computer und in einem Benchmark-Szenario läuft es jedoch dreimal schneller als
sincos
mit fast der gleichen Genauigkeit für 32-Bit-Gleitkommazahlen.)Joel Goodwin verband sich mit einem interessanten Ansatz einer extrem schnellen Approximationstechnik mit ziemlich guter Genauigkeit (für mich ist dies sogar schneller als das Nachschlagen der Tabelle).
sinx ~ x-x^3/6
und cosx~1-x^2/4
als Annäherungen , wenn Sie kümmern sich um Geschwindigkeit mehr als Genauigkeit. Sie können Begriffe in beiden Serien hinzufügen, wenn Sie der Genauigkeit mehr Gewicht beimessen ( en.wikipedia.org/wiki/Taylor_series scrollen Sie nach unten, um Taylor-Serien auszulösen.) Beachten Sie, dass dies eine allgemeine Methode ist, um jede gewünschte Funktion zu approximieren, die unterschiedliche n
Zeiten aufweist. Wenn Sie also eine größere Funktion haben, zu der Sinus und Cosinus gehören, werden Sie eine viel größere Geschwindigkeit erhalten, wenn Sie sie anstelle der Sünde approximieren, cos unabhängig.
x
nahe an einem bestimmten Punkt benötigen. x_0
Erweitern Sie dann Ihre Taylor-Reihe um x_0
statt 0. Dies gibt Ihnen eine hervorragende Genauigkeit in der Nähe, x_0
aber je weiter Sie entfernt sind Je schlechter die Ergebnisse. Sie haben wahrscheinlich gedacht, dass die Genauigkeit schlecht ist, als Sie sich die gegebene Antwort angesehen und sie für Werte ausprobiert haben, die weit davon entfernt sind 0
. Diese Antwort ist mit Sünde, weil um 0 erweitert.