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

上へ

多倍長演算ライブラリ(UltraPrecision)

精度

最終更新日:2006/05/31

●精度

 常にフル精度(100万桁)で演算するのは、余りに無駄が多く、また時間が掛かりすぎることになる。従って、目的の精度を指定して、無駄なく演算する仕組みが必要となる。

●精度の設定

 UltraPrecision では、このため、Precisionプロパティにて、自由に精度を設定できようになっている。この精度は、小数部分の桁数ではなく、仮数部における最大有効桁数のことである。

●精度の仕組み

 初期は、隠し桁(32桁)を内部で持っていたが、隠し桁による公称精度の維持は結局保証できない(精度は演算内容や繰返し回数により複雑に変化する)ので、これを廃止した。従って、精度の維持はユーザ責任となる。

 Precision は、公称精度で、一つの機能演算(四則算、数学関数)の結果は、この桁数に調整される。一般に、演算を重ねれば重ねるほど実有効桁数は減少してゆく ので、演算の内容により、精度を余裕を持って設定することが肝要である。

●打ち切り誤差の考察

 演算は、有限長なので、常に打ち切り誤差が生じ、伝播して行く。誤差論には全く無知な筆者なので、我流で考察して見る。また、一般の演算では考察できないので、乗算について行う。

 今、ある有限長の実数 a があるとし、これの自乗積を n 回行うと、つまり、an の演算。この時、自乗ごとに、ある桁数で打ち切ったとすれば、その誤差をδ、その演算結果 A とすれば、

  A1 = a1 - δ1
 
A2 = A1 * a - δ2  = a2 - a * δ1 - δ2
 
A3 = a3 - a2 * δ1 - a * δ2 - δ3

 
An = an - (a(n-k) * δk)   [k = 1 to n]      一般解

となる。ak が真値で、(a(n-k) * δk)  が伝播された累積誤差となる。

いま、小数点 10-P 以下を打ち切ったとすれば、エイヤっと、

  δi ≒ 0.5 * 10-P

と、統計的に近似できるので、

 An = an - (a(n-k) * 0.5 * 10-P )
      = an -  0.5 * 10-P * 蚤(n-k)

となる。a = 1.1111、n = 20、P = 10 とすれば、累積誤差は、蚤(n-k) = 71 なので、

 0.5 * 10-10 * 71 = 0.00000000355

となる。およそ、小数点以下 8 桁が正しい(その辺で四捨五入すれば)と計算できる。

●実験

 下表は、上記で述べたことを実際に確かめたものである。1.1111n を、毎回、それぞれ、6、10、15、20桁で打ち切りながら計算したものである。完全とは、打ち切り無しである。復元とは、求まった冪乗値を、1.1111で必要回数除算したものである。当然、1.1111 が正しい値である。復元(10桁)の、冪数20 の結果は、およそ、小数点以下 7-8 桁が正しいので、上記の考察は間違いではない。