Je voudrais étendre la réponse fournie par @Jason S.En utilisant une méthode de subdivision de domaine similaire à celle décrite par @Jason S et en utilisant des approximations de la série Maclaurin, une accélération moyenne (2-3) X sur le tan (), sin () Les fonctions, cos (), atan (), asin () et acos () intégrées au compilateur gcc avec l'optimisation -O3 ont été réalisées. Les meilleures fonctions d'approximation de la série Maclaurin décrites ci-dessous ont obtenu une précision double.
Pour les fonctions tan (), sin () et cos (), et par souci de simplicité, un domaine superposé de 0 à 2pi + pi / 80 a été divisé en 81 intervalles égaux avec des «points d'ancrage» à pi / 80, 3pi / 80, ..., 161 ppp / 80. Ensuite, tan (), sin () et cos () de ces 81 points d'ancrage ont été évalués et stockés. À l'aide des identités trigonométriques, une seule fonction de série Maclaurin a été développée pour chaque fonction trigonométrique. Tout angle compris entre ± l'infini peut être soumis aux fonctions d'approximation de trig parce que les fonctions traduisent d'abord l'angle d'entrée dans le domaine de 0 à 2pi. Cette surcharge de traduction est incluse dans la surcharge d'approximation.
Des méthodes similaires ont été développées pour les fonctions atan (), asin () et acos (), où un domaine qui se chevauchait de -1,0 à 1,1 était divisé en 21 intervalles égaux avec des points d'ancrage à -19/20, -17/20, .. ., 19/20, 21/20. Ensuite, seul atan () de ces 21 points d'ancrage a été stocké. Encore une fois, avec l'aide des identités trigonométriques inverses, une seule fonction de série Maclaurin a été développée pour la fonction atan (). Les résultats de la fonction atan () ont ensuite été utilisés pour approximer asin () et acos ().
Puisque toutes les fonctions d'approximation de trig inverse sont basées sur la fonction d'approximation atan (), toute valeur d'entrée d'argument à double précision est autorisée. Cependant, l'argument entré dans les fonctions d'approximation asin () et acos () est tronqué au domaine ± 1 car toute valeur en dehors de celui-ci n'a pas de sens.
Pour tester les fonctions d'approximation, un milliard d'évaluations de fonctions aléatoires ont été forcées d'être évaluées (c'est-à-dire que le compilateur d'optimisation -O3 n'était pas autorisé à contourner l'évaluation de quelque chose car certains résultats calculés ne seraient pas utilisés.) Pour supprimer le biais de l'évaluation d'un milliard nombres aléatoires et en traitant les résultats, le coût d'une exécution sans évaluation d'aucune fonction de trig ou de trig inverse a été effectué en premier. Ce biais a ensuite été soustrait de chaque test pour obtenir une approximation plus représentative du temps réel d'évaluation des fonctions.
Tableau 2. Temps passé en secondes à exécuter la ou les fonctions indiquées un milliard de fois. Les estimations sont obtenues en soustrayant le coût en temps de l'évaluation d'un milliard de nombres aléatoires indiqués dans la première ligne du tableau 1 des lignes restantes du tableau 1.
Temps passé dans le bronzage (): 18.0515 18.2545
Temps passé dans TAN3 (): 5.93853 6.02349
Temps passé dans TAN4 (): 6.72216 6.99134
Temps passé dans sin () et cos (): 19,4052 19,4311
Temps passé dans SINCOS3 (): 7.85564 7.92844
Temps passé dans SINCOS4 (): 9,36672 9,57946
Temps passé à atan (): 15,7160 15,6599
Temps passé dans ATAN1 (): 6.47800 6.55230
Temps passé dans ATAN2 (): 7.26730 7.24885
Temps passé dans ATAN3 (): 8.15299 8.21284
Temps passé dans asin () et acos (): 36.8833 36.9496
Temps passé dans ASINCOS1 (): 10.1655 9.78479
Temps passé dans ASINCOS2 (): 10,6236 10,6000
Temps passé dans ASINCOS3 (): 12.8430 12.0707
(Dans l'intérêt d'économiser de l'espace, le tableau 1 n'est pas montré.) Le tableau 2 montre les résultats de deux exécutions distinctes d'un milliard d'évaluations de chaque fonction d'approximation. La première colonne est la première exécution et la deuxième colonne est la deuxième exécution. Les nombres «1», «2», «3» ou «4» dans les noms de fonction indiquent le nombre de termes utilisés dans la fonction de série Maclaurin pour évaluer l'approximation de trig ou de trig inverse. SINCOS # () signifie que sin et cos ont été évalués en même temps. De même, ASINCOS # () signifie que asin et acos ont été évalués en même temps. Il y a peu de frais généraux supplémentaires pour évaluer les deux quantités en même temps.
Les résultats montrent que l'augmentation du nombre de termes augmente légèrement le temps d'exécution comme on pouvait s'y attendre. Même le plus petit nombre de termes a donné une précision d'environ 12 à 14 chiffres partout, sauf pour l'approximation tan () près de l'endroit où sa valeur s'approche de ± l'infini. On s'attendrait à ce que même la fonction tan () y ait des problèmes.
Des résultats similaires ont été obtenus sur un ordinateur portable MacBook Pro haut de gamme sous Unix et sur un ordinateur de bureau haut de gamme sous Linux.