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
FSINCOScalcula a ambos (casi al mismo tiempo que una llamada aFSINsolo)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
sincosysincosfprobablemente están disponibles y se pueden llamar directamente con solo incluirmath.hEl 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
sincoscon 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/6y cosx~1-x^2/4como 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 ntiempos 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.
xcercanos a algún punto x_0, luego expanda su serie de Taylor en x_0lugar de 0. Esto le dará una excelente precisión cerca, x_0pero 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.