Быстрое внедрение / аппроксимация функции pow () в C / C ++ - PullRequest
9 голосов
/ 27 февраля 2010

Я ищу более быструю реализацию или хорошее приближение функций, предоставляемых cmath.

Мне нужно ускорить следующие функции

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

, где z<0. x от (-1,0,1,0) и y от (0,0, 5,0)

Ответы [ 3 ]

6 голосов
/ 25 марта 2010

Вот некоторые приближения:

Если приведенное выше приближение для pow недостаточно, вы все равно можете попробовать заменить его экспоненциальными функциями, в зависимости от вашей машины и компилятора это может быть быстрее:

  1. x^y = e^(y*ln(x))
  2. И результат: e^(z * x^y) = e^(z * e^(y*ln(x)))

Другая хитрость - это когда некоторые параметры формулы меняются не часто. Так, например, если x и y в основном постоянны, вы можете предварительно рассчитать x ^ y и использовать это снова.

4 голосов
/ 27 февраля 2010

Каковы возможные значения х и у? Если они находятся в разумных пределах, может помочь создание некоторых справочных таблиц.

1 голос
/ 27 февраля 2010

Я рекомендую процедуры в книге "Математический инструментарий для программирования в реальном времени" Джеком В. Креншоу.

Возможно, вы также захотите опубликовать часть своего кода, чтобы показать, как вы вызываете эти функции, поскольку могут быть некоторые другие возможности оптимизации более высокого уровня, которые не очевидны из приведенного выше описания.

...