[mw_shl_code=c,true]这是c语言的代码
/* 计算一个浮点数的幂函数 */
float FunPower(float bottom_num,u16 exponent)
{
float power = 1;
u16 cnt;
for(cnt=0;cnt<exponent;cnt++)
{
power *= bottom_num;
}
return power;
}
/* 计算对数多项式的和,第一个参数是真数变换后的值
* 第二个参数的展开的阶数N */
float LogPoly(float transform,u16 step)
{
u16 n;
float polysum = 0.0;
for(n=0;n<step;n++)
{
polysum += (FunPower(transform,2*n)/(2*n+1));
}
return polysum*2*transform;
}
/* 计算一个浮点数的对数,输入参数是这个浮点数(真数),它应该比1.33大 */
float Logarithm(float antilog)
{
float log_std = antilog; //规格化后的真数
float log_tran; //对log_std变形后的真数(变形真数)
float log_result; //对数的运算结果
s16 log_exp_dec = 0; //对对数规格化的10进制阶码
s16 log_exp_bin = 0; //对对数规格化的2进制阶码
/* 规格化使真数在0.6667和1.3333之间,使他更接近1 */
//第一步模10规,使真数在0.1333到1.3333之间
while(1)
{
if(log_std<=1.3333)
{
break;
}
else
{
log_std /= 10; //尾数除10
log_exp_dec++; //阶码加一
}
}
//第二步模2规,使真数在0.6667到1.3333之间
while(1)
{
if(log_std>=0.6667)
{
break;
}
else
{
log_std *=2; //尾数乘2
log_exp_bin --; //阶码减一
}
if(log_std <= 0)
{
return 0;
}
}
log_tran = (log_std-1)/(log_std+1); //得到的变形真数
log_result = log_exp_dec*LN10 + log_exp_bin*LN02 +
LogPoly(log_tran,10); //展开10阶
return log_result;
}[/mw_shl_code]
|