为什么main函数不能识别另一个函数是否返回float类型号

时间:2015-05-11 00:43:25

标签: c++

我给2和-2作为输入,并假设输出为0.25。但我得到的结果是1。

#include<iostream>
using namespace std;
float power(float x, float y);

int main()
{
    float x=0, y=0;
    cin>>x>>y;
    cout<<power(x, y)<<endl;
    return 0;
}

float power(float x, float y)
{
    float c;
    if (y == 0) return 1;
    c=x*power(x, (y+1));
    return (1/c);
}

如果我return c;而不是return 1/c;并且在主要功能中放置cout<<1/power(x, y);,我会得到正确的结果。任何人都可以建议一个背后的原因,这对我有帮助。提前谢谢。

1 个答案:

答案 0 :(得分:1)

你得到错误结果的原因是,在你的递归调用中,你经常反转结果:

float power(float x, float y) {
    float c;
    cout << y << endl;
    if (y == 0) return 1;
    c=x*power(x, (y+1)); //result previous call (can already been inversed)
    return (1/c); //the inversion step
}

这样的事情是:

pow(2,-2)
    pow(2,-1)
        pow(2,0) = 1
        return 1/(2*1)=0.5
    return 1/(2*0.5)=1 (here you undo the effect)

我之间省略了计算,因为这些并不是“相关”来表明错误。或者更高级的例子:

pow(2,-4)
    pow(2,-3)
        pow(2,-2)
            pow(2,-1)
                pow(2,0) = 1
                return 1/(2*1)=0.5
            return 1/(2*0.5)=1 (here you undo the effect)
        return 1/(2*1)=0.5
    return 1/(2*0.5)=1 (here you undo the effect)

因此,您乘以x并除以x。如果原始y为偶数,则始终会生成1.00,否则会生成1/x。此外,如果您提供正指数,此方法将永远不会结束。

如果你不经常反转,它会(在负y的情况下),只需计算x^-y,这样你就可以在呼叫后进行反转。

但是你的方法通常很容易出错:在浮点数上执行递增/递减以及检查零已知会有问题。此外,您的算法效率不高。解决这个问题的更好方法(具有整体能力)是:

float power(float x, int y) {
    if(y < 0) {
        return 1.0f/power_positive(x,-y);
    } else {
        return power_positive(x,y);
    }
}
float power_positive(float x, int y) {
    if(y == 0) {
        return 1.0f;
    }
    float r = power_positive(x*x,y>>0x01);
    if(y&0x01) {
        r *= x;
    }
    return r;
}

此算法也可以更快地工作,因为它每次将指数除以一半。如前所述,它只适用于积分指数。你可以概括它。但无论如何,我更信任80x87协处理器的浮点运算。