Быстрая реализация / аппроксимация функции pow () в C/C++
Я ищу более быструю реализацию или хорошее приближение функций, предоставляемых cmath
.
мне нужно ускорить следующие функции
pow(x,y)
exp(z*pow(x,y))
здесь z<0
. x
от (-1.0,1.0) и y
С (0.0, 5.0)
3 ответов
вот некоторые approxmiations:
- оптимизированное приближение pow для Java и C / C++. Это приближение очень неточно, вы должны попробовать для себя, если это достаточно хорошо.
- оптимизированные экспоненциальные функции для Java. Неплохо! Я использую его для нейронной сети.
Если приведенное выше приближение для pow недостаточно хорошо, вы все равно можете попытаться заменить его экспоненциальными функциями, в зависимости от вашего машина и компилятор это может быть быстрее:
x^y = e^(y*ln(x))
- и в итоге:
e^(z * x^y) = e^(z * e^(y*ln(x)))
еще один трюк, когда некоторые параметры формулы не часто меняют. Поэтому, если, например, x и y в основном постоянны, вы можете предварительно вычислить x^y и повторно использовать это.
каковы возможные значения x и y? Если они находятся в разумных пределах, создание некоторых таблиц поиска может помочь.
Я рекомендую процедуры в книге "Math Toolkit для программирования в реальном времени" Джек У. Креншоу.
вы также можете опубликовать часть своего кода, чтобы показать, как вы вызываете эти функции, поскольку могут быть некоторые другие возможности оптимизации более высокого уровня, которые не видны из приведенного описания.