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.