我给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);
,我会得到正确的结果。任何人都可以建议一个背后的原因,这对我有帮助。提前谢谢。
答案 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协处理器的浮点运算。