你如何使用迭代计算 C 中的负幂?

How do you calculate negative powers in C using iteration?

我正在用 C 语言编写一个函数,它接受一个 float base 和 int power,并计算 base^power

到目前为止我有:

float powIteration(float base, int power){
    if (power == 0){
        return 1;
    }
    else if (power > 0){
         for (int i = 0; i <= power; i++){
            base *= base;
       }
        return base;
    }
    else if (power < 0){
        for (int i = 0; i <= power; i++){
            base *= base;
        }
        return 1/base;
    }
}

我已经用递归解决了这个问题。但我也想用迭代来做。但出于某种原因,这段代码会产生类似 2^-2 = 0.5

的结果

此外,这种方法甚至可以实现所谓的 "iterative approach" 吗?

由于我发现的第一个错误立即回答了最后一个,所以我想我会去测试并帮助你解决这个问题。

首先,您要在每次迭代中更改 base,而您不希望这样,否则您不会每次都乘以一个值,而是每次迭代都不同。就像pm100说的:你要记住你原来的基地。示例:使用 base=2power=-3:

i=0 -> base *= base; 2*2 = 4;
i=1 -> now base is 4 so: 4*4 = 16;
i=2 -> now base is 8 so: 8*8 = 64; and you want it to be 2*2*2

最后1/value会给你正确答案

同样在你的负循环中:你让你的循环从 0 开始,如果你的力量是 -2,那么它不符合你的 运行 ] 条件 i <= power 因为你的 i 总是 > power; 应该是这样的:

for (int i = power+1; i<0; i++)

我为你做了一些修改:

float powIteration(float base, int power){
    float num=base;
    if (power == 0){
        return 1;
    }else if (power > 0){
         for (int i = 1; i < power; i++){
            num=num*base;
       }
        return num;
    }else if (power < 0){
        for (int i = power+1; i<0; i++){
           num=num*base;
        }
        return 1/num;
    }
}

小心这种构造

if (...) { }
else if (...) { }
else if (...) { }
//   ^^^^^^^^      Why the 'if'? It should just be an 'else' 

您的编译器甚至可以警告您:

warning: non-void function does not return a value in all control paths [-Wreturn-type]

循环在几个方面是错误的

else if (power > 0) {
    for (int i = 0; i <= power; i++) {
    //                ^^   That's an off by one error. Likely.          
        base *= base;
    //  ^^^^^^             That's another algorithm. I'll show you later.       

正如评论中已经指出的那样,这里还有另一个问题

else if (power < 0) {
//       ^^^^^^^^^                        So, power is negative...
    for (int i = 0; i <= power; i++) {
    //       ^^^^^  ^^^^^^^^^^  ^^^       But 'i' will never be.     

永远不会执行该循环,这就是为什么当输入为 2、-2 时得到 0.5。


有很多方法可以完成这个任务。

double pow_iterative(double base, int power)
{
    if (power == 0) {
        return 1;
    }
    // Use a variable different from base, to store the partials.
    double result = 1.0;

    // That's another approach, so that you can write a single loop.
    if ( power < 0 ) {
        base = 1.0 / base;
        power = -power;
    }

    // Note that we are modifying 'result', not base.
    for (int i = 0; i < power; ++i) {
        //           ^^^
        result *= base;
    }

    return result;
}

另一种算法称为平方求幂

double pow_(double base, int power)
{
    double result = 1.0;
    if ( power < 0 ) {
        base = 1.0 / base;
        power = -power;
    }
    for(;;) {
        // If the power is odd, multiply once and "consume" the power
        //                     b^n = b * b^(n-1)
        if ( power % 2 ) {
            result *= base;
            --power; 
        }
        // It may have been consumed or 0 from the beginning
        if ( power == 0 )
            break;
        // The power is an even one, so we can square the base and halve the power
        //              b^(2n) = b^(n + n) = b^n * b^n = (b * b)^n
        base *= base;
        power /= 2;
    }
    return result;
}

你可以试试here.