|
|
●概要 指数が実数の場合は、単純な累乗計算では求められなく、級数展開を利用する。 方法は、級数の収束速度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 で説明している。 [再掲]---------------------------------------------------
--------------------------------------------------------- 上記の方法では、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 但し、 [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 とすれば、 r = [Ln(M)]
'組込み関数、精度15桁 ∴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 を算出する場合に使用している。
|