数字信号处理中经常要用到指数和对数运算。在通用pc上运行这两个基本运算,虽然可以通过调用math.h的通用库函数来实现,但是效率是非常低下的。如果你对精度要求不高,对运算效率要求很高。就用我下面的子函数来代替吧。
指数运算MyExp函数是在网站找资料并整理出来的,计算结果是精确值。
对数运算是我自己翻出了一篇1960年的论文,然后再结合看了一些其他文章,琢磨了一整天才搞出来的,该函数求得的是近似值,我在MATLAB环境下评估了一下,1~10000范围精度保持在5%以内。符合精度要求不高的环境。尤其是通信上面的应用。
纯原创,希望能够帮到大家。如果需要论文,可以联系本人。
以下是源码,谁用谁知道。enjoy it。
double MyExp(double y)
{
double result;
*((int *)(&result) + 0) = 0;
*((int *)(&result) + 1) = 1512775 * y + 1072632447;
return result;
}
double FastLog(double x)
{
double m;
int k = 1, op = 2;
if (x <= 1) return 0;
while ((x / op) >= 2)
{
op <<= 1;
k++;
}
m = x / op - 1;
if (m <= 0.25) return 1.3125 * m + k;
else if (m <= 0.5) return 1.078125 * m + 0.00015625 + k;
else if (m <= 0.75) return 1.015625 * m + 0.0625 + k;
else if (m <= 1) return 0.75 * m + 0.25 + k;
else return 0;
}
int main()
{
double x,y;
x = MyExp(value);
y = FastLog(Val);
return 0;
}