10

我已经阅读了通过执行来cmath计算的内容。当是整数时不应该使用它,因为它会大大减慢计算速度。什么时候有什么选择pow(a,b)exp(b*log(a))b

  1. 计算许多pow()具有相同常数的连续sa
  2. 事先知道b肯定整数?

我正在寻找在这些特定情况下有效的快速替代方案。

4

3 回答 3

12

多年来,我收集了许多更快的替代方案,它们通常依赖于recursive函数的实现,并在必要时通过位移来处理乘法。以下提供了为和量身定制integer的功能。它们具有正常而更快的速度,并非所有可能的测试都已运行,并且用户应在调用之前验证输入是否正常,然后返回......等等,等等,等等。但是,它们非常有用:floatdoubledisclaimer:

正如 blue moon 所指出的,我相信Geeks for Geeks Pow(x,n)的正确归属。我早就失去了链接..看起来像他们。(减去一两个调整)。

/* Function to calculate x raised to the power y

    Time Complexity: O(n)
    Space Complexity: O(1)
    Algorithmic Paradigm: Divide and conquer.
*/
int power1 (int x, unsigned int y)
{
    if (y == 0)
        return 1;
    else if ((y % 2) == 0)
        return power1 (x, y / 2) * power1 (x, y / 2);
    else
        return x * power1 (x, y / 2) * power1 (x, y / 2);

}

/* Function to calculate x raised to the power y in O(logn)
    Time Complexity of optimized solution: O(logn)
*/
int power2 (int x, unsigned int y)
{
    int temp;
    if (y == 0)
        return 1;

    temp = power2 (x, y / 2);
    if ((y % 2) == 0)
        return temp * temp;
    else
        return x * temp * temp;
}

/* Extended version of power function that can work
for float x and negative y
*/
float powerf (float x, int y)
{
    float temp;
    if (y == 0)
    return 1;
    temp = powerf (x, y / 2);
    if ((y % 2) == 0) {
        return temp * temp;
    } else {
        if (y > 0)
            return x * temp * temp;
        else
            return (temp * temp) / x;
    }
}

/* Extended version of power function that can work
for double x and negative y
*/
double powerd (double x, int y)
{
    double temp;
    if (y == 0)
    return 1;
    temp = powerd (x, y / 2);
    if ((y % 2) == 0) {
        return temp * temp;
    } else {
        if (y > 0)
            return x * temp * temp;
        else
            return (temp * temp) / x;
    }
}
于 2014-11-11T08:35:56.147 回答
3

非递归非浮点答案

替换uintmax_t/intmax_t为您想要的类型。未检测到溢出。

uintmax_t powjuu(unsigned x, unsigned y) {
  uintmax_t z = 1;
  uintmax_t base = x;
  while (y) {
    if (y & 1) {  // or y%2
      z *= base;
    }
    y >>= 1; // or y /= 2
    base *= base;
  }
  return z;
}

intmax_t powjii(int x, int y) {
  if (y < 0) {
    switch (x) {
      case 0:
        return INTMAX_MAX;
      case 1:
        return 1;
      case -1:
        return y % 2 ? -1 : 1;
    }
    return 0;
  }
  intmax_t z = 1;
  intmax_t base = x;
  while (y) {
    if (y & 1) {
      z *= base;
    }
    y >>= 1;
    base *= base;
  }
  return z;
}
于 2014-11-11T15:47:20.943 回答
2

你可能想检查一下。这是一种替代 pow 函数的快速算法。

于 2014-11-11T08:38:53.850 回答