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

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

ソフトウェア実験室

指数関数近似値

最終更新:2006/05/05

 既に、.NETライブラリにこれらは関数として準備されており、わざわざ自分で計算する必要はないが、ここでは指数関数の近似式(テーラ展開式)の実験として行った。

●原理

T8117 長いネイピア数 で、e のテーラ展開を、

   e = (1/n!) [n:0 to ∞]

と紹介しているが、この式は、ex の X = 1 の時の形で、一般には、

   ex = (Xn/n!) [n:0 to ∞]

である。ところで、

   ax = exln(a)

であるから、

ax = ((Xln(a))n/n!) [n:0 to ∞、 a > 0]

となる。ここで、a = 10 とすれば、10 の指数関数値、x = 0.5 にすれば、a の平方根などが計算できることになる。

●実験方法

 10x 、Xの平方根、立方根を求める。Xは任意の自然数とし、展開の回数は、結果の変化がなくなった時か、100回のどちらかとする。収束することが分かっているし、この演算は有限長なので、ある有限の回数で結果が一定になることが予測される。

●結果

○10x

○平方根

○立方根

●考察

 いずれも、20-40回で収束している。これは、Doubleの打ち切り誤差のお陰で、もし、無限長演算であれば、永遠に収束しないだろう。無限に真値に近づき続けるからである。

●実験のコード

Dim JOB As Integer
Dim X, W, V, Z, A, PW, Er, Cf As Double
Dim Hdr() As String = {"N", "近似値", "誤差[%]"}

 

W = 1
Select Case JOB
   Case 0                   '10x
      If Abs(X) > 20 Then
         MsgBox("X の値が制限外です。", MsgBoxStyle.Critical)
         Exit Sub
      Else
         V = 10 ^ X
         txtC.Text = V.ToString
         Cf = Log(10)
         A = X
      End If
   Case 1                    '平方根
      If X <= 0 Then
         MsgBox("X の値が制限外です。", MsgBoxStyle.Critical)
         Exit Sub
      Else
         V = Sqrt(X)
         txtC.Text = V.ToString
         Cf = Log(X)
         A = 0.5
      End If
   Case 2                    '立方根
      If X <= 0 Then
         MsgBox("X の値が制限外です。", MsgBoxStyle.Critical)
         Exit Sub
      Else
         V = X ^ (1.0 / 3.0)
         txtC.Text = V.ToString
         Cf = Log(X)
         A = 1.0 / 3.0
      End If
   End Select
   frgR.SetGridConstruction(3, 101, 0, 1)
   frgR.RowHeader(0) = Hdr
   Z = 1
   PW = 0
   For i = 1 To 100
      Z = Z * Cf * A / i
      W = W + Z
      frgR.BeginUpdate()
      frgR(0, i) = i
      frgR(1, i) = W
      Er = (W - V) / V * 100
      frgR(2, i) = Er
      If W = PW Then
         Exit For
      Else
         PW = W
      End If
      frgR.EndUpdate()
      frgR.TopRow = i
      Application.DoEvents()
   Next