-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()

また、実際に2xを実装して2xログに記録し、およびと同じように使用する方が簡単です。exp()log()

2 x = 2 integer_part(x)+ fractional_part(x) = 2 integer_part(x) * 2fractional_part( x)

2の小数部分(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)を計算できます。

そして、それはすべて、ほんの少しの数学です。

編集:テイラー級数の代わりに近似多項式を使用することも可能です。それらはより効率的です。思い出させてくれたEricPostpischilに感謝します。しかし、それらを見つけたり構築したりするには、おそらく数学の参照が必要になるでしょう。

于 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 に答える