Vorrei estendere la risposta fornita da @Jason S. Utilizzando un metodo di suddivisione del dominio simile a quello descritto da @Jason S e utilizzando le approssimazioni della serie di Maclaurin, una velocità media (2-3) X su tan (), sin () Le funzioni, cos (), atan (), asin () e acos () integrate nel compilatore gcc con l'ottimizzazione -O3 sono state ottenute. Le migliori funzioni di approssimazione della serie Maclaurin descritte di seguito hanno ottenuto una precisione doppia.
Per le funzioni tan (), sin () e cos () e, per semplicità, un dominio sovrapposto da 0 a 2 pi + pi / 80 è stato diviso in 81 intervalli uguali con "punti di ancoraggio" a pi / 80, 3 pi / 80, ..., 161pi / 80. Quindi tan (), sin () e cos () di questi 81 punti di ancoraggio sono stati valutati e memorizzati. Con l'aiuto delle identità trigonometriche, è stata sviluppata un'unica funzione della serie Maclaurin per ciascuna funzione trigonometrica. Qualsiasi angolo compreso tra ± infinito può essere sottoposto alle funzioni di approssimazione trigonometrica perché le funzioni prima traducono l'angolo di input nel dominio da 0 a 2pi. Questo overhead di traduzione è incluso nel overhead di approssimazione.
Metodi simili sono stati sviluppati per le funzioni atan (), asin () e acos (), dove un dominio da -1,0 a 1,1 sovrapposto è stato diviso in 21 intervalli uguali con punti di ancoraggio a -19/20, -17/20, .. ., 19/20, 21/20. Quindi è stato memorizzato solo atan () di questi 21 punti di ancoraggio. Ancora una volta, con l'aiuto delle identità trigonometriche inverse, è stata sviluppata una singola funzione della serie di Maclaurin per la funzione atan (). I risultati della funzione atan () sono stati quindi utilizzati per approssimare asin () e acos ().
Poiché tutte le funzioni di approssimazione trigonometrica inversa sono basate sulla funzione di approssimazione atan (), è consentito qualsiasi valore di input di argomento a doppia precisione. Tuttavia, l'input dell'argomento per le funzioni di approssimazione asin () e acos () viene troncato al dominio ± 1 perché qualsiasi valore al di fuori di esso è privo di significato.
Per testare le funzioni di approssimazione, è stato costretto a valutare un miliardo di valutazioni di funzioni casuali (ovvero, al compilatore di ottimizzazione -O3 non è stato permesso di ignorare la valutazione di qualcosa perché alcuni risultati calcolati non sarebbero stati utilizzati.) Per rimuovere il bias di valutare un miliardo numeri casuali e l'elaborazione dei risultati, è stato eseguito per primo il costo di una corsa senza valutare alcuna funzione trigonometrica o inversa. Questo bias è stato quindi sottratto da ogni test per ottenere un'approssimazione più rappresentativa del tempo di valutazione della funzione effettiva.
Tabella 2. Tempo impiegato in secondi per eseguire la funzione o le funzioni indicate un miliardo di volte. Le stime si ottengono sottraendo il costo in termini di tempo per la valutazione di un miliardo di numeri casuali mostrato nella prima riga della Tabella 1 dalle righe rimanenti nella Tabella 1.
Tempo trascorso in abbronzatura (): 18.0515 18.2545
Tempo trascorso in TAN3 (): 5.93853 6.02349
Tempo trascorso in TAN4 (): 6.72216 6.99134
Tempo trascorso in sin () e cos (): 19.4052 19.4311
Tempo trascorso in SINCOS3 (): 7.85564 7.92844
Tempo trascorso in SINCOS4 (): 9.36672 9.57946
Tempo trascorso in atan (): 15.7160 15.6599
Tempo trascorso in ATAN1 (): 6.47800 6.55230
Tempo trascorso in ATAN2 (): 7.26730 7.24885
Tempo trascorso in ATAN3 (): 8.15299 8.21284
Tempo trascorso in asin () e acos (): 36.8833 36.9496
Tempo trascorso in ASINCOS1 (): 10.1655 9.78479
Tempo trascorso in ASINCOS2 (): 10.6236 10.6000
Tempo trascorso in ASINCOS3 (): 12.8430 12.0707
(Nell'interesse del risparmio di spazio, la tabella 1 non è mostrata). La tabella 2 mostra i risultati di due cicli separati di un miliardo di valutazioni di ciascuna funzione di approssimazione. La prima colonna è la prima esecuzione e la seconda colonna è la seconda esecuzione. I numeri "1", "2", "3" o "4" nei nomi delle funzioni indicano il numero di termini utilizzati nella funzione della serie di Maclaurin per valutare l'approssimazione di trigonometria particolare o inversa. SINCOS # () significa che sia sin che cos sono stati valutati allo stesso tempo. Allo stesso modo, ASINCOS # () significa che sia asin che acos sono stati valutati allo stesso tempo. C'è un piccolo sovraccarico aggiuntivo nella valutazione simultanea di entrambe le quantità.
I risultati mostrano che l'aumento del numero di termini aumenta leggermente il tempo di esecuzione come ci si aspetterebbe. Anche il più piccolo numero di termini dava ovunque una precisione di circa 12-14 cifre tranne che per l'approssimazione tan () vicino a dove il suo valore si avvicina a ± infinito. Ci si aspetterebbe che anche la funzione tan () abbia problemi lì.
Risultati simili sono stati ottenuti su un laptop MacBook Pro di fascia alta in Unix e su un computer desktop di fascia alta in Linux.