ホーム ] 概要 ] プログラミング仕様 ] 演算速度 ] 技術解説(システム編) ] 技術解説(四則演算編) ] 技術解説(FFT編) ] 技術解説(数学関数編) ]

上へ
高速化手法
平方根/立方根
整数指数
指数関数
実数指数
自然対数
一般対数
正弦/余弦
正接
逆正弦/逆余弦
逆正接
双曲線正弦/余弦
双曲線正接
逆双曲線関数

技術解説(数学関数編)

自然対数(ln)

最終更新日:2007/04/26  統合し再掲

●概要

 級数展開で求める。やはり、変数を限定化する工夫が必要となる。

●級数

○二つの展開式

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

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

がある。1 は中々収束しないので一般には、2 が用いられる。ここでも 2 を用いる。

○変数の範囲

 級数定義では変数は正ならば良いとなっているが、(x - 1)/(x + 1) は、x が大きくなると、1 に近づき、殆ど収束しなくなる。

●高速化

○変数の限定化

   X = M * 10P

なので、M は、1 未満の正数と限定されている。従って、

   ln(X) = ln(M) + P * ln(10)

となるので、ln(M) を求めることになる。但し、目標精度のln(10) を定数として準備しておく必要がある。

○(x - 1)/(x + 1) の限定化 (差分法)

 問題は、x ではなく、(x - 1)/(x + 1) である。この級数では、この値が支配するが、これが、小さくなれば良い。(x - 1)/(x + 1) ≒ 0 である。つまり、

   x - 1 → 0  結局、

    x → 1

が、理想となる。ところで、

   M = er

なら、ln(M) = r となるが、今、r = [ln(M)] (ln(M) に限りなく近い値) とし、補正係数 m を導入すれば、

   M = m * er

となる。指数法則により、er  = e[ln(M)] = [M] なので、

 m = M/[M]

だから、m は限りなく 1 に近くなる。[ln(M)] を組み込み関数で求めれば、M も[M]も既知となるから、m は決定する。従って、

   ln(M) = ln(m) + r = ln(m) + [ln(M)]

なので、限りなく1に近い値で級数を求めれば、ln(M) が求まることになる。[ln(M)] は、15桁の精度なので、m - 1 は、10-15 程度のオーダになる。この場合、級数は、30桁づつ精度を上げながら進む。但し、目標精度のネイピア数を定数として準備しておく必要がある。

●実測値

 下表は、実際に測定したものである。

 ln(7.777777) を求めたときの時間で、

  • LnPrimary:級数でそのまま求めた

  • LnDirect  :仮数部を級数で求めた

  • Ln           :仮数部にて差分法で求めた

ものである。Primary では、一切の定数は不要で、Direct は目標精度の ln(10) が必要。いずれにしても、差分法の効果は絶大となっている。