当前位置:  开发笔记 > 编程语言 > 正文

你如何用C进行取幂?

如何解决《你如何用C进行取幂?》经验,为你挑选了4个好方法。

我试过"x = y**e",但那没用.



1> Evan Teran..:

使用该pow功能(虽然需要floats/doubles).

man pow:

   #include 

   double pow(double x, double y);
   float powf(float x, float y);
   long double powl(long double x, long double y);

编辑:BTW,对于正整数幂的特殊情况2,你可以使用位移:(1 << x)将等于2功率x.这有一些潜在的问题,但通常是正确的.


我不确定编译器优化是否仍然如此,但位移是CPU上最快的操作之一.如果可能的话,我会采取这种方法.

2> Adam Rosenfi..:

添加到Evan所说的内容:C没有用于取幂的内置运算符,因为它对于大多数CPU来说不是原始操作.因此,它被实现为库函数.

此外,用于计算函数e ^ X,你可以使用exp(double),expf(float)expl(long double)功能.

请注意,您希望使用^运算符,它是按位异或运算符.



3> ephemient..:

pow仅适用于浮点数(double实际上是s).如果你想获取整数的幂,并且不知道基数是指数2,你就必须自己动手.

通常愚蠢的方式足够好.

int power(int base, unsigned int exp) {
    int i, result = 1;
    for (i = 0; i < exp; i++)
        result *= base;
    return result;
 }

这是一个递归解决方案,它占用O(log n)空间和时间而不是简单的O(1)时空O(n):

int power(int base, int exp) {
    if (exp == 0)
        return 1;
    else if (exp % 2)
        return base * power(base, exp - 1);
    else {
        int temp = power(base, exp / 2);
        return temp * temp;
    }
}


但是效率低,并且舍入误差*会在结果接近INT_MAX时产生差异.

4> kallikak..:

与之前的答案类似,这将很好地处理double的正负整数幂.

double intpow(double a, int b)
{
  double r = 1.0;
  if (b < 0)
  {
    a = 1.0 / a;
    b = -b;
  }
  while (b)
  {
    if (b & 1)
      r *= a;
    a *= a;
    b >>= 1;
  }
  return r;
}

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有