이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.
digits
사용하는 가변 정밀도 변경
설명
예제
결과의 정밀도 높이기
기본적으로 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
입력 인수
출력 인수
버전 내역
R2006a 이전에 개발됨