2010-10-01 15 views
15

Duplicar posibles:
How do Trigonometric functions work?coste computacional de las funciones trigonométricas

Lo que realmente entra en el cálculo de funciones trigonométricas como seno, coseno, Tan y Atan?

creo que he encontrado una optimización en mi código donde puedo evitar el uso de cualquiera de estas funciones y la base del problema en torno a la pendiente en lugar de ángulos. Entonces eso significa un par de operaciones de división en lugar de las funciones trigonométricas anteriores. Pero me gustaría saber más sobre lo que entra en esas funciones trigonométricas para que pueda comparar mi nuevo código (desde la perspectiva del número de operaciones matemáticas básicas). O tal vez acabo de encontrar una forma más tortuosa de hacer lo mismo o, lo que es peor, introduje un método menos eficiente.

Usando C++ y Python, pero me imagino estos es bastante lenguaje agnóstico con el coste de la operación matemática estar en relación con las operaciones más primitivas.

+1

Si usted está preocupado de que, usted podría precalcular los valores que necesita (ya sea en aplicación antes del proceso o guardarlas en un archivo de texto y cargar eso), almacenarlos en tablas, y luego sólo tiene que buscar hacia arriba. – FrustratedWithFormsDesigner

+1

No estoy en este caso específico, se trata más de entender algo sobre lo que siempre he tenido dudas. – ack

+0

@AK: en ese caso, es posible que desee echarle un vistazo a esta pregunta: http://stackoverflow.com/questions/345085/how-do-trigonometric-functions-work – FrustratedWithFormsDesigner

Respuesta

6

procesadores x86 modernos incluyen funciones trigonométricas en su conjunto de instrucciones, pero toman muchos ciclos para ejecutar. Así que si estás en un procesador de este tipo, y si no tiene dependencias en el código (es decir, no necesitas el resultado de un cálculo pecado con el fin de iniciar la siguiente), entonces es probable que no conseguirá mucho más rápido que usar sin y cos directamente, ya que se canalizarán completamente, logrando una tasa efectiva de 1 por ciclo.

+3

Creo que las funciones trigonométricas completas son mucho más lentas que 1 por ciclo. Es posible que pueda hacer otras cosas mientras espera que se complete la función trigonométrica, pero las operaciones trigonométricas no se canalizan de esa manera. – comingstorm

+0

Por lo tanto, puede acelerar las cosas usando una aproximación, o puede que no, dependiendo de su aplicación, y de la cantidad aproximada que pueda tomar. – comingstorm

+0

Además, la reelaboración de sus cálculos matemáticos para evitar los trigonometría a veces puede acelerar y simplificar mucho su código, independientemente del costo de las operaciones trigonométricas. – comingstorm

0

mayoría de las funciones trigonométricas se implementan como tablas de búsqueda en estos días.

0

Mi experiencia de las funciones trigonométricas es que son extremadamente rápido, y que la mayoría de ellos se implementan como lookup tables todos modos ... Es decir, unas pocas divisiones y división por cero cheques, probablemente será más lento que una llamar a una función trigonométrica.

+0

¿Más rápido que la división? Supongo que eso es comparar dos cosas completamente diferentes y eso se convierte en una cuestión de detalles de la arquitectura ... Si realmente es una tabla de búsqueda, eso implicaría que mi antiguo método con funciones trigonométricas puras era más rápido, ¿no? – ack

+0

Creo que sí, sí. Sin embargo, una tabla de búsqueda requiere acceso a la memoria, a menos que reciba un golpe en algún nivel de la memoria caché. – aioobe

+0

@aioobe, estoy bastante seguro de que la tabla de búsqueda para muchos sistemas se implementa en el chip, por lo que no se requiere acceso a la memoria. Creo que un error en la tabla de búsqueda fue la causa del infame problema matemático Pentium hace algunos años. –

8

¡Necesita crear un perfil de su código!

Necesita crear un perfil usted mismo. Según mis resultados, las funciones trigonométricas toman alrededor de 100 ns y las divisiones alrededor de 20 ns. Eso se puede convertir fácilmente en respuestas. Pero, nuevamente, lo más importante es que lo perfile en su hardware. De esta forma, obtendrá las respuestas correctas y el conocimiento para su sistema.

+4

Por supuesto que hará el trabajo, pero realmente no me dirá por qué es más rápido. – ack

1

(Este fue originalmente un comentario sobre la respuesta de codekaizen, pero quedó bastante largo ....)

(Codekaizen): La mayoría de las funciones trigonométricas se implementan como tablas de búsqueda en estos días.

um .. Dado que la mayoría función trigonométrica recibe un argumento de doble precisión, mirando hacia arriba el valor no es práctico. Creo que la mayoría busca los enteros en cada lado y luego intercala desde allí (es decir, Sin (5.279) es 27.9% el camino desde Sin (5) a Sin (6)). Que menos trabajo que calcular el valor directamente, pero aún una buena cantidad de cálculos.

+0

Nunca he visto una tabla donde se almacene cada valor doble distinto. – codekaizen

+0

@codekaizen: Yo tampoco. Mi punto es que tu respuesta implementa lo que tienes. –

+0

No veo cómo puede lógicamente implicar eso. Dada una tabla de valores no implica todos los valores posibles. Un momento de reflexión debería dar como resultado que una tabla que cubra todos los valores no sea razonable. – codekaizen

0

La única respuesta real que vas a conseguirlo "Perfil".

Lo más probable es que, si esto no es un cuello de botella en su código, no hará ninguna diferencia notable en absoluto.

0

Eche un vistazo a glibc. Utiliza varias implementaciones diferentes, algunas de ellas (como sysdeps/ieee754/s_sin.c) se ven realmente complicadas, mientras que otras usan una instrucción de ensamblaje (como sysdeps/x86_64/fpu/s_sincos.S). Es difícil decir el tiempo real requerido sin algunas mediciones.

0

El método casi óptimo (y el método utilizado normalmente) para evaluar funciones trigonométricas es a través de una expansión polinómica ortogonal (serie Chebyshev). Dicha serie con un número adecuado de términos será más rápida que la búsqueda de tablas.

http://en.wikipedia.org/wiki/Chebyshev_polynomials

Cuestiones relacionadas