このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
digits
使用する可変精度の変更
説明
例
結果の精度の引き上げ
既定の設定では、MATLAB® は 16 桁の精度を使用しています。より高い精度の場合は、vpa
を使用します。vpa
の既定の精度は 32 桁です。精度を 32 桁より上に引き上げるには、digits
を使用します。
vpa
で pi
を求めます。ここでは、既定の 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
入力引数
出力引数
バージョン履歴
R2006a より前に導入