ホーム ] TIPS ] ソフトウェア実験室 ]

上へ
ビットマップの処理速度
色変換速度
数式演算速度
冪乗演算速度
検索速度
文字列処理速度
文字列/数値処理速度
CPU演算速度
TicksとPerformance Counter
文字の数値化
数値化文字の再現
数値化文字の補間
補間の効果
ネイピア数
ネイピア数2
指数関数近似値
級数の収束速度1
級数の収束速度2
級数の精度
逆三角関数を求める
算術幾何平均でπを求める
全フォルダ列挙
ビットマップとメモリリソース
配列とメモリリソース

ソフトウェア実験室

級数の収束速度2

最終更新:2006/04/01 新規

  対数関数は、自然対数が重要となるが、この級数展開には数種類存在する。対象となる数値 x の範囲によって、展開式の形が異なっている。いずれにしても、級数の収束速度1で述べたように、自分の目的にあった式を適用する。ここでは、x が1前後のものと、x > 0 のものを比較し、どちらが有利かを調べる。

●原理

○二つの展開式

 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式を適用するには、任意の正の x を 2 以下に変換する必要がある。以下のようにして行う。対象のxは、指数表現では、

 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)

であるから、結局、 ln(m) を求めれば良いことになるが、1式も2式も適用できるので、比較ができることになる。

●実験1(机上)

 ここでは、式による収束程度を実際の数値を適用して算出してみる。

m の範囲は、0 超過、1未満となるので、0.1 〜 0.9 として、(x - 1)k と、((x - 1)/(x + 1))(2*k-1) の収束程度を計算してみると、下表のようになる。k=100の場合である。

X (x - 1) (x - 1)/(x + 1)  (x - 1)k ((x - 1)/(x + 1))2k-1
0.1 -0.9 -0.8181818 2.65614E-05 -4.54062E-18
0.2 -0.8 -0.6666667 2.03704E-10 -9.07485E-36
0.3 -0.7 -0.5384615 3.23448E-16 -3.1607E-54
0.4 -0.6 -0.4285714 6.53319E-23 -5.92406E-74
0.5 -0.5 -0.3333333 7.88861E-31 -1.12946E-95
0.6 -0.4 -0.25 1.60694E-40 -1.549E-120
0.7 -0.3 -0.1764706 5.15378E-53 -1.224E-150
0.8 -0.2 -0.1111111 1.26765E-70 -1.2757E-190
0.9 -0.1 -0.0526316 1E-100 -3.3731E-255

●実験2(仮数部方式の実測)

 2式を用いて、今度は、そのまま値を適用する方法と、仮数部を適用する方法で比較してみる。ここで、紹介しているUltraMathにて、行った。

 ○方法

 精度300桁で、ln(123) をそれぞれの方法で算出させ、時間を計測した。

 ○結果(絶対時間はあまり意味がない)

 1.値をそのままで算出:約35

 2.仮数部で算出:約3

 10倍以上の開きがある。直接の場合、級数の分子は、122/124 = 0.98387 と、1に近く、なかなか収束しないためである。

●結論

 対数関数では、仮数部のみで算出し、2式を用いれば、安定した収束と、高精度が得られる。

 但し、仮数部での演算では、(P + 1) * ln(10) なる演算が必要となる。ln(10) を予め算出しておき定数として持つなどする必要がある。若干、自己矛盾的である。また、精度を出すには、この ln(10) の精度も必要となるので、事前の準備が必要となる。