ホーム ] PC技術/システム技術 ] VB.NETプログラミング ] なるほどナレッジ ] インフォメーション ]

上へ
平方根
立方根
整数指数
実数指数(Exp)
実数指数(一般)
対数
正弦/余弦
正接
逆正弦/逆余弦
逆正接
双曲線正弦/余弦
双曲線正接
逆双曲線正弦
階乗評価関数
級数評価関数
演算時間評価関数

数学関数

対数

最終更新日:2006/05/08 修正

●概要

 指数が実数の場合は、単純な累乗計算では求められなく、級数展開を利用する。

 方法は、級数の収束速度2 で説明しているが、範囲を限定された値が、1に近いことがポイントとなるが、0.5 以下になると、収束度は、1/2 〜1/10以下になってしまう。更なる工夫が必要となる。

●基本方式

 自然対数が基本となり、常用対数は、Log(X) = Ln(X)/Ln(10) で、求める。

●自然対数

 級数展開の、

  ln(x) = 2 * ((x - 1)/(x + 1))(2*k-1) /(2*k-1)   [k = 1 to ∞][0 < x ]

から、求める。x が1 に近いほど収束度は速くなるので、なるべく、1 に近くなるような工夫が必要となる。下図は、k=1000 のときの、収束オーダを算出したものである。

x の値は確率的に、一様分布とすれば、高収束が期待できるのは、20%程度で、収束速度は安定しない。全てが、1近傍になればすばらしい。

1 近傍にする

 既に、以下のような工夫を級数の収束速度2 で説明している。

[再掲]---------------------------------------------------

x = M * 10P

となる。ここで、Mは、1 ≦ M < 10 である。まだ条件を満たさないので、

 x = (M /10) * 10(P + 1) = m * 10(P + 1)

 と変形すると、0.1 ≦ m < 1 となる。しかるに、

 ln(x) = ln(m * 10(P + 1)) = ln(m) + (P + 1) * ln(10)

---------------------------------------------------------

上記の方法では、m は、0.1〜0.9999・・・ で、0.5 以下では、相変わらず収束は期待できない。以下のような方法があることが分かった。

今、任意の実数 r を導入すれば、

   M = m * er

となる、m が存在する。両辺の自然対数を取ると、

   ln(M) = ln(m) + r

となり、ln(m) を求めることになる。

ところで、r は任意であるから、m ≒ M  (m = M では、元の木阿弥)

となるような r を選べ、

   m = M / er
      = M / [M]
      = [1]

 但し、 [n] は、限りなく 真値 n に近い値と言う意味。ここでの真値とは、求める精度での値。

と、m を限りなく、1 に近い値とできる。しかして、

 a = eln(a)

であるから、

 r = [ln(M)]

であれば、er = [M] となり、m = [1] とできる。[ln(M)] は、.NETの組込み関数で算出でき、この場合、15桁程度の精度となる。級数は奇数冪なので、結局、30桁づつ精度が向上することになる。しかも、任意のx に対して、安定して収束する。1000項までとすれば、3万桁得られる。上記のグラフと比べれば、雲泥の差と分かる。但し、本法の欠点は、高精度の e や Ln10 が必要になることである。利点は、初期値 r の精度で、その後の収束度が決まることである。 下表は、基本(当初の方法)と、この改良による速度比較である。桁数が大きくなると、100倍以上改善されている。雲泥の差が実証された。

 ●自然対数アルゴリズム

 以上、整理すると、Ln(A) に於いて、

 A = M * 10P
     = m * er * 10P

とすれば、

 r = [Ln(M)]                        '組込み関数、精度15桁
  m = M / er

  ∴ln(A) = ln(m) + r + P * Ln(10)

となり、ln(m) を級数展開で求めれば良い。ln(10) は、定数として保有しておけば良い。

●更に

 r = [Ln(M)] なる近似値を、既に求めたある程度以上の精度を持った値にすれば、m は、更に、1 に近くなる。例えば、

  r = [Ln(M)]1000   (精度1000桁)

とすれば、m は、10-1000 程度になる。従って、それ以降は、毎項 +2000桁以上の速度で収束する。但し、er を目的の精度で算出しなければならないが、この時間が追加される。大きな精度で求める場合などに導入すれば効果が得られる。原始定数のLn10 を算出する場合に使用している。