LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: david yang

c语言里面,怎么求x的5次方?

[复制链接]
发表于 2003-7-23 20:07:44 | 显示全部楼层

我前面不是已经说了吗?

#include<math.h>

double pow (double x, double y) /* x^y */
发表于 2003-7-23 21:07:04 | 显示全部楼层
最初由 zug 发表
A=X;
X=X*X;
X=X*X;
X=X*A;


对于X^Y,Y为整数的情况,还是这种方法最好,速度最快

把它推广到一般


  1. #include <math.h>

  2. long int mypow(double x, int y)
  3. {
  4.   if(y == 0)
  5.   {
  6.     return 1;
  7.   }
  8.   int t = (int)(log(y) / log(2));
  9.   int i;
  10.   int r = x;
  11.   int d = 1;
  12.   for(i=0;i<t;i++)
  13.   {
  14.     d *= 2;
  15.     r *= r;
  16.   }
  17.   int d = y - d;
  18.   if(d)
  19.   {
  20.     return r * mypow(x, d);
  21.   }
  22.   else
  23.   {
  24.     return r;
  25.   }
  26. }
复制代码


程序没有经过调试,不知是否有问题
发表于 2003-7-23 21:12:02 | 显示全部楼层
不知道系统的函数是如何实现的,有人能提供源码吗?
发表于 2003-7-24 11:37:20 | 显示全部楼层

这是我写的两个


  1. double mypow3 (double x, long unsigned y)
  2. {
  3.         if (y == 0)
  4.                 return 1;
  5.         double z = mypow3 (x, y / 2);
  6.         if (y % 2)
  7.                 return z * z * x;
  8.         else
  9.                 return z * z;
  10. }

  11. double mypow4(double x, long unsigned y)
  12. {
  13.         if (y == 0)
  14.                 return 1;
  15.         long i = 1;
  16.         double z = x;
  17.         while ( i * 2 <= y )
  18.          {
  19.                 x *= x;
  20.                 i *= 2;
  21.          }
  22.         return x * mypow4(z, y - i);
  23. }


  24. int main()
  25. {
  26.         long unsigned i;
  27.         double z;
  28.         for(i = 0; i < 9999999; i++)
  29.                 z = mypow3(1.001,10000);
  30.         printf("%lf\n", z);
  31. }
复制代码


测试:
>gcc -o mypow3 mypow.c
>time ./mypow3
21916.681339

real    0m3.912s
user    0m3.900s
sys     0m0.010s


把main中的mypow3改成mypow4
>gcc -o mypow4 mypow.c
>time ./mypow4
21916.681339

real    0m6.428s
user    0m6.400s
sys     0m0.030s

我写mypow4的目的是想减少mypow3的递归次数。
可是没想到性能反而下降了,看来递归的性能还是蛮高的。
发表于 2003-7-24 20:12:33 | 显示全部楼层
$ time ./pow-1
21916.681339

real    0m7.504s
user    0m7.490s
sys     0m0.010s

我机器是不是太差了。后面这三项是什么意思啊?
我用的是  mypow3() 这个。
发表于 2003-7-24 21:29:11 | 显示全部楼层
raal是实际占用的时间,user是处于用户模式的时间,sys是处于系统模式的时间。real大致上是它们两者之和。
发表于 2003-8-2 17:05:42 | 显示全部楼层
哦,谢谢了
那后面的单位是
real 0m7.504s
7秒吗
发表于 2003-8-2 17:20:09 | 显示全部楼层
去看math.h
发表于 2003-8-2 17:43:53 | 显示全部楼层
一大堆的宏定义。
看不懂。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表