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
FSINCOScomputando os dois (quase ao mesmo tempo que uma chamada paraFSINsozinho)Como Chi notou, esta otimização às vezes já é feita pelo compilador (ao usar sinalizadores de otimização).
caf apontou, que funções
sincosesincosfprovavelmente estão disponíveis e podem ser chamadas diretamente apenas incluindomath.hA 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
sincoscom 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/6e cosx~1-x^2/4como 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 ntempos 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.
xpróximos a algum ponto x_0, então expanda sua série de Taylor ao redor em x_0vez de 0. Isso lhe dará excelente precisão perto, x_0mas 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.