-1
 #include<iostream>
 #include<cmath>
 using namespace std;
 int main()
 {
double x,y,z;
cin>>x>>y;
z=exp(y*log(x));
cout<<z;
system("pause");
return 0;
}

这是查找指数为浮点数的数字的幂的代码,即 2.3^2.3 如果我们使用对数和反对数,我们可以很容易地得到答案,但我的面试问题是在不使用 c++ 中的任何数学库的情况下找到幂。我用谷歌搜索了它,但无法理解谷歌的一些参考资料。

4

2 回答 2

2

您可以随时实施exp()log()自己。

并且更容易实际实现 2 x和 log 2exp() x 的目的,并以与and相同的方式使用log()

2 x = 2整数部分(x)+小数部分(x) = 2整数部分( x) * 2小数部分(x)

2 fractional_part(x)可以使用泰勒级数展开计算 -1 <= x <= +1。

然后乘以 2 integer_part(x)相当于将浮点数的指数部分调整为 integer_part(x) 或者您确实可以将 2 提高到 integer_part(x) 的整数幂并乘以它。

同样,log 2 x = log 2 (x * 2 N ) - N

其中 N(整数,2 的幂)被选择为使得 0.5 <= x * 2 N <= 1(或者,在 1 和 2 之间)。

选择 N 后,我们可以再次使用泰勒级数展开计算 log 2 (x * 2 N )。

这就是全部,只是一点点数学。

编辑:也可以使用近似多项式而不是泰勒级数,它们更有效。感谢 Eric Postpischil 的提醒。但是您可能需要一个数学参考来查找或构建它们。

于 2013-03-22T14:02:50.233 回答
0

您可以对ln(x)e^x使用泰勒级数展开:

ln(x) = 2 * sum[ ((x-1)/(x+1))^(2n-1) / (2n-1), n=1..inf ]
      = 2 [ (x-1)/(x+1) + (1/3)( (x-1)/(x+1) )^3 + (1/5)( (x-1)/(x+1) )^5 + (1/7) ( (x-1)/(x+1) )^7 + ... ] 
e^x = sum(  x^n / n!, n = 0 .. inf ) 
    = 1/1 + x/1 + x^2 / 2 + x^3 / 6 + ...

您可以将积分幂实现为 for 循环并继续扩展以获得所需的近似值。然后插入你的价值观,以及 badda-bing,badda-boom。请注意,上述收敛区域是对于 ln(x) 的 x > 0 和对于 e^x 的所有值。

于 2013-03-22T13:58:04.513 回答