log和exp的工程快速实现

数字信号处理中经常要用到指数和对数运算。在通用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;
}
/*
** log快速运算
** 创建时间:2017-3-3
** 作者:尹超
** 版本号:V1.0
** 描述:用来快速计算以2为底的对数
** 输入:x->次数
** 输出:无
** 返回值:log2x的计算值
** 备注: x必须大于1
*/
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;
}  

猜你喜欢

转载自blog.csdn.net/yinchao163/article/details/68946239
exp