Chciałbym rozszerzyć odpowiedź udzieloną przez @Jason S. Używając metody podziału domeny podobnej do tej opisanej przez @Jason S i używając przybliżeń szeregów Maclaurina, średnie (2-3) X przyspieszenie przez tan (), sin () , cos (), atan (), asin () i acos () wbudowane w kompilator gcc z optymalizacją -O3. Najlepsze funkcje aproksymujące z serii Maclaurina opisane poniżej zapewniają podwójną precyzję.
W przypadku funkcji tan (), sin () i cos () oraz dla uproszczenia nakładającą się domenę 0 do 2pi + pi / 80 podzielono na 81 równych przedziałów z „punktami kotwiczenia” przy pi / 80, 3pi / 80, ..., 161pi / 80. Następnie oceniono i zapisano tan (), sin () i cos () z tych 81 punktów kontrolnych. Przy pomocy tożsamości trygonometrycznych opracowano jedną funkcję szeregu Maclaurina dla każdej funkcji trygonometrycznej. Dowolny kąt pomiędzy ± nieskończonością może zostać przesłany do funkcji aproksymujących trygonometrię, ponieważ funkcje najpierw przekształcają kąt wejściowy do domeny od 0 do 2pi. Ten narzut na tłumaczenie jest uwzględniony w narzutie aproksymacji.
Podobne metody opracowano dla funkcji atan (), asin () i acos (), w których nakładająca się domena od -1,0 do 1,1 została podzielona na 21 równych przedziałów z punktami zakotwiczenia na poziomie -19/20, -17/20, .. ., 19/20, 21/20. Następnie przechowywano tylko atan () z tych 21 punktów kontrolnych. Ponownie, przy pomocy odwrotnych tożsamości trygonometrycznych, opracowano pojedynczą funkcję szeregu Maclaurina dla funkcji atan (). Wyniki funkcji atan () zostały następnie użyte do przybliżenia asin () i acos ().
Ponieważ wszystkie funkcje aproksymujące wyzwalanie odwrotne są oparte na funkcji aproksymującej atan (), każda wartość wejściowa argumentu podwójnej precyzji jest dozwolona. Jednak argument wejściowy do funkcji aproksymujących asin () i acos () jest obcinany do domeny ± 1, ponieważ każda wartość poza nim jest bez znaczenia.
Aby przetestować funkcje aproksymujące, trzeba było ocenić miliard losowych ocen funkcji (to znaczy optymalizujący kompilator -O3 nie mógł ominąć oceniania czegoś, ponieważ jakiś obliczony wynik nie zostałby użyty). Aby usunąć błąd związany z szacowaniem miliarda liczby losowe i przetwarzanie wyników, koszt uruchomienia bez oceny funkcji wyzwalania lub odwrotnego wyzwalania został wykonany jako pierwszy. To odchylenie było następnie odejmowane od każdego testu, aby uzyskać bardziej reprezentatywne przybliżenie rzeczywistego czasu oceny funkcji.
Tabela 2. Czas spędzony w sekundach na wykonywaniu wskazanej funkcji lub funkcji miliard razy. Szacunki uzyskuje się przez odjęcie czasu oszacowania miliarda liczb losowych przedstawionych w pierwszym wierszu tabeli 1 od pozostałych wierszy tabeli 1.
Czas spędzony w tan (): 18.0515 18.2545
Czas spędzony w TAN3 (): 5,93853 6,02349
Czas spędzony w TAN4 (): 6,72216 6,99134
Czas spędzony w grzechu () i cos (): 19,4052 19,4311
Czas spędzony w SINCOS3 (): 7.85564 7.92844
Czas spędzony w SINCOS4 (): 9,36672 9,57946
Czas spędzony w atanie (): 15,7160 15,6599
Czas spędzony w ATAN1 (): 6,47800 6,55230
Czas spędzony w ATAN2 (): 7,26730 7,24885
Czas spędzony w ATAN3 (): 8,15299 8,21284
Czas spędzony w asin () i acos (): 36,8833 36,9496
Czas spędzony w ASINCOS1 (): 10,1655 9,78479
Czas spędzony w ASINCOS2 (): 10,6236 10,6000
Czas spędzony w ASINCOS3 (): 12,8430 12,0707
(Ze względu na oszczędność miejsca, tabela 1 nie jest pokazana). Tabela 2 przedstawia wyniki dwóch oddzielnych serii miliardów ocen każdej funkcji aproksymacyjnej. Pierwsza kolumna to pierwsza seria, a druga kolumna to druga seria. Liczby „1”, „2”, „3” lub „4” w nazwach funkcji wskazują liczbę terminów użytych w funkcji szeregu Maclaurina do oceny określonego przybliżenia trygonometrycznego lub odwrotnego trygonometrii. SINCOS # () oznacza, że zarówno sin, jak i cos zostały obliczone w tym samym czasie. Podobnie ASINCOS # () oznacza, że zarówno asin, jak i acos zostały ocenione w tym samym czasie. Równoczesna ocena obu wielkości wymaga niewielkich dodatkowych kosztów.
Wyniki pokazują, że zwiększenie liczby terminów nieznacznie wydłuża czas realizacji, zgodnie z oczekiwaniami. Nawet najmniejsza liczba terminów dawała wszędzie dokładność około 12-14 cyfr z wyjątkiem przybliżenia tan () w pobliżu miejsca, w którym jego wartość zbliża się do ± nieskończoności. Można by się spodziewać, że nawet funkcja tan () będzie miała tam problemy.
Podobne wyniki uzyskano na wysokiej klasy laptopie MacBook Pro w systemie Unix oraz na wysokiej klasy komputerze stacjonarnym z systemem Linux.