救急!如何计算对数
做个东西需显示出增益,但不知道如何用C语言写程序计算对数。有知道的朋友请教教。能算出A=LG(X)的也行。 有空间的话就查表。也可以弄个简单的表,落在中间的数用插值。不知道这个想法行不行。 这是个方法,不过太麻烦了,实在不行我再考虑用吧。
没什么计算对数的函数吗? 编译器好像自带的LOG函数,如ICCAVR中的MATH.H中有:
double log(double x); /* ln x */
double log10(double x); /* log 10 of x */ 网上搜了下,大把。
看来还真有如我上面说的插值那样干的:
http://cache.amobbs.com/bbs_upload782111/files_14/ourdev_443594.gif
(原文件名:1.gif)
http://cache.amobbs.com/bbs_upload782111/files_14/ourdev_443595.gif
(原文件名:2.gif) mark MARK! mark 查看编译器的.\include\math.h文件、查阅编译器的帮助。 这个是否可以这样计算?
设 a 为 1~65535,且a的二进制数为:
0 0 0 0 0 1 X X X X X X X X X X
\___ ___/ \___ ___/
V V
前面n个0 i取5位二进制数,不足5位后面补0
则a的分贝值可表示为:
90-6*n+log_tab
n和i可以轻松以移位求得。而对数表如下:
unsigned char log_tab={0,0,0,0,1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4,4,5,5,5,5,5,5,5,};
式中常90为log(32768)*20,系数6为log(2)*20 mark 回复【10楼】cowboy
这个是否可以这样计算?
设 a 为 1~65535,且a的二进制数为:
0 0 0 0 0 1 x x x x x x x x x x
\___ ___/ \___ ___/
v v
前面n个0 i取5位二进制数,不足5位后面补0
则a的分贝值可表示为:
90-6*n+log_tab
n和i可以轻松以移位求得。而对数表如下:
unsigned char log_tab={0,0,0,0,1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4,4,5,5,5,5,5,5,5,};
式中常90为log(32768)*20,系数6为log(2)*20
-----------------------------------------------------------------------
好牛X,完全看不明白。。。
言归正传:
CPU是不支持对数的,所以如果对数运算能转换成移位和四则运算就最好,否则示符运算的密度,
如果隅尔求对数,或几秒才求一次,可用mach.h上的办法,或用展开式法,来写算法。
否则,一定要用查表法,才能提速。
一定要设法减少运算量,即对整个算式查表。 回复【10楼】cowboy
这个是否可以这样计算?
设 a 为 1~65535,且a的二进制数为:
0 0 0 0 0 1 x x x x x x x x x x
\___ ___/ \___ ___/
v v
前面n个0 i取5位二进制数,不足5位后面补0
则a的分贝值可表示为:
90-6*n+log_tab
n和i可以轻松以移位求得。而对数表如下:
unsigned char log_tab={0,0,0,0,1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4,4,5,5,5,5,5,5,5,};
式中常90为log(32768)*20,系数6为log(2)*20
-----------------------------------------------------------------------
牛仔的这个表没有处理四舍五入,我来个带四舍五入的版本:
log_tab={0,0,1,1,1,1,1,2,2,2,2,3,3,3,3,3,4,4,4,4,4,4,5,5,5,5,5,5,5,6,6,6,} mark
页:
[1]