Portanto, na matemática do ensino médio e provavelmente na faculdade, aprendemos como usar as funções trigonométricas, o que elas fazem e que tipo de problemas resolvem. Mas eles sempre foram apresentados a mim como uma caixa preta. Se você precisa do seno ou cosseno de alguma coisa, aperte o botão sen ou cos da calculadora e pronto. O que é ótimo.
O que me pergunto é como as funções trigonométricas são normalmente implementadas.
algorithm
math
trigonometry
Jurassic_C
fonte
fonte
Respostas:
Primeiro, você precisa fazer algum tipo de redução de alcance. As funções trigonométricas são periódicas, portanto, você precisa reduzir os argumentos a um intervalo padrão. Para começar, você pode reduzir os ângulos para ficar entre 0 e 360 graus. Mas, ao usar algumas identidades, você percebe que poderia sobreviver com menos. Se você calcular senos e cossenos para ângulos entre 0 e 45 graus, você pode iniciar seu caminho para calcular todas as funções trigonométricas para todos os ângulos.
Depois de reduzir seu argumento, a maioria dos chips usa um algoritmo CORDIC para calcular os senos e cossenos. Você pode ouvir as pessoas dizerem que os computadores usam a série Taylor. Parece razoável, mas não é verdade. Os algoritmos CORDIC são muito mais adequados para uma implementação de hardware eficiente . ( Bibliotecas de software podem usar a série Taylor, digamos, em hardware que não oferece suporte a funções trigonométricas.) Pode haver algum processamento adicional, usando o algoritmo CORDIC para obter respostas razoavelmente boas, mas fazendo algo diferente para melhorar a precisão.
Existem alguns refinamentos para o acima. Por exemplo, para ângulos muito pequenos theta (em radianos), sin (theta) = theta para toda a precisão que você tem, então é mais eficiente simplesmente retornar theta do que usar algum outro algoritmo. Portanto, na prática, há uma grande quantidade de lógica de caso especial para extrair todo o desempenho e precisão possíveis. Chips com mercados menores podem não ter tanto esforço de otimização.
fonte
editar: Jack Ganssle tem uma discussão decente em seu livro sobre sistemas embarcados, "The Firmware Handbook" .
Para sua informação: se você tiver restrições de precisão e desempenho, a série de Taylor não deve ser usada para aproximar funções para fins numéricos. (Guarde-os para seus cursos de Cálculo.) Eles fazem uso da analiticidade de uma função em um único ponto , por exemplo, o fato de que todas as suas derivadas existem naquele ponto. Eles não convergem necessariamente no intervalo de interesse. Freqüentemente, eles fazem um péssimo trabalho de distribuição da precisão da aproximação da função para serem "perfeitos" bem perto do ponto de avaliação; o erro geralmente aumenta conforme você se afasta dele. E se você tiver uma função com qualquer derivada não contínua (por exemplo, ondas quadradas, ondas triangulares e suas integrais), uma série de Taylor lhe dará a resposta errada.
A melhor solução "fácil", ao usar um polinômio de grau máximo N para aproximar uma dada função f (x) em um intervalo x0 <x <x1, é da aproximação de Chebyshev ; veja Receitas Numéricas para uma boa discussão. Observe que Tj (x) e Tk (x) no artigo Wolfram ao qual vinculei usaram o cos e o cosseno inverso, esses são polinômios e, na prática, você usa uma fórmula de recorrência para obter os coeficientes. Novamente, consulte Receitas numéricas.
editar: Wikipedia tem um artigo semi-decente sobre a teoria da aproximação . Uma das fontes que eles citam (Hart, "Computer Approximations") está esgotada (e as cópias usadas tendem a ser caras), mas dá muitos detalhes sobre coisas como essa. (Jack Ganssle menciona isso na edição 39 de seu boletim informativo The Embedded Muse .)
edição 2: Aqui estão algumas métricas de erro tangíveis (veja abaixo) para Taylor vs. Chebyshev para sin (x). Alguns pontos importantes a serem observados:
Não me interpretem mal: a série de Taylor funcionará corretamente para seno / cosseno (com precisão razoável para o intervalo -pi / 2 a + pi / 2; tecnicamente, com termos suficientes, você pode alcançar qualquer precisão desejada para todas as entradas reais, mas tente calcular cos (100) usando a série de Taylor e você não pode fazer isso a menos que use aritmética de precisão arbitrária). Se eu estivesse preso em uma ilha deserta com uma calculadora não científica e precisasse calcular seno e cosseno, provavelmente usaria a série de Taylor, já que os coeficientes são fáceis de lembrar. Mas as aplicações do mundo real para ter que escrever suas próprias funções sin () ou cos () são raras o suficiente para que seja melhor usar uma implementação eficiente para atingir a precisão desejada - o que a série de Taylor não é .
Intervalo = -pi / 2 a + pi / 2, grau 5 (3 termos)
Faixa = -pi / 2 a + pi / 2, grau 7 (4 termos)
Intervalo = -pi / 4 a + pi / 4, grau 3 (2 termos)
Faixa = -pi / 4 a + pi / 4, grau 5 (3 termos)
Faixa = -pi / 4 a + pi / 4, grau 7 (4 termos)
fonte
Eu acredito que eles são calculados usando Taylor Series ou CORDIC . Alguns aplicativos que fazem uso intenso de funções trigonométricas (jogos, gráficos) constroem tabelas trigonométricas ao iniciar, para que possam apenas consultar os valores em vez de recalculá-los indefinidamente.
fonte
Confira o artigo da Wikipedia sobre funções trigonométricas. Um bom lugar para aprender sobre como realmente implementá-los no código são as receitas numéricas .
Não sou muito matemático, mas meu entendimento de de onde sin, cos e tan "vêm" é que eles são, de certa forma, observados quando você está trabalhando com triângulos retangulares. Se você tirar medidas dos comprimentos dos lados de um monte de triângulos retângulos diferentes e plotar os pontos em um gráfico, você pode obter sin, cos e tan com isso. Como Harper Shelby aponta, as funções são simplesmente definidas como propriedades de triângulos retangulares.
Uma compreensão mais sofisticada é alcançada entendendo como essas proporções se relacionam com a geometria do círculo, o que leva aos radianos e toda essa bondade. Está tudo na entrada da Wikipedia.
fonte
Mais comumente para computadores, a representação de séries de potências é usada para calcular senos e cossenos e estes são usados para outras funções trigonométricas. Expandir essas séries para cerca de 8 termos calcula os valores necessários para uma precisão próxima ao épsilon da máquina (menor número de ponto flutuante diferente de zero que pode ser mantido).
O método CORDIC é mais rápido porque é implementado no hardware, mas é usado principalmente para sistemas embarcados e não para computadores padrão.
fonte
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.
fonte
Se você está pedindo uma explicação mais física de sin, cos e tan, considere como eles se relacionam com os triângulos retângulos. O valor numérico real de cos (lambda) pode ser encontrado formando um triângulo retângulo com um dos ângulos sendo lambda e dividindo o comprimento do lado dos triângulos adjacente a lambda pelo comprimento da hipotenusa. Da mesma forma, para o pecado, use o lado oposto dividido pela hipotenusa. Para tangente, use o lado oposto dividido pelo lado adjacente. O memônico clássico para lembrar isso é SOHCAHTOA (pronuncia-se socatoa).
fonte