[C语言] 幂指函数C语言实现

[复制链接]
1803|3
 楼主| 山东电子小菜鸟 发表于 2018-4-13 16:52 | 显示全部楼层 |阅读模式
本帖最后由 山东电子小菜鸟 于 2018-4-13 16:57 编辑
  1. double mypow(float base, short pow)
  2. {
  3.         long i;
  4.         double result = 1;
  5.         if (base == 0)
  6.                 return 0;

  7.         i = pow;
  8.         if (pow < 0)
  9.         {
  10.                 i = -1 * pow;
  11.                 base = 1 / base;
  12.         }
  13.         while (i > 0)
  14.         {
  15.                result *= base;
  16.                 i--;
  17.         }
  18.         return result;
  19. }

airwill 发表于 2018-4-13 17:34 | 显示全部楼层
虽然可以实现, 但如果 pow 的数值比较大的话, 这个循环耗时太久了, 还不如库里的级数算法快呢

打赏榜单

山东电子小菜鸟 打赏了 0.10 元 2018-04-13
理由:意见很好

 楼主| 山东电子小菜鸟 发表于 2018-4-13 19:16 | 显示全部楼层
airwill 发表于 2018-4-13 17:34
虽然可以实现, 但如果 pow 的数值比较大的话, 这个循环耗时太久了, 还不如库里的级数算法快呢 ...
  1. double pow_i(double num,int n)//计算num的n次幂,其中n为整数
  2. {
  3.    double powint=1;
  4.    int i;
  5.    for(i=1;i<=n;i++) powint*=num;
  6.    return powint;
  7. }
  8. double pow_f(double num,double m)//计算num的m次幂,num和m可为双精度,num大于零
  9. {
  10.     int i,j;
  11.     double powf=0,x,tmpm=1;
  12.     x=num-1;
  13.     for(i=1;tmpm>1e-12 || tmpm<-1e-12;i++)//当tmpm不在次范围时,停止循环,范围可改
  14.            {
  15.                for(j=1,tmpm=1;j<=i;j++)
  16.                     tmpm*=(m-j+1)*x/j;
  17.                     powf+=tmpm;
  18.            }
  19.     return powf+1;
  20. }
  21. double pow_ff(double num,double m)//调用pow_f()和pow_i(),计算num的m次幂,是计算幂的入口
  22. {
  23.     if(num==0 && m!=0) return 0;//若num为0,则返回0
  24.         else if(num==0 && m==0) return 1;// 若num和m都为0,则返回1
  25.     else if(num<0 && m-int(m)!=0) return 0;//若num为负,且m不为整数数,则出错,返回0
  26.     if(num>2)//把底数大于2的情况转为(1/num)^-m计算
  27.         {
  28.             num=1/num;
  29.                 m=-m;
  30.                 }
  31.         if(m<0) return 1/pow_ff(num,-m);//把指数小于0的情况转为1/num^-m计算
  32.     if(m-int(m)==0) return pow_i(num,m);/*当指数为浮点数是,分成整数和小数分别求
  33.                                             幂,这是因为但底数较小式,用pow_f直接求幂
  34.                                                                                 误差大,所以分为指数的整数部分用pow_i,小
  35.                                                                                 数部分用pow_f求.*/
  36.     else return pow_f(num,m-int(m))*pow_i(num,int(m));
  37.     return pow_f(num,m);
  38. }
linqing171 发表于 2018-4-15 19:13 | 显示全部楼层
鸟哥,再给贴个实用点的:双浮点,可保证五位有效位数的快速算法。印象里读书的时候我见过。

打赏榜单

山东电子小菜鸟 打赏了 0.10 元 2018-04-16

您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:qq:641208111;技术交流群:377640799 大学电子竞赛预热赛开赛啦~千元大奖等你来拿火热进行中!!点击参加活动 欢迎加个人QQ:641208111一起交流合作

140

主题

3082

帖子

23

粉丝
快速回复 在线客服 返回列表 返回顶部