Gostaria de calcular o seno e o cosseno de um valor juntos (por exemplo, para criar uma matriz de rotação). Claro que eu poderia computá-los separadamente um após o outro a = cos(x); b = sin(x);
, mas gostaria de saber se existe uma maneira mais rápida quando precisar dos dois valores.
Edit: Para resumir as respostas até agora:
Vlad disse que existe o comando asm
FSINCOS
computando os dois (quase ao mesmo tempo que uma chamada paraFSIN
sozinho)Como Chi notou, esta otimização às vezes já é feita pelo compilador (ao usar sinalizadores de otimização).
caf apontou, que funções
sincos
esincosf
provavelmente estão disponíveis e podem ser chamadas diretamente apenas incluindomath.h
A abordagem de tanascius de usar uma tabela de consulta é discutida como controversa. (No entanto, no meu computador e em um cenário de benchmark, ele é executado 3x mais rápido do que
sincos
com quase a mesma precisão para pontos flutuantes de 32 bits.)Joel Goodwin vinculou a uma abordagem interessante de uma técnica de aproximação extremamente rápida com uma precisão muito boa (para mim, isso é ainda mais rápido do que a consulta à tabela)
sinx ~ x-x^3/6
e cosx~1-x^2/4
como aproximações se você se preocupa mais com a velocidade do que com a precisão. Você pode adicionar termos em qualquer uma das séries à medida que coloca mais peso na precisão ( en.wikipedia.org/wiki/Taylor_series role para baixo para trig taylor series.) Observe que esta é uma maneira geral de aproximar qualquer função desejada em n
tempos diferenciáveis . Portanto, se você tiver alguma função maior à qual os senos e cossenos pertencem, você obterá uma velocidade muito maior se a aproximar em vez de sin, cos independentemente.
x
próximos a algum ponto x_0
, então expanda sua série de Taylor ao redor em x_0
vez de 0. Isso lhe dará excelente precisão perto, x_0
mas quanto mais longe você pioram os resultados. Você provavelmente pensou que a precisão era péssima quando olhou para a resposta fornecida e tentou valores distantes de 0
. Essa resposta é com sin, cos expandido em torno de 0.