Je voudrais calculer à la fois le sinus et le cosinus d'une valeur ensemble (par exemple pour créer une matrice de rotation). Bien sûr, je pourrais les calculer séparément l'un après l'autre a = cos(x); b = sin(x);
, mais je me demande s'il existe un moyen plus rapide lorsque vous avez besoin des deux valeurs.
Edit: Pour résumer les réponses à ce jour:
Vlad a dit qu'il y avait la commande asm qui calculait
FSINCOS
les deux (presque en même temps qu'un appel àFSIN
seul)Comme Chi l'a remarqué, cette optimisation est parfois déjà effectuée par le compilateur (lors de l'utilisation des indicateurs d'optimisation).
caf a souligné que les fonctions
sincos
etsincosf
sont probablement disponibles et peuvent être appelées directement en incluant simplementmath.h
l' approche tanascius consistant à utiliser une table de consultation est controversée. (Cependant, sur mon ordinateur et dans un scénario de référence, il fonctionne 3 fois plus vite
sincos
qu'avec presque la même précision pour les virgules flottantes 32 bits.)Joel Goodwin lié à une approche intéressante d'une technique d'approximation extrêmement rapide avec une assez bonne précision (pour moi, c'est encore plus rapide que la recherche de table)
sinx ~ x-x^3/6
et cosx~1-x^2/4
comme approximations si vous vous souciez de la vitesse plus que de la précision. Vous pouvez ajouter des termes dans l'une ou l'autre série au fur et à mesure que vous accordez plus de poids à la précision ( en.wikipedia.org/wiki/Taylor_series faites défiler vers le bas jusqu'à la série de trig taylor.) Notez qu'il s'agit d'une façon générale d'approximer toute fonction que vous voulez qui est différente n
. Donc, si vous avez une fonction plus grande à laquelle appartiennent ce sinus et ce cosinus, vous obtiendrez une vitesse beaucoup plus grande si vous l'approximez au lieu du sin, cos est indépendamment.
x
proches d'un certain point x_0
, puis élargissez votre série Taylor x_0
au lieu de 0. Cela vous donnera une excellente précision de près x_0
mais plus vous serez éloigné. pire les résultats. Vous avez probablement pensé que la précision était nulle en regardant la réponse donnée et en l'essayant pour des valeurs éloignées 0
. Cette réponse est avec sin, cos augmenté autour de 0.