Eu gostaria de estender a resposta fornecida por @Jason S. Usando um método de subdivisão de domínio semelhante ao descrito por @Jason S e usando aproximações de série de Maclaurin, uma média (2-3) X speedup sobre tan (), sin () As funções, cos (), atan (), asin () e acos () construídas no compilador gcc com otimização -O3 foram alcançadas. As melhores funções de aproximação da série Maclaurin descritas abaixo alcançaram precisão de precisão dupla.
Para as funções tan (), sin () e cos (), e para simplificar, um domínio sobreposto de 0 a 2pi + pi / 80 foi dividido em 81 intervalos iguais com "pontos de ancoragem" em pi / 80, 3pi / 80, ..., 161pi / 80. Em seguida, tan (), sin () e cos () desses 81 pontos de ancoragem foram avaliados e armazenados. Com a ajuda de identidades trigonométricas, uma única função da série Maclaurin foi desenvolvida para cada função trigonométrica. Qualquer ângulo entre ± infinito pode ser submetido às funções de aproximação trigonométrica porque as funções primeiro traduzem o ângulo de entrada para o domínio de 0 a 2pi. Este overhead de tradução está incluído no overhead de aproximação.
Métodos semelhantes foram desenvolvidos para as funções atan (), asin () e acos (), onde um domínio sobreposto de -1,0 a 1,1 foi dividido em 21 intervalos iguais com pontos de ancoragem em -19/20, -17/20, .. ., 19/20, 21/20. Então, apenas atan () desses 21 pontos de ancoragem foi armazenado. Novamente, com a ajuda de identidades trigonométricas inversas, uma única função da série Maclaurin foi desenvolvida para a função atan (). Os resultados da função atan () foram então usados para aproximar asin () e acos ().
Como todas as funções de aproximação de trigonometria inversa são baseadas na função de aproximação atan (), qualquer valor de entrada de argumento de precisão dupla é permitido. No entanto, a entrada do argumento para as funções de aproximação asin () e acos () é truncada para o domínio ± 1 porque qualquer valor fora dele não faz sentido.
Para testar as funções de aproximação, um bilhão de avaliações de funções aleatórias foram forçadas a serem avaliadas (ou seja, o compilador de otimização -O3 não teve permissão para ignorar a avaliação de algo porque algum resultado computado não seria usado.) Para remover o viés de avaliar um bilhão números aleatórios e processamento dos resultados, o custo de uma execução sem avaliar qualquer trigonometria ou função trigonométrica inversa foi executado primeiro. Essa tendência foi então subtraída de cada teste para obter uma aproximação mais representativa do tempo real de avaliação da função.
Tabela 2. Tempo gasto em segundos para executar a função ou funções indicadas um bilhão de vezes. As estimativas são obtidas subtraindo o custo de tempo de avaliação de um bilhão de números aleatórios mostrados na primeira linha da Tabela 1 das linhas restantes na Tabela 1.
Tempo gasto no bronzeado (): 18,0515 18,2545
Tempo gasto em TAN3 (): 5,93853 6,02349
Tempo gasto em TAN4 (): 6,72216 6,99134
Tempo gasto em sin () e cos (): 19,4052 19,4311
Tempo gasto em SINCOS3 (): 7.85564 7.92844
Tempo gasto em SINCOS4 (): 9.36672 9.57946
Tempo gasto em atan (): 15,7160 15,6599
Tempo gasto em ATAN1 (): 6,47800 6,55230
Tempo gasto em ATAN2 (): 7,26730 7,24885
Tempo gasto em ATAN3 (): 8.15299 8.21284
Tempo gasto em asin () e acos (): 36,8833 36,9496
Tempo gasto em ASINCOS1 (): 10,1655 9,78479
Tempo gasto em ASINCOS2 (): 10.6236 10.6000
Tempo gasto em ASINCOS3 (): 12,8430 12,0707
(No interesse de economizar espaço, a Tabela 1 não é mostrada.) A Tabela 2 mostra os resultados de duas execuções separadas de um bilhão de avaliações de cada função de aproximação. A primeira coluna é a primeira execução e a segunda coluna é a segunda execução. Os números '1', '2', '3' ou '4' nos nomes das funções indicam o número de termos usados na função da série Maclaurin para avaliar a trigonometria particular ou a aproximação trigonométrica inversa. SINCOS # () significa que sin e cos foram avaliados ao mesmo tempo. Da mesma forma, ASINCOS # () significa que asin e acos foram avaliados ao mesmo tempo. Há pouca sobrecarga extra na avaliação de ambas as quantidades ao mesmo tempo.
Os resultados mostram que aumentar o número de termos aumenta ligeiramente o tempo de execução, como seria de se esperar. Mesmo o menor número de termos deu cerca de 12-14 dígitos de precisão em todos os lugares, exceto para a aproximação tan () perto de onde seu valor se aproxima de ± infinito. Seria de se esperar que até mesmo a função tan () tivesse problemas aqui.
Resultados semelhantes foram obtidos em um laptop MacBook Pro de última geração em Unix e em um computador desktop de última geração em Linux.