|
|
●概要 級数展開で求める。やはり、変数を限定化する工夫が必要となる。 ●級数 ○二つの展開式 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) を求めたときの時間で、
ものである。Primary では、一切の定数は不要で、Direct は目標精度の ln(10) が必要。いずれにしても、差分法の効果は絶大となっている。
|