가변 정밀도 연산방식(임의 정밀도 연산방식)
숫자를 정의하지 않은 문자형 벡터에 대한 지원이 제거되었습니다. 대신, sym
및 syms
를 사용하여 기호 숫자 및 기호 변수를 만든 다음 연산을 수행하십시오. 예를 들어, vpa('(1 + sqrt(5))/2')
대신 vpa((1
+ sqrt(sym(5)))/2)
를 사용하십시오.
가변 정밀도 부동소수점 연산방식을 사용하여 기호 입력값을 계산합니다. 기본적으로 vpa
는 32자리의 유효 자릿수로 값을 계산합니다.
syms x p = sym(pi); piVpa = vpa(p)
piVpa = 3.1415926535897932384626433832795
a = sym(1/3); f = a*sin(2*p*x); fVpa = vpa(f)
fVpa = 0.33333333333333333333333333333333*sin(6.283185307179586476925286766559*x)
가변 정밀도 연산방식으로 벡터 또는 행렬의 요소를 계산합니다.
V = [x/p a^3]; M = [sin(p) cos(p/5); exp(p*x) x/log(p)]; vpa(V) vpa(M)
ans = [ 0.31830988618379067153776752674503*x, 0.037037037037037037037037037037037] ans = [ 0, 0.80901699437494742410229341718282] [ exp(3.1415926535897932384626433832795*x), 0.87356852683023186835397746476334*x]
참고
exp(vpa(200))
과 같이 모든 내부 입력값은 vpa
로 감싸야 합니다. 그러지 않으면 입력값이 MATLAB®에 의해 자동으로 배정밀도로 변환됩니다.
vpa
에서 사용하는 정밀도 변경하기기본적으로 vpa
는 32자리의 유효 자릿수로 입력값을 계산합니다. digits
함수를 사용하여 유효 자릿수를 변경할 수 있습니다.
digits
를 사용하여 표현식 100001/10001
을 7자리의 유효 자릿수로 근사합니다. digits(7)
에서 반환된 digits
의 이전 값을 저장합니다. vpa
함수는 5자리의 유효 자릿수만 반환합니다. 이는 나머지 숫자가 0이라는 것을 의미할 수 있습니다.
digitsOld = digits(7); y = sym(100001)/10001; vpa(y)
ans = 9.9991
더 높은 정밀도 값인 25
를 사용하여 나머지 숫자가 0인지 확인합니다. 결과를 보면 나머지 숫자가 실제로 반복되는 숫자임을 알 수 있습니다.
digits(25) vpa(y)
ans = 9.999100089991000899910009
또는 단일 vpa
호출에 대해 digits
를 재정의하려면 두 번째 인수를 지정하여 정밀도를 변경하십시오.
두 번째 인수를 지정하여 π를 100자리의 유효 자릿수로 구합니다.
vpa(pi,100)
ans = 3.141592653589793238462643383279502884197169... 39937510582097494459230781640628620899862803... 4825342117068
추후 계산을 위해 digitsOld
에서 원래 정밀도 값을 복원합니다.
digits(digitsOld)
기호 결과는 정확하지만 사용하기에 편리한 형식이 아닐 수 있습니다. vpa
를 사용하여 정확한 기호 결과를 수치적으로 근사할 수 있습니다.
solve
를 사용하여 높은 차수 다항식의 근을 구합니다. solve
함수는 높은 차수 다항식을 기호적으로 풀 수 없으며 root
를 사용하여 근을 나타냅니다.
syms x y = solve(x^4 - x + 1, x)
y = root(z^4 - z + 1, z, 1) root(z^4 - z + 1, z, 2) root(z^4 - z + 1, z, 3) root(z^4 - z + 1, z, 4)
vpa
를 사용하여 근에 대한 수치적 근삿값을 구합니다.
yVpa = vpa(y)
yVpa = 0.72713608449119683997667565867496 - 0.43001428832971577641651985839602i 0.72713608449119683997667565867496 + 0.43001428832971577641651985839602i - 0.72713608449119683997667565867496 - 0.93409928946052943963903028710582i - 0.72713608449119683997667565867496 + 0.93409928946052943963903028710582i
vpa
에서 보호 자릿수를 사용하여 정밀도 유지하기digits
함수의 값은 사용되는 최소 유효 자릿수를 지정합니다. 내부적으로 vpa
는 digits
에 지정한 것보다 더 많은 자릿수를 사용할 수 있습니다. 이러한 추가 자릿수는 이후 계산의 반올림 오차를 방지하므로 이러한 자릿수를 보호 자릿수라고 합니다.
4개의 유효 자릿수를 사용하여 1/3
을 수치적으로 근사합니다.
a = vpa(1/3, 4)
a = 0.3333
20자리를 사용하여 결과 a
를 근사합니다. 결과를 보면 이 툴박스에서 a
를 계산할 때 내부적으로 4자리 이상을 사용했다는 것을 알 수 있습니다. 반올림 오차로 다음 결과의 마지막 자릿수가 잘못 표시됩니다.
vpa(a, 20)
ans = 0.33333333333303016843
숨겨진 반올림 오차는 예상치 못한 결과를 초래할 수 있습니다.
1/10
을 디폴트 32자리의 정밀도로 계산한 다음 10자리 정밀도로 계산합니다.
a = vpa(1/10, 32) b = vpa(1/10, 10)
a = 0.1 b = 0.1
얼핏 보면 a
와 b
가 동일하게 보입니다. a - b
를 구하여 두 값이 동일한지 확인합니다.
a - b
ans = 0.000000000000000000086736173798840354720600815844403
차이가 0이 아닙니다. b
는 10
자리의 정밀도로 계산되었기 때문에 a
보다 반올림 오차가 큽니다. a - b
를 구하면 vpa
가 b
를 32자리로 근사합니다. 다음 결과를 참조하십시오.
a - vpa(b, 32)
ans = 0.000000000000000000086736173798840354720600815844403
vpa
를 사용하여 일반 배정밀도 입력값의 정밀도 복원하기정확한 기호 값과 달리 배정밀도 값은 본질적으로 반올림 오차를 포함합니다. 배정밀도 입력값에 대해 vpa
를 호출하면 배정밀도 값보다 많은 자릿수가 반환되지만 손실된 정밀도를 vpa
가 복원할 수는 없습니다. 그러나 vpa
는 p/q, pπ/q, (p/q)1/2, 2q 및 10q 형식으로 된 표현식의 정밀도를 인식 및 복원할 수 있습니다. 여기서 p와 q는 적당한 크기의 정수입니다.
먼저, vpa
가 배정밀도 입력값의 정밀도를 복원할 수 없음을 보여줍니다. 배정밀도 결과에 대해 그리고 동일한 기호 결과에 대해 vpa
를 호출합니다.
dp = log(3); s = log(sym(3)); dpVpa = vpa(dp) sVpa = vpa(s) d = sVpa - dpVpa
dpVpa = 1.0986122886681095600636126619065 sVpa = 1.0986122886681096913952452369225 d = 0.00000000000000013133163257501600766255995767652
예상대로 배정밀도 결과는 소수점 이하 16자리에서 정확한 결과와 다릅니다.
vpa
는 p/q, pπ/q, (p/q)1/2, 2q 및 10q 형식의 표현식에 대한 정밀도를 복원합니다. 여기서 p와 q는 적당한 크기의 정수입니다. 배정밀도 결과와 정확한 기호 결과에 대해 vpa
를 호출하여 차이를 구합니다. 차이가 0.0
이며 이는 vpa
가 배정밀도 입력값에서 손실된 정밀도를 복원한다는 것을 보여줍니다.
vpa(1/3) - vpa(1/sym(3)) vpa(pi) - vpa(sym(pi)) vpa(1/sqrt(2)) - vpa(1/sqrt(sym(2))) vpa(2^66) - vpa(2^sym(66)) vpa(10^25) - vpa(10^sym(25))
ans = 0.0 ans = 0.0 ans = 0.0 ans = 0.0 ans = 0.0
vpa
는 지수에 있는 분수를 부동소수점으로 변환하지 않습니다. 예를 들어, vpa(a^sym(2/5))
는 a^(2/5)
을 반환합니다.
vpa
는 digits
에 지정한 자릿수보다 많은 자릿수를 사용합니다. 이러한 추가 자릿수는 이후 계산에서 반올림 오차를 방지하므로 보호 자릿수라고 합니다.
1/3
, 2^(-5)
또는 sin(pi/4)
와 같은 숫자형 입력값에 대해 vpa
를 호출하면 숫자 표현식이 반올림 오차를 포함하는 배정밀도 숫자로 계산됩니다. 그리고, vpa
는 그 배정밀도 숫자에 대해 호출됩니다. 정확한 결과를 얻으려면 sym
을 사용하여 숫자 표현식을 기호 표현식으로 변환하십시오. 예를 들어, exp(1)
을 근사하려면 vpa(exp(sym(1)))
을 사용하십시오.
두 번째 인수 d
가 정수가 아닌 경우 vpa
는 round
를 사용하여 이 값을 가장 가까운 정수로 반올림합니다.
vpa
는 p/q, pπ/q, (p/q)1/2, 2q 및 10q 형식과 일치하는 숫자형 입력값에 대해서는 정밀도를 복원합니다. 여기서 p와 q는 적당한 크기의 정수입니다.
가변 정밀도 연산방식을 사용하는 아토믹 연산은 가장 가까운 값으로 반올림합니다.
가변 정밀도 연산방식과 IEEE Floating-Point Standard 754의 차이점은 다음과 같습니다.
계산 내에서 0으로 나누면 오류가 발생합니다.
지수 범위는 미리 정의된 IEEE 모드보다 큽니다. vpa
는 대략적으로 10^(-323228496)
아래에서 언더플로합니다.
비정규화된 숫자는 구현되지 않습니다.
0은 부호가 지정되지 않습니다.
결과의 가수에 있는 이진 숫자의 수는 가변 정밀도 연산방식과 IEEE 사전 정의 유형 간에 다를 수 있습니다.
NaN
표현은 하나뿐입니다. quiet NaN
과 signaling NaN을 구별하지 않습니다.
부동소수점 숫자 예외는 사용할 수 없습니다.
digits
| double
| root
| vpaintegral