« アラビアのロレンス | Main | なんか、いっぱいいっぱい です。 »

February 10, 2009

ネイピア数eの累乗

ネイピア数(e)の累乗(または、べきじょう)を求める場合、Cで開発するならmath.hをインクルードし exp( ) を使用するのがお薦めですが、このライブラリを使用出来ない場合には exp( )相当の機能を を自力で実装する必要があります。

ちなみに、e^x = 1 + x/1! + x^2/2! + x^3/3! ...x^n/n! が自然対数のテイラー展開です。

で、私が "eの累乗" を必要とした理由は、対数値から実数値を得たかったからなんです。

常用対数値 2 であれば 10^2 = 100 で、当然底(a)は"10"です。
 ※ log a (Y) = x ←---→ Y = a^x がaを底としxを指数とする指数関数となります。
    つまり、対数値(x) から 実数値(Y)を得る場合は a^x が解 となります。

しかし、、常用対数でない場合を考えて底変換した場合、 a^x = e^(x * log e(a))となります。ココで "eの累乗" が必要となってくるわけです。常用対数限定としないことで底を自由に設定可能となるメリットがありますが、このメリットを不要とするのであれば、log e(10) の解を定数としてもってしまうのも一つの手段だと思います。

まずは、自然対数値(log e(a))はおいておいて、e^x を自力で実装する方法です。

あらかじめお断りしておかなければならないのは、次数をいくつまで計算するか?により精度に影響を及ぼすということです。

e^x の x が1以下(少数含む)の場合、次数(n)が少なくても"0"近辺に収束しますが、xが大きい場合、x^nが分子となることから、次数が小さいと "0" に収束せず誤差として現れます。分母は次数に依存しますから当然といえば当然なんですが面倒ですね。
さて、これを解決する方法は 2つあります。

① 必要な精度を設定し、精度を満足するまで x^n/n! の加算を続けること。
② e^1は少ない次数で"0"近辺に収束しますから、累乗の整数部と少数部を分けて計算する方法です。

私の開発環境では②を選択しました。e^1は定数としてもっておき、整数部 * e^1 * 少数部のe^n です。自作した64ビットのfloat型で動かしますので、少数部の次数は64bitの精度を考慮した次数を設定しました。

ですが、一般的には①だと思いますので、そちらを紹介したいと思います。

double expDt(double dt)
{
    double gosa = 1e-03;
    double ans = 1.0;
    double wkdt = 1.0;
    double x;

    for(WORD cnt = 1;cnt < 100;cnt ++){  // これで収束する?
        x = ans;
        wkdt = wkdt * dt / cnt;  // x^n / n!
        ans = ans + wkdt;
        if( (ans - x) < gosa * x ){  // 精度満足?
            return( ans );
        }
    }
    return 0.0; // loop数で期待した精度満足しなかった
}

以上がテイラー展開の一般的(?)な方法のサンプルを紹介しました。
必要な精度の設定及び絶対値云々は必要に応じて設定して下さい。
上記は指数が負の場合など考慮していません。 ( ちなみに負の解は1/ans です)
※このソースで問題が発生しても責任は使用者にあります。 (^^;

尚、参考までに、n! は "nの階乗" って意味で、1*2*3*..*n です。
ま、その辺が不明な場合はググってみて下さい。
ではこの辺で。(*´д`*)

|

« アラビアのロレンス | Main | なんか、いっぱいいっぱい です。 »

Comments

Very energetic article, I liked that bit. Will there be a part 2?

Posted by: http://www.Youtube.com/watch?v=GJHTiZyW3KY | September 09, 2014 at 07:09 PM

This was a terrific read. Thank you for sharing it about! Nowadays the world wide web is full of poor content material there is certainly however no doubt that you just spent long by editing this content material. Again, thank you for your time as well as your efforts!

Posted by: nike air force 1 | December 26, 2014 at 11:31 PM

Post a comment



(Not displayed with comment.)




TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/80479/44020612

Listed below are links to weblogs that reference ネイピア数eの累乗:

« アラビアのロレンス | Main | なんか、いっぱいいっぱい です。 »