|
●精度 常にフル精度(100万桁)で演算するのは、余りに無駄が多く、また時間が掛かりすぎることになる。従って、目的の精度を指定して、無駄なく演算する仕組みが必要となる。 ●精度の設定 UltraPrecision では、このため、Precisionプロパティにて、自由に精度を設定できようになっている。この精度は、小数部分の桁数ではなく、仮数部における最大有効桁数のことである。 ●精度の仕組み 初期は、隠し桁(32桁)を内部で持っていたが、隠し桁による公称精度の維持は結局保証できない(精度は演算内容や繰返し回数により複雑に変化する)ので、これを廃止した。従って、精度の維持はユーザ責任となる。 Precision は、公称精度で、一つの機能演算(四則算、数学関数)の結果は、この桁数に調整される。一般に、演算を重ねれば重ねるほど実有効桁数は減少してゆく ので、演算の内容により、精度を余裕を持って設定することが肝要である。
●打ち切り誤差の考察 演算は、有限長なので、常に打ち切り誤差が生じ、伝播して行く。誤差論には全く無知な筆者なので、我流で考察して見る。また、一般の演算では考察できないので、乗算について行う。 今、ある有限長の実数 a があるとし、これの自乗積を n 回行うと、つまり、an の演算。この時、自乗ごとに、ある桁数で打ち切ったとすれば、その誤差をδ、その演算結果 A とすれば、 A1 = a1 - δ1 となる。ak が真値で、(a(n-k) * δk) が伝播された累積誤差となる。 いま、小数点 10-P 以下を打ち切ったとすれば、エイヤっと、 δi ≒ 0.5 * 10-P と、統計的に近似できるので、 An = an - (a(n-k) * 0.5 * 10-P
) となる。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 桁が正しいので、上記の考察は間違いではない。
|