このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
高精度の数値計算
この例では、Symbolic Math Toolbox™ を使った可変精度の演算により、高精度の計算を得る方法を説明します。
ほとんど整数を表す式を求めます。典型的な例は次になります。 を 30 桁まで計算します。結果は、丸め誤差を伴って表示されますが、整数になるように見えます。
digits(30); f = exp(sqrt(sym(163))*sym(pi)); vpa(f)
ans =
同じ値を 40 桁まで計算します。これが整数にはならないことがわかります。
digits(40); vpa(f)
ans =
この現象をさらに調査します。以下では、最大 になる数値が出現します。そのため、調査には、小数点以下の正しい桁数が必要です。必要な作業精度を計算します。
d = log10(exp(vpa(1000)))
d =
必要な精度を設定した後はじめて、それに左右される関数を呼び出します。他には、round
、vpa
および double
がそのような関数です。
digits(ceil(d) + 50);
という形式に類似した例を探します。もちろん、163 の平方根を乗算して、そのような数値 n を多数求めることができます。しかし、それ以外にも、この形式の数値の多くが何らかの整数に近い値を取ります。このことは、小数部のヒストグラム プロットからわかります。
A = exp(pi*sqrt(vpa(1:1000))); B = A-round(A); histogram(double(B), 50)
ほとんど整数となる式 があるかどうかを計算します。
A = exp(vpa(1:1000)); B = A-round(A); find(abs(B) < 1/1000)
ans = 1x0 empty double row vector
今度は、A
の要素の小数部がかなり均等に分布していることがわかります。
histogram(double(B), 50)