如何在C语言中使用幂运算(raise to the power of x)

5

我想知道如何在C语言中计算2的x次方。我知道有一种类似移位的方法可以实现这个功能。我试过将x左移1位,即total = x << 1,但没有成功。我知道如果将一个数左移1位,相当于将它乘以2。或者说类似于这样的操作。

int x;

for(x=0; x<4; x++){

total += x <<1; // 

}

执行完毕后,我希望总数为15(2 0 + 2 1 + 2 2 + 2 3)。有什么想法吗?我的总数一开始是0,然后就出错了。谢谢!

相关链接:https://dev59.com/L2Ml5IYBdhLWcg3wDjSg - alk
3个回答

22

恰恰相反。 1 << x 将会给你 '2 ^ x'。


2

这应该可以满足你的要求。调用pow(2, x)以得到2x

int abs (int x) {
  if (x < 0) return -x;
  return x;
}

int signum (int x) {
  if (x < 0) return -1;
  if (x > 0) return 1;
  return 0;
}

int add (int x, int y) {
  for (int i = 0; i < abs(y); ++i) {
    if (y > 0) ++x;
    else --x;
  }
  return x;
}

int mult (int x, int y) {
  int sign = signum(x) * signum(y);
  x = abs(x);
  y = abs(y);
  int res = 0;
  for (int i = 0; i < y; ++i) {
    res = add(res, x);
  }
  return sign * res;
}

int pow (int x, int y) {
  if (y < 0) return 0;
  int res = 1;
  for (int i = 0; i < y; ++i) {
    res = mult(res, x);
  }
  return res;
}

2
左移操作的位数受限于您CPU的字长,即32位或64位,这限制了您可以安全使用的最大指数,超过该指数结果将变为未定义(2^31或2^63)。
下面的方法适用于更大的指数,但使用浮点运算。如果您需要精确的结果,则应考虑使用无限精度数学库,例如GMP
#include <math.h>

int main() {
  double base = 2;
  double exponent = 4;

  double result = pow(base, exponent);

  return 0;
}

ldexp是使用浮点数进行此操作的正确方法,但是无论是ldexp还是pow,只要结果不会溢出(变为无穷大)或下溢(变为零),它们都应该始终给出精确的结果。 - R.. GitHub STOP HELPING ICE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接