ホーム ] PC技術/システム技術 ] VB.NETプログラミング ] なるほどナレッジ ] インフォメーション ]

上へ
平方根
立方根
整数指数
実数指数(Exp)
実数指数(一般)
対数
正弦/余弦
正接
逆正弦/逆余弦
逆正接
双曲線正弦/余弦
双曲線正接
逆双曲線正弦
階乗評価関数
級数評価関数
演算時間評価関数

数学関数

逆正接

最終更新日:2006/04/18

●概要

 級数展開にて求める。但し、そのままではかなり収束が遅いので工夫が必要となる。

●級数

 ・arctan(X) = (-1)k-1 * X(2*k-1) / (2 * k - 1)  [k = 1 to ∞] 

級数の収束予測を行うと、下表のように、X = 1 近傍では、とても実用できない。分母が、1次なので、なかなか小さくなってくれない。

k X
1 0.9 0.6 0.4 0.2 1.E-01 1.E-10 1.E-20 1.E-30 1.E-40
100 -3 -12 -47 -82 -142 -202 -1,993 -3,983 -5,973 -7,963
200 -3 -21 -92 -162 -282 -402 -3,993 -7,983 -11,973 -15,963
400 -3 -40 -181 -321 -562 -802 -7,993 -15,983 -23,973 -31,963
800 -4 -77 -358 -640 -1,121 -1,603 -15,994 -31,984 -47,974 -63,964
1,000 -4 -95 -447 -799 -1,401 -2,003 -19,994 -39,984 -59,974 -79,964
2,000 -4 -187 -891 -1,595 -2,799 -4,003 -39,994 -79,984 -119,974 -159,964
4,000 -4 -370 -1,779 -3,188 -5,595 -8,003 -79,994 -159,984 -239,974 -319,964
8,000 -5 -737 -3,554 -6,371 -11,188 -16,004 -159,995 -319,985 -479,975 -639,965
16,000 -5 -1,469 -7,104 -12,739 -22,371 -32,004 -319,995 -639,985 -959,975 -1,279,965
32,000 -5 -2,934 -14,203 -25,473 -44,739 -64,004 -639,995 -1,279,985 -1,919,975 -2,559,965
64,000 -6 -5,863 -28,402 -50,942 -89,473 -128,005 -1,279,996 -2,559,986 -3,839,976 -5,119,966

 

●方式

 arctan は、変数の範囲が -∞〜∞ と広く、注意が必要となる。値を算出する方法は二通り考えられるが、結局、演算速度で選ぶことになる。

  • arcsin から求める。

  • arctanの級数で求める。
    ・値の範囲によって、値を小さくする方法を変える。
    ・加法定理によって微小値にする。

●arcsin より求める

  下図から、A = arctan(x) = arcsin(x/y) なので、

arctan(x) = arcsin(x / sqrt(1 + x2))

で、求められる。arcsin と 1/sqrt の演算時間が支配的となる。最も簡便となるが、時間はどうか気になるところ。

 下表は、arcsin と級数との時間を実測したものである。

  • 表1
    arctan(0.699) を算出した時間。級数にとっては比較的収束が期待できない範囲であるが、素の級数の方が時間が短い。これは、級数では、0.699 と僅か3桁の数値であるが、sqrt や、arcsin では、変数が精度一杯の数値となり、演算時間が掛かってしまうことも原因である。

  • 表2
    arctan(0.6999・・・・・・9) 9が99個並ぶ。数値が100桁になったので級数の時間が延びている。arcsin では、ほぼ同じ。これは、常に指定精度桁の演算をしているからである。

表1 表2

 とりあえず、級数で求める方法が良さそう。

●級数で求める

 変数の範囲が -∞〜∞ と広いので、適当なゾーンに分割して、値の縮小化を図らないといけない。

○微小値

 x < 1E-20〜30 などなら、直接、級数で求めても良さそう。

○値の限定化

・余角

 上図から、arctan(x) = π /2 - arctan(1 / x) なので、少なくとも、x ≧ 1 では、1 / x を採用する。

・既知の値との差を利用する

 ある特定の角度に区切って、その差を利用する。またしても、加法定理より、

 tan(α - β) = (tan(α) - tan(β)) / (1 + tan(α) * tan(β))

 

 

 上図から、x, y > 0 として、

   tan(α - β) = (x - y) / (1 + x * y)

だから、arc にすれば、

 α - β = arctan((x - y) / (1 + x * y))

今、β = π / 4 とすれば、y = 1 なので、

  α -  π / 4 = arctan((x - 1) / (x + 1))

∴ α = π / 4 + arctan((x - 1) / (x + 1))

  z = (x - 1) / (x + 1)

とすれば、z < 1 となる。arctan(x) は、arctan(z) を求めることに帰着された。但し、闇雲に適用するのではなく、x の適当な範囲で採用する。角度にして、π/8 〜 3π/8 が分かりよい。x にすれば、0.4 〜 2.4 程度となる。z に換算すれば、-0.43 〜 0.41 となる。これにて、余角については、 X > 2.4 で採用することになる。

○微小化

 0.4 程度では、まだまだ収束はおぼつかない。更なる工夫が必要となる。既に、arcsin を求める方法で解説した方法をここでも考える。加法定理、

  tan(α - β) = (x - y) / (1 + x * y)    (上記)

をarc を使って変形すると、

 arctan(x) - arctan(y) = arctan(z)

   但し、z = (x - y) / (1 + x * y)

従って、

  arctan(x) = arctan(y) + arctan(z)

今、arctan(y) = [arctan(x)]

 [n] は、限りなく真値 n に近いと言う意味。 ここでの真値とは、求める精度での値。

とすれば、arctan(z) は、限りなく0に近く(つまり、ラフ値と真値との差分)にならざるを得なくなる。つまり、z もそうなる。

 [arctan(x)] は、組込み関数で、求めれば、15桁の精度の値が得られる。この値を使い、多倍長(目標精度)で、

  y = tan([arctan(x)])

を算出すれば、高精度な z が求まる。結局、arctan(z) を求めることに帰着された。z は、非常に微小な値となり、これによる級数の収束は期待できる。

●結論

 下表は、これまでの検討を実際に確かめた結果である。試験の変数は、0.699などの短い桁数ではなく、精度と同じ桁数としている(変数は、精度と同じ桁数の定数PI を5 で割ったもの。約 0.628318530717958647692528676655・・・・)。

  • arcsin法:上記と同じ。参考値
  • 級数直接:変数をそのまま級数に代入
  • 級数改良1:既知との差に変換
  • 級数改良2:改良1 に加えて、微少化したもの

 4つの方法で同じ値が得られることも確認した。やはり、改良2 が、最も速く、これを採用する。