鳥の巣箱

ネトゲしたり、機械いじったり、ソフト書いたり、山篭ったり、ギャンブルしたりする人

プログラムで指数が小数のべき乗を計算するときの話

プログラム乗でべき乗の計算をすることは多々あると思います。
整数のべき乗は簡単です。
では、小数のべき乗はどう考えるべきでしょうか?

例えば2^{1.5}みたいなやつです。

使用する言語によっては、これをサポートする関数が用意されてたりします。DelphiとかはPower関数でできますね。
ですが、DelphiもStandard版などにはMathユニットが付属していないそうです。

こういった関数が用意されていない場合、どうすれば計算できるのでしょうか。

指数が小数のべき乗を計算する

答えから書きます。次の式を使うだけです。
\displaystyle x^y = e^{ln(x)*y}
式の意味としては簡単です。 x^yを変形させただけです。
指数法則で上式の右辺を変えます。
\displaystyle e^{ln(x)*y} = (e^{ln(x)})^y
ここで
\displaystyle e^{ln(x)} = xなので
\displaystyle  (e^{ln(x)})^y = x^y
と、これだけです。

これを使えば関数が用意されていなくても*1、指数が小数のべき乗は計算できます。


できるんですが。。。


この方法にも注意点が・・・

この方法は、真数であるx>0の場合は成立しません。
言語にもよりますが、Delphiの場合だとNanが返ります。

この理由は、\displaystyle ln(x)が関係しています。
まず、\displaystyle y=ln(x)のとき\displaystyle x=e^yです。
なので、\displaystyle x=e^y\displaystyle x>0、x=0、x<0の場合を考えてみます。
\displaystyle x>0の場合、\displaystyle y>0です。必ず正の値をとります。

次に\displaystyle x=0の場合、\displaystyle e^x=0を満たす\displaystyle xを考えなければなりませんが、これは存在しません。\displaystyle e^x=0を満たすには\displaystyle xではなく\displaystyle e=0とするしかないのですが、ネイピア数として定義されたeを0にはできません。\displaystyle ln(0)を考えても、これは\displaystyle -\inftyに発散してしまいます。よって\displaystyle x=0は計算不可能です。

最後に、\displaystyle x<0の場合です。例えば\displaystyle x=-1として考えてみると\displaystyle -1=e^{y}となりますが、これを満たすyは実数には存在しません。複素数まで拡張すれば存在しますが、プログラム上では非数(Nan)となってしまいます。

以上のことから、指数が小数のべき乗を計算するときは必ず真数が0より大きいことという条件を意識する必要がある。という話でした。

*1:ついでに言えば、関数が用意されている場合でも内部的にはこれをやってるのがほぼです。