メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

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 の現在の値を d1 に保存し、新しい精度を 70 桁に設定します。vpa を使用して pi を求めます。結果は 70 桁になります。

d1 = digits(70);
pi100 = vpa(pi)
pi100 = 3.141592653589793238462643383279502884197169399375105820974944592307816

vpa がシンボリック出力を返すことに注意してください。シンボリック値を受け取らない MATLAB 関数でシンボリック出力を使用するには、doubleを使用してシンボリック値を倍精度に変換します。

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

digits(d1)

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

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

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

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

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

d1 = digits(8);
vpaInput = vpa(input);
tic
zeta(vpaInput);
toc
Elapsed time is 11.104991 seconds.

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

digits(d1)

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

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

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

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

d2 = digits(20);
vpa(a)
ans = 0.33333333333303016843

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

digits(d1)

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

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

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

c = a - b
c = 0.000000000000000000086736173798840354720600815844403

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

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

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

r = sym(pi)
r = π
f = sym(pi,"f")
f = 

884279719003555281474976710656

d = sym(pi,"d")
d = 3.1415926535897931159979634685442
e = sym(pi,"e")
e = 

π-198eps359

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

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

d1 = digits(4);
rvpa = vpa(r)
rvpa = 3.142
fvpa = vpa(f)
fvpa = 3.142
dvpa = vpa(d)
dvpa = 3.142
evpa = vpa(e)
evpa = 3.142-0.5515eps

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

d2 = digits(40);
rvpa = vpa(r)
rvpa = 3.141592653589793238462643383279502884197
fvpa = vpa(f)
fvpa = 3.141592653589793115997963468544185161591
dvpa = vpa(d)
dvpa = 3.1415926535897931159979634685442
evpa = vpa(e)
evpa = 3.141592653589793238462643383279502884197-0.5515320334261838440111420612813370473538eps

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

digits(d1)

入力引数

すべて折りたたむ

新しい精度の設定。正の整数スカラーとして指定します。この設定は、可変精度の演算を行うために使用する有効小数桁数を指定します。d は 1 より大きく、108+1 より小さくなければなりません。値 d が整数でない場合、digits によって最も近い整数に丸められます。

出力引数

すべて折りたたむ

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

バージョン履歴

R2006a より前に導入