2010-02-27 19 views
9

Estoy buscando una implementación más rápida o una buena aproximación de las funciones provistas por cmath.Implementación rápida/aproximación de la función pow() en C/C++

que han de acelerar las siguientes funciones

  1. pow(x,y)
  2. exp(z*pow(x,y))

donde z<0. x es de (-1.0,1.0) y y es de (0.0, 5.0)

+3

¿Estás buscando algo como esto? http://martin.ankerl.com/2007/10/04/optimized-pow-approximation-for-java-and-c-c/ – Swiss

+6

¿Valores negativos de x?!? ¡Sé real, hombre! –

+0

@Shakov: ¿usar el ensamblador en línea para hacer esto? pero, para los valores negativos de z y x .... – t0mm13b

Respuesta

6

Éstos son algunos approxmiations:

Si la aproximación de arriba para pow no es lo suficientemente bueno, todavía puede intentar reemplazarlo con funciones exponenciales, dependiendo de su máquina y compilador de esto podría ser más rápido:

  1. x^y = e^(y*ln(x))
  2. Y el resultado: e^(z * x^y) = e^(z * e^(y*ln(x)))

Otro truco es cuando algunos parámetros de la fórmula no cambian con frecuencia. Entonces, por ejemplo, xey son en su mayoría constantes, puede precalcular x^y reutilizar esto.

3

¿Cuáles son los valores posibles de x y y? Si están dentro de límites razonables, la creación de algunas tablas de búsqueda podría ayudar.

+0

Supongo que esta pregunta se ajusta más bien a la sección de comentarios de la pregunta original. – legends2k

+0

volviendo a votar.Creo que es una respuesta perfectamente razonable. Si el pow es un cuello de botella y tiene una precisión requerida hasta e-6, entonces el precalculo podría ser el camino a seguir. Hago esto mucho y no solo con pow. – Martin

1

Recomiendo las rutinas en el libro "Math Toolkit for Real-Time Programming" de Jack W. Crenshaw.

Es posible que también desee publicar algo de su código para mostrar cómo llama a estas funciones, ya que puede haber algunas otras posibilidades de optimización de nivel superior que no se desprenden de la descripción dada hasta ahora.