如何实现幂运算的定点化--针对pow()函数

langhuazht 2010-01-20 10:13:56
在C语言中,做幂运算用pow函数,原型如下:double pow(double x, double y),表示x的y次幂。参数和输出都是double型。

问题:要做整形的运算,就是说浮点运算定点化,在网上搜,看到了不少关于定点化的开方运算sqrt,比如采用泰勒级数展开法编写的。 哪位高人指点一下,采用如何的方法实现pow 函数的定点化?

背景:原程序中,一般是调用pow(10.0 , n-1.008),或pow(10.0 , n+2.05),其中n为-100 到100之间的整形值,也就是计算:10的x(小数)次幂。目前的解决方法是,弄了个数组pow_Q15_fixed[201],分别存下了n从-100到100之间的计算之后的值,然后查表。 但是有个问题,就是计算pow(10.0 , n-1.008),对应有个数组,计算pow(10.0 , n+2.05),就要有另一个数组,很麻烦。

请教有没有什么 比如泰勒展开,牛顿迭代法计算之类的方法,解决此问题,请指条路!!!

...全文
2357 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
fx397993401 2010-01-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 mlee79 的回复:]
C/C++ codedouble xPow(double d ,int n )
{int s;double r=1;if( n==0 )return1;if( n<0 )
s=1 , n=-n;else
s=0;while( n!=1 )
{if( n&1 ) r*=d;
n/=2;
d*= d;
}

?-
[/Quote]

这个感觉在精度允许的范围内 还是可以的 赞一个
EveryDay 2010-01-21
  • 打赏
  • 举报
回复
学习学习
langhuazht 2010-01-21
  • 打赏
  • 举报
回复
mLee79 同志 说的挺好的,但是跟我想要的还是有点区别。

pow(10.0 ,n-1.008),这是浮点运算的代码,现在要弄成,没有一个float 或 double在里边的定点计算过程----double xPow( double d , int n ) 这里边还有浮点的东西,处理器不支持。

暂时这样处理的:
1、pow(10.0 ,n-1.008)=pow(10.0 , n)*pow(10,-1.008),
2、先手工计算出pow(10,-1.008), = 0.0981747943,------定点化,Q14的值为402,
3、算出了n从-100 到100之间的pow(10.0 , n)的Q15形式的值,弄成一个数组,用来查表,记为Power_result_Q15 ,long long类型。
4、计算pow(10.0 , n-1.008)= (Power_result_Q15*402)>>(14+15).

请高人 指点,感觉这样挺麻烦的,但是现在还没别的思路。。。。
mLee79 2010-01-20
  • 打赏
  • 举报
回复
double xPow( double d , int n )
{
int s;
double r = 1;

if( n == 0 )
return 1;

if( n < 0 )
s = 1 , n = -n;
else
s = 0;

while( n != 1 )
{
if( n&1 ) r*=d;
n /= 2;
d *= d;
}

r *= d;
return s?1/r:r;
}
langhuazht 2010-01-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mlee79 的回复:]
pow(10.0 , n-1.008) = pow( 10 , n ) * pow( 10 , -1.008 )
前面用快速幂运算 O(lnN) , 后面是个常数

另一个相同....

[/Quote]
3楼有道理,提醒我了。 再问一个,快速幂运算 O(lnN) ,啥意思,用代码怎么实现。
mLee79 2010-01-20
  • 打赏
  • 举报
回复
pow(10.0 , n-1.008) = pow( 10 , n ) * pow( 10 , -1.008 )
前面用快速幂运算 O(lnN) , 后面是个常数

另一个相同....
langhuazht 2010-01-20
  • 打赏
  • 举报
回复
可能是我没描述清楚,简单说:用定点的运算方式代替 浮点的pow运算,处理器不支持浮点运算。
z569362161 2010-01-20
  • 打赏
  • 举报
回复
函数名: pow
功 能: 指数函数(x的y次方)

用 法: double pow(double x, double y);

程序例:



#include <math.h>

#include <stdio.h>



int main(void)

{

double x = 2.0, y = 3.0;



printf("%lf raised to %lf is %lf\n", x, y, pow(x, y));

return 0;

}

40分只能回答这么多了。

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧