Entonces, en matemáticas de la escuela secundaria, y probablemente en la universidad, se nos enseña cómo usar las funciones trigonométricas, qué hacen y qué tipo de problemas resuelven. Pero siempre me los han presentado como una caja negra. Si necesitas el seno o el coseno de algo, presionas el botón sin o cos en tu calculadora y listo. Lo cual está bien.
Lo que me pregunto es cómo se implementan típicamente las funciones trigonométricas.
algorithm
math
trigonometry
Jurassic_C
fuente
fuente
Respuestas:
Primero, tienes que hacer algún tipo de reducción de rango. Las funciones de activación son periódicas, por lo que debe reducir los argumentos a un intervalo estándar. Para empezar, puede reducir los ángulos entre 0 y 360 grados. Pero al usar algunas identidades, se da cuenta de que podría arreglárselas con menos. Si calcula senos y cosenos para ángulos entre 0 y 45 grados, puede comenzar a calcular todas las funciones trigonométricas para todos los ángulos.
Una vez que ha reducido su argumento, la mayoría de chips utilizan un algoritmo CORDIC para calcular los senos y cosenos. Es posible que escuche a la gente decir que las computadoras usan la serie Taylor. Suena razonable, pero no es cierto. Los algoritmos CORDIC se adaptan mucho mejor a una implementación de hardware eficiente . ( Las bibliotecas de software pueden usar la serie Taylor, por ejemplo, en hardware que no admite funciones de activación). Puede haber algún procesamiento adicional, usando el algoritmo CORDIC para obtener respuestas bastante buenas, pero luego haciendo algo más para mejorar la precisión.
Hay algunas mejoras en lo anterior. Por ejemplo, para ángulos muy pequeños theta (en radianes), sin (theta) = theta con toda la precisión que tenga, por lo que es más eficiente simplemente devolver theta que usar algún otro algoritmo. Entonces, en la práctica, hay mucha lógica de casos especiales para exprimir todo el rendimiento y la precisión posibles. Es posible que los chips con mercados más pequeños no requieran tanto esfuerzo de optimización.
fuente
editar: Jack Ganssle tiene una discusión decente en su libro sobre sistemas embebidos, "The Firmware Handbook" .
FYI: Si tiene limitaciones de precisión y rendimiento, la serie de Taylor no debe usarse para aproximar funciones con fines numéricos. (Guárdelos para sus cursos de Cálculo). Hacen uso de la analiticidad de una función en un solo punto , por ejemplo, el hecho de que todas sus derivadas existen en ese punto. No necesariamente convergen en el intervalo de interés. A menudo hacen un trabajo pésimo al distribuir la precisión de la aproximación de la función para que sea "perfecta" justo cerca del punto de evaluación; el error generalmente aumenta a medida que se aleja de él. Y si tiene una función con cualquier derivada no continua (por ejemplo, ondas cuadradas, ondas triangulares y sus integrales), una serie de Taylor le dará la respuesta incorrecta.
La mejor solución "fácil", cuando se usa un polinomio de grado máximo N para aproximar una función dada f (x) en un intervalo x0 <x <x1, es de aproximación de Chebyshev ; consulte Recetas numéricas para una buena discusión. Tenga en cuenta que Tj (x) y Tk (x) en el artículo de Wolfram al que me vinculé usaron el cos y el coseno inverso, estos son polinomios y, en la práctica, usa una fórmula de recurrencia para obtener los coeficientes. Nuevamente, consulte Recetas numéricas.
editar: Wikipedia tiene un artículo semi-decente sobre teoría de aproximación . Una de las fuentes que citan (Hart, "Computer Approximations") está agotada (y las copias usadas tienden a ser caras), pero entra en muchos detalles sobre este tipo de cosas. (Jack Ganssle menciona esto en el número 39 de su boletín The Embedded Muse ).
edición 2: Aquí hay algunas métricas de error tangibles (ver más abajo) para Taylor vs. Chebyshev para sin (x). Algunos puntos importantes a tener en cuenta:
No me malinterpretes: la serie Taylor funcionará correctamente para seno / coseno (con una precisión razonable para el rango de -pi / 2 a + pi / 2; técnicamente, con suficientes términos, puede alcanzar cualquier precisión deseada para todas las entradas reales, pero intente calcular cos (100) usando la serie de Taylor y no puede hacerlo a menos que use aritmética de precisión arbitraria). Si estuviera atrapado en una isla desierta con una calculadora no científica y tuviera que calcular el seno y el coseno, probablemente usaría la serie de Taylor ya que los coeficientes son fáciles de recordar. Pero las aplicaciones del mundo real para tener que escribir su propio pecado () o cos () son funciones tan poco frecuente que serías mejores resultados con una implementación eficiente para alcanzar una precisión deseada - el que la serie de Taylor es no .
Rango = -pi / 2 a + pi / 2, grado 5 (3 términos)
Rango = -pi / 2 a + pi / 2, grado 7 (4 términos)
Rango = -pi / 4 a + pi / 4, grado 3 (2 términos)
Rango = -pi / 4 a + pi / 4, grado 5 (3 términos)
Rango = -pi / 4 a + pi / 4, grado 7 (4 términos)
fuente
Creo que se calculan utilizando Taylor Series o CORDIC . Algunas aplicaciones que hacen un uso intensivo de funciones trigonométricas (juegos, gráficos) construyen tablas trigonométricas cuando se inician para que puedan buscar valores en lugar de volver a calcularlos una y otra vez.
fuente
Consulte el artículo de Wikipedia sobre funciones trigonométricas. Un buen lugar para aprender a implementarlos en el código es Recetas numéricas .
No soy un gran matemático, pero mi comprensión de dónde "vienen" sin, cos y tan es que, en cierto sentido, se observan cuando se trabaja con triángulos en ángulo recto. Si tomas medidas de las longitudes de los lados de un grupo de diferentes triángulos en ángulo recto y trazas los puntos en una gráfica, puedes obtener sin, cos y tan de eso. Como señala Harper Shelby, las funciones se definen simplemente como propiedades de triángulos en ángulo recto.
Se logra una comprensión más sofisticada al comprender cómo estas proporciones se relacionan con la geometría del círculo, lo que conduce a radianes y todas esas bondades. Todo está en la entrada de Wikipedia.
fuente
Más comúnmente para las computadoras, la representación de series de potencia se usa para calcular senos y cosenos y estos se usan para otras funciones trigonométricas. Al expandir estas series a aproximadamente 8 términos, se calculan los valores necesarios con una precisión cercana a la épsilon de la máquina (el número de punto flotante más pequeño distinto de cero que se puede mantener).
El método CORDIC es más rápido ya que se implementa en hardware, pero se usa principalmente para sistemas integrados y no computadoras estándar.
fuente
Me gustaría extender la respuesta proporcionada por @Jason S. Usando un método de subdivisión de dominio similar al descrito por @Jason S y usando aproximaciones de la serie de Maclaurin, una aceleración promedio (2-3) X sobre el tan (), sin () Se consiguieron las funciones cos (), atan (), asin () y acos () integradas en el compilador gcc con optimización -O3. Las mejores funciones de aproximación de la serie Maclaurin descritas a continuación lograron una precisión de doble precisión.
Para las funciones tan (), sin () y cos (), y para simplificar, un dominio superpuesto de 0 a 2pi + pi / 80 se dividió en 81 intervalos iguales con "puntos de anclaje" en pi / 80, 3pi / 80, ..., 161pi / 80. Luego se evaluaron y almacenaron tan (), sin () y cos () de estos 81 puntos de anclaje. Con la ayuda de las identidades trigonométricas, se desarrolló una única función de serie de Maclaurin para cada función trigonométrica. Cualquier ángulo entre ± infinito puede someterse a las funciones de aproximación trigonométrica porque las funciones primero trasladan el ángulo de entrada al dominio de 0 a 2pi. Esta sobrecarga de traducción se incluye en la sobrecarga de aproximación.
Se desarrollaron métodos similares para las funciones atan (), asin () y acos (), donde un dominio superpuesto de -1.0 a 1.1 se dividió en 21 intervalos iguales con puntos de ancla en -19/20, -17/20, .. ., 19/20, 21/20. Luego, solo se almacenó atan () de estos 21 puntos de anclaje. Nuevamente, con la ayuda de identidades trigonométricas inversas, se desarrolló una única función de serie de Maclaurin para la función atan (). Los resultados de la función atan () se utilizaron para aproximar asin () y acos ().
Dado que todas las funciones de aproximación de trigonométricas inversas se basan en la función de aproximación atan (), se permite cualquier valor de entrada de argumento de doble precisión. Sin embargo, la entrada del argumento a las funciones de aproximación asin () y acos () se trunca al dominio ± 1 porque cualquier valor fuera de él no tiene sentido.
Para probar las funciones de aproximación, se obligó a evaluar mil millones de evaluaciones de funciones aleatorias (es decir, al compilador de optimización -O3 no se le permitió omitir la evaluación de algo porque no se usaría algún resultado calculado). Para eliminar el sesgo de evaluar mil millones números aleatorios y procesando los resultados, se realizó primero el costo de una ejecución sin evaluar ninguna función trigonométrica o trigonométrica inversa. Este sesgo se restó luego de cada prueba para obtener una aproximación más representativa del tiempo real de evaluación de la función.
Tabla 2. Tiempo empleado en segundos ejecutando la función o funciones indicadas mil millones de veces. Las estimaciones se obtienen restando el costo de tiempo de evaluar mil millones de números aleatorios que se muestran en la primera fila de la Tabla 1 de las filas restantes en la Tabla 1.
Tiempo pasado en bronceado (): 18.0515 18.2545
Tiempo de permanencia en TAN3 (): 5,93853 6,02349
Tiempo pasado en TAN4 (): 6.72216 6.99134
Tiempo pasado en sin () y cos (): 19.4052 19.4311
Tiempo pasado en SINCOS3 (): 7.85564 7.92844
Tiempo pasado en SINCOS4 (): 9.36672 9.57946
Tiempo pasado en atan (): 15,7160 15,6599
Tiempo de permanencia en ATAN1 (): 6.47800 6.55230
Tiempo pasado en ATAN2 (): 7.26730 7.24885
Tiempo pasado en ATAN3 (): 8.15299 8.21284
Tiempo pasado en asin () y acos (): 36.8833 36.9496
Tiempo pasado en ASINCOS1 (): 10.1655 9.78479
Tiempo pasado en ASINCOS2 (): 10,6236 10,6000
Tiempo pasado en ASINCOS3 (): 12.8430 12.0707
(En aras de ahorrar espacio, no se muestra la Tabla 1). La Tabla 2 muestra los resultados de dos corridas separadas de mil millones de evaluaciones de cada función aproximada. La primera columna es la primera ejecución y la segunda columna es la segunda ejecución. Los números '1', '2', '3' o '4' en los nombres de las funciones indican el número de términos usados en la función de serie de Maclaurin para evaluar la aproximación trigonométrica particular o trigonométrica inversa. SINCOS # () significa que tanto sin como cos se evaluaron al mismo tiempo. Asimismo, ASINCOS # () significa que tanto asin como acos fueron evaluados al mismo tiempo. Hay pocos gastos generales adicionales al evaluar ambas cantidades al mismo tiempo.
Los resultados muestran que aumentar el número de términos aumenta ligeramente el tiempo de ejecución como cabría esperar. Incluso el número más pequeño de términos dio una precisión de entre 12 y 14 dígitos en todas partes, excepto por la aproximación tan () cerca de donde su valor se acerca a ± infinito. Uno esperaría que incluso la función tan () tuviera problemas allí.
Se obtuvieron resultados similares en una computadora portátil MacBook Pro de gama alta en Unix y en una computadora de escritorio de gama alta en Linux.
fuente
Si estás pidiendo una explicación más física de pecado, cos y bronceado, considera cómo se relacionan con los triángulos en ángulo recto. El valor numérico real de cos (lambda) se puede encontrar formando un triángulo de ángulo recto con uno de los ángulos lambda y dividiendo la longitud del lado del triángulo adyacente a lambda por la longitud de la hipotenusa. De manera similar, para el pecado, use el lado opuesto dividido por la hipotenusa. Para la tangente, use el lado opuesto dividido por el lado adyacente. El clásico memonic para recordar esto es SOHCAHTOA (pronunciado socatoa).
fuente