Me gustaría calcular el seno y el coseno de un valor juntos (por ejemplo, para crear una matriz de rotación). Por supuesto, podría calcularlos por separado uno tras otro a = cos(x); b = sin(x);
, pero me pregunto si hay una forma más rápida cuando se necesitan ambos valores.
Editar: para resumir las respuestas hasta ahora:
Vlad dijo que existe el comando asm que los
FSINCOS
calcula a ambos (casi al mismo tiempo que una llamada aFSIN
solo)Como advirtió Chi , esta optimización a veces ya la realiza el compilador (cuando se utilizan indicadores de optimización).
caf señaló, que las funciones
sincos
ysincosf
probablemente están disponibles y se pueden llamar directamente con solo incluirmath.h
El enfoque de tanascius del uso de una tabla de consulta es controvertido. (Sin embargo, en mi computadora y en un escenario de referencia, se ejecuta 3 veces más rápido que
sincos
con casi la misma precisión para puntos flotantes de 32 bits).Joel Goodwin se vinculó a un enfoque interesante de una técnica de aproximación extremadamente rápida con una precisión bastante buena (para mí, esto es incluso más rápido que la búsqueda de tablas)
sinx ~ x-x^3/6
y cosx~1-x^2/4
como aproximaciones si le importa la velocidad más que la precisión. Puede agregar términos en cualquiera de las series a medida que le da más peso a la precisión ( en.wikipedia.org/wiki/Taylor_series, desplácese hacia abajo hasta la serie trig taylor). Tenga en cuenta que esta es una forma general de aproximar cualquier función que desee que sea de n
tiempos diferenciables . Entonces, si tiene una función más grande a la que pertenecen el seno y el coseno, obtendrá una velocidad mucho mayor si la aproxima en lugar del pecado, el cos de forma independiente.
x
cercanos a algún punto x_0
, luego expanda su serie de Taylor en x_0
lugar de 0. Esto le dará una excelente precisión cerca, x_0
pero cuanto más lejos esté vaya peor los resultados. Probablemente pensó que la precisión es una porquería cuando miró la respuesta dada y la probó con valores alejados de 0
. Esa respuesta es sin, cos expandido alrededor de 0.