ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

digits

使用する可変精度の変更

説明

digits(d) は、vpa で使用される精度を有効小数桁数 d に設定します。既定では 32 桁です。

d1 = digits は、vpa で使用される現在の精度を返します。

d1 = digits(d) は新しい精度 d を設定し、古い精度を d1 に返します。

結果の精度の引き上げ

既定の設定では、MATLAB® は 16 桁の精度を使用しています。より高い精度の場合は、vpa を使用します。vpa の既定の精度は 32 桁です。精度を 32 桁より上に引き上げるには、digits を使用します。

vpapi を求めます。ここでは、既定の 32 桁の精度を使用します。digits を使用して、現在の精度が 32 であることを確認します。

pi32 = vpa(pi)
pi32 =
3.1415926535897932384626433832795
currentPrecision = digits
currentPrecision =
    32

digits の現在の値を digitsOld に保存し、新しい精度を 100 桁に設定します。vpa を使用して pi を求めます。結果は 100 桁になります。

digitsOld = digits(100);
pi100 = vpa(pi)
pi100 =
3.1415926535897932384626433832795028841971693993751058209...
74944592307816406286208998628034825342117068

メモ

vpa の出力はシンボリックです。シンボリック値を受け取らない MATLAB 関数でシンボリック出力を使用するには、double を使用してシンボリック値を倍精度に変換します。

最後に、digits の古い値に戻して計算を続けます。

digits(digitsOld)

詳細は、数値計算精度の引き上げを参照してください。

精度の引き下げによる速度の向上

vpa をより低い精度で使用することにより、MATLAB の計算速度を上げます。digits を使用してより低い精度に設定します。

最初に、大きな入力の演算の実行にかかる時間を求めます。

input = 1:0.01:500;
tic
zeta(input);
toc
Elapsed time is 48.968983 seconds.

ここで、vpa を使用して、より低い精度で演算を繰り返します。digits を使用して精度を 10 桁に引き下げます。次に、vpa を使用して、input の精度を引き下げ、同じ演算を実行します。所要時間が大幅に短縮されます。

digitsOld = digits(10);
vpaInput = vpa(input);
tic
zeta(vpaInput);
toc
Elapsed time is 31.450342 seconds.

メモ

vpa の出力はシンボリックです。シンボリック値を受け取らない MATLAB 関数でシンボリック出力を使用するには、double を使用してシンボリック値を倍精度に変換します。

最後に、digits の古い値に戻して計算を続けます。

digits(digitsOld)

詳細は、精度の引き下げによる速度の向上を参照してください。

ガード桁

関数 vpa または関数 digits で指定する桁数が、保証される桁数です。内部的には、ツールボックスは指定された桁数よりも少し多くの桁数を使用できます。この追加の桁数は、"ガード桁" と呼ばれます。たとえば、桁数を 4 に設定し、4 桁を使って 1/3 の浮動小数点近似値を表示します。

old = digits(4);
a = vpa(1/3)
a =
0.3333

次に、20 桁を使って a を表示します。結果には、ツールボックスが a を計算する際、内部的に 4 桁以上を使用したことが示されます。次の結果の後半の桁は、丸め誤差のために不正確です。

digits(20)
vpa(a)
digits(old)
ans =
0.33333333333303016843

内部での丸め誤差

内部での丸め誤差が、結果を予期せぬものにする原因になっています。たとえば、既定の 32 桁の精度と 10 桁の精度で数 1/10 を計算します。

a = vpa(1/10)
old = digits(10);
b = vpa(1/10)
digits(old)
a =
0.1
 
b =
0.1

次に、差 a - b を計算します。結果は 0 になりません。

a - b
ans =
0.000000000000000000086736173798840354720600815844403

ツールボックスは、内部で 10 桁の数値差 b = 0.1 を 32 桁の精度にするため、a - b は 0 と等しくありません。これは、処理で丸め誤差が発生することを意味します。ツールボックスは実際に次のように差 a - b を計算します。

b = vpa(b)
a - b
b =
0.09999999999999999991326382620116
 
ans =
0.000000000000000000086736173798840354720600815844403

浮動小数点数をシンボリック オブジェクトに変換するために使用する手法

double の数値をシンボリック オブジェクトに変換し、そのオブジェクトに VPA 演算を実行する場合を考えます。結果は、浮動小数点数をシンボリック オブジェクトに変換するのに使用する変換手法によって異なってきます。変換手法を選択するには、関数 sym で 2 番目のオプション引数に 'r''f''d''e' のいずれかを指定します。既定値は 'r' です。たとえば、定数 π = 3.141592653589793... をシンボリック オブジェクトに変換します。

r = sym(pi)
f = sym(pi,'f')
d = sym(pi,'d')
e = sym(pi,'e')
r =
pi
 
f =
884279719003555/281474976710656
 
d =
3.1415926535897931159979634685442
 
e =
pi - (198*eps)/359

ツールボックスにより画面で表示されるこれらの数値は異なりますが、それらは pi の有理近似です。vpa を使用して、これらの pi の有理近似を浮動小数点数値に戻します。

桁数を 4 に設定します。4 つの近似のうち、3 つの結果は同じになります。

digits(4)
vpa(r)
vpa(f)
vpa(d)
vpa(e)
ans =
3.142
 
ans =
3.142
 
ans =
3.142
 
ans =
3.142 - 0.5515*eps

次に、桁数を 40 に設定します。pi のシンボリックな近似の差がよりはっきりします。

digits(40)
vpa(r)
vpa(f)
vpa(d)
vpa(e)
ans =
3.141592653589793238462643383279502884197
 
ans =
3.141592653589793115997963468544185161591
 
ans =
3.1415926535897931159979634685442
 
ans =
3.141592653589793238462643383279502884197 -...
0.5515320334261838440111420612813370473538*eps

入力引数

すべて折りたたむ

新しい精度の設定。数値またはシンボリック数として指定します。この設定は、可変精度の演算を行うために使用する小数点以下の有効桁数を指定します。値 d が整数でない場合、digits によって最も近い整数に丸められます。

出力引数

すべて折りたたむ

現在の精度の設定。倍精度数として指定します。この設定は、可変精度の演算を行うために使用する現在の小数点以下の有効桁数を指定します。

R2006a より前に導入