¿Alguien tiene un algoritmo simple para calcular un arcoseno razonablemente preciso? Por "simple" me refiero a algún tipo de polinomio que requiere <= 5 multiplicados por muestra de salida. Y por "razonablemente preciso" me refiero a un error cuyo error no es más del 10% cuando el argumento de entrada está cerca de más o menos uno. Busqué en la web por un tiempo pero no encontré nada inmediatamente útil.
algorithms
math
Richard Lyons
fuente
fuente
Respuestas:
Aquí hay solo una versión polinómica :
que parece tener cinco multiplicaciones (suponiendo que pueda guardar el resultado
x.*x
) y tres adiciones.Y la
scilab
trama es:La parte superior es
scilab
'sasin
contra esta, la parte inferior es el error entre los dos.Respuesta original
La raíz cuadrada aquí puede ser una molestia, pero pensé en escribirla porque parece divertida. :-)
Esta página sugiere:
He implementado estox=−1 . Solo reflejando el0≤x≤1 a −1≤x≤0 hace una aproximación mucho mejor.
scilab
y funciona bien, excepto alrededorLa gráfica superior muestra
scilab
laasin
función de la aproximación anterior (en rojo discontinuo) contra mi cambio en verde.La gráfica inferior muestra el error para mi cambio (trazar eso y el original en los mismos ejes significa que el verde parece cero en todas partes).
fuente
tengo una muy buena implementación dearctan() Aquí .
Creo que puedes usar la identidad:
para conseguir lo que quieres
fuente
La parte central de la curva no es un problema real, ya que es bastante lineal y la aproximación de Taylor a dos o tres términos es un buen punto de partida (el polinomio de mínimos cuadrados se ajusta un poco mejor).
Los lados son más problemáticos debido a la pendiente infinita. Una forma de hacer frente es a través de la transformación
que implica una raíz cuadrada.
Si tu argumentoz se representa con coma flotante, se obtiene una aproximación rápida de la raíz cuadrada reduciendo a la mitad el exponente y aplicando una transformación lineal a la mantisa.
Dejarz=m2e , con 1≤m<2 , entonces
z√=m−−√2e/2 . Puedes aproximarm−−√ por (2–√−1)(m+2–√) .
fuente