Alguém tem um algoritmo simples para calcular um arco-seno razoavelmente preciso? Por "simples", quero dizer algum tipo de polinômio que requer <= 5 multiplicado por amostra de saída. E por "razoavelmente preciso", quero dizer um algo cujo erro não exceda 10% quando o argumento de entrada estiver próximo de mais ou menos um. Pesquisei na web por um tempo, mas não encontrei nada imediatamente útil.
algorithms
math
Richard Lyons
fonte
fonte
Respostas:
Aqui está apenas uma versão polinomial :
que parece ter cinco multiplicações (supondo que você possa salvar o resultado de
x.*x
) e três adições.E o
scilab
enredo é:Top é
scilab
'sasin
vs este, inferior é o erro entre os dois.Resposta original
A raiz quadrada aqui pode ser um aborrecimento, mas pensei em escrevê-la porque parece divertida. :-)
Esta página sugere:
Eu implementei issox=−1 0≤x≤1 −1≤x≤0
scilab
e funciona bem, exceto em torno de . Apenas refletir sobre para uma aproximação muito melhor.O gráfico superior mostra
scilab
aasin
função da comparação acima (em vermelho tracejado) em relação à minha mudança de verde.O gráfico inferior mostra o erro da minha alteração (plotar isso e o original nos mesmos eixos significa que o verde parece zero em todos os lugares).
fonte
Eu tenho uma implementação muito boa de aqui .arctan()
Eu acho que você pode usar a identidade:
para conseguir o que você quer.
fonte
A parte central da curva não é um problema real, pois é bastante linear e a aproximação de Taylor a dois ou três termos é um bom ponto de partida (o polinômio de mínimos quadrados se ajusta um pouco melhor).
Os lados são mais problemáticos por causa da inclinação infinita. Uma maneira de lidar é através da transformação
que envolve uma raiz quadrada.
Se seu argumento é representado com ponto flutuante, é obtida uma aproximação rápida da raiz quadrada pela metade do expoente e aplicando uma transformação linear à mantissa.z
Seja , com , então . Você pode aproximar por .z=m2e 1≤m<2 z√=m−−√2e/2 m−−√ (2–√−1)(m+2–√)
fonte