2010-02-27 20 views
9

Sto cercando un'implementazione più veloce o una buona approssimazione delle funzioni fornite da cmath.Implementazione rapida/approssimazione della funzione pow() in C/C++

Ho bisogno di accelerare le seguenti funzioni

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

dove z<0. x proviene da (-1.0,1.0) e y è da (0.0, 5.0)

+3

Stai cercando qualcosa di simile? http://martin.ankerl.com/2007/10/04/optimized-pow-approximation-for-java-and-c-c/ – Swiss

+6

Valori negativi di x?!? Diventa reale, amico! –

+0

@Shakov: utilizzare l'assemblatore in linea per farlo? ma, per i valori negativi di z e x .... – t0mm13b

risposta

6

Ecco alcuni approxmiations:

Se il ravvicinamento sopra per pow non è abbastanza buono, si può ancora provare a sostituirlo con funzioni esponenziali, a seconda della vostra macchina e compilatore questo potrebbe essere più veloce:

  1. x^y = e^(y*ln(x))
  2. E il risultato: e^(z * x^y) = e^(z * e^(y*ln(x)))

Un altro trucco è quando alcuni parametri della formula non cambiano spesso. Quindi, se ad es. x e y sono per lo più costanti, puoi precalcolare x^y e riutilizzare questo.

3

Quali sono i valori possibili di x e y? Se sono entro limiti ragionevoli, la costruzione di alcune tabelle di ricerca potrebbe aiutare.

+0

Immagino che questa domanda rientri nella sezione dei commenti della domanda originale. – legends2k

+0

annullare il voto.Penso che sia una risposta perfettamente ragionevole. Se pow è un collo di bottiglia e hai una precisione richiesta fino a e-6, allora il calcolo preliminare potrebbe essere la strada da percorrere. Lo faccio molto e non solo con la guerra. – Martin

1

Raccomando le routine nel libro "Math Toolkit for Real-Time Programming" di Jack W. Crenshaw.

Si potrebbe anche voler postare parte del codice per mostrare come si chiamano queste funzioni, in quanto potrebbero esserci altre possibilità di ottimizzazione di livello superiore che non sono evidenti dalla descrizione data finora.

Problemi correlati