Main Content

digits

사용하는 가변 정밀도 변경

설명

예제

digits(d)vpa에서 사용하는 정밀도를 d개의 유효 소수점 자릿수로 설정합니다. 디폴트 값은 32자리입니다.

예제

d1 = digitsvpa에서 현재 사용하는 정밀도를 반환합니다.

예제

d1 = digits(d)는 새 정밀도 d를 설정하고 이전 정밀도를 d1로 반환합니다.

예제

결과의 정밀도 높이기

기본적으로 MATLAB®은 16자리의 정밀도를 사용합니다. 더 높은 정밀도를 사용하려면 vpa를 사용하십시오. vpa의 디폴트 정밀도는 32자리입니다. digits를 사용하여 정밀도를 32자리가 넘도록 늘립니다.

디폴트로 32자리의 정밀도를 사용하는 vpa를 사용하여 pi를 구합니다. 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

숨겨진 반올림 오차

숨겨진 반올림 오차는 예상치 못한 결과를 초래할 수 있습니다. 예를 들어, 숫자 1/10을 디폴트 값인 32자리 정확도와 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 함수를 사용하면 두 번째 선택적 인수('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 이전에 개발됨