주요 콘텐츠

vpa

R2026b

가변 정밀도 연산방식(임의 정밀도 연산방식)

설명

yVpa = vpa(y)는 가변 정밀도 연산방식(임의 정밀도 부동소수점 숫자 사용)을 사용하여 입력값 y의 각 요소를 최소 d자리의 유효 자릿수로 계산합니다. 여기서 d는 digits 함수의 값입니다. digits의 디폴트 값은 32입니다.

예제

yVpa = vpa(y,d)는 digits 값 대신 최소 d자리의 유효 자릿수를 사용합니다.

예제

yVpa = vpa(___,BoostPrecision=tf)는 y가 배정밀도인 경우 이를 가변 정밀도를 갖는 기호 숫자로 변환할 때 y의 정밀도를 높일지 여부를 지정합니다. 기본적으로, 배정밀도 입력값을 vpa에 전달할 경우 이 함수는 변환 중에 정밀도를 높이려고 시도합니다. 배정밀도 입력값의 원래 비트 패턴을 유지하려면 BoostPrecision을 false로 설정하십시오. 위에 열거된 구문에 나와 있는 입력 인수의 조합과 함께 이 옵션을 사용할 수 있습니다. (R2026a 이후)

예제

예제

모두 축소

가변 정밀도 부동소수점 연산방식을 사용하여 기호 입력값을 계산합니다. 기본적으로 vpa는 32자리의 유효 자릿수로 값을 계산합니다.

π를 32자리의 유효 자릿수로 계산합니다.

p = sym(pi);
pVpa = vpa(p)
pVpa = 3.1415926535897932384626433832795

기호 표현식을 계산합니다.

syms x
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];
VVpa = vpa(V)
VVpa = (0.31830988618379067153776752674503 x0.037037037037037037037037037037037)
M = [sin(p) cos(p/5); exp(p*x) x/log(p)];
MVpa = vpa(M)
MVpa = 

(00.80901699437494742410229341718282e3.1415926535897932384626433832795 x0.87356852683023186835397746476334 x)

기본적으로 vpa는 32자리의 유효 자릿수로 입력값을 계산합니다. digits 함수를 사용하여 유효 자릿수를 변경할 수 있습니다.

기호 표현식 100001/10001을 7자리의 유효 자릿수를 사용하여 근사합니다. digits를 사용하여 유효 자릿수를 설정하고 digits의 원래 값을 저장합니다. vpa 함수는 5자리의 유효 자릿수만 반환하며, 이는 그 이후 숫자가 0이라는 것을 의미할 수 있습니다.

digitsOld = digits(7);
y = sym(100001)/10001;
yVpa = vpa(y)
yVpa = 9.9991

더 높은 정밀도 값인 25를 사용하여 그 이후 숫자가 0인지 확인합니다. 결과는 그 이후 숫자가 사실상 반복 소수의 일부인 0이라는 것을 보여줍니다.

digits(25)
yVpa = vpa(y)
yVpa = 9.999100089991000899910009

또는 단일 vpa 호출에 대해 digits를 재정의하려면 두 번째 인수를 지정하여 정밀도를 변경하십시오.

두 번째 인수를 지정하여 π를 100자리의 유효 자릿수로 구합니다.

pVpa = vpa(sym(pi),100)
pVpa = 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068

추후 계산을 위해 원래 정밀도 값을 복원합니다.

digits(digitsOld)

기호 결과는 정확하지만 사용하기에 편리한 형식이 아닐 수 있습니다. vpa를 사용하여 정확한 기호 결과를 수치적으로 근사할 수 있습니다.

solve를 사용하여 높은 차수 다항식의 근을 구합니다. solve 함수는 높은 차수 다항식을 기호적으로 풀 수 없으며 root를 사용하여 근을 나타냅니다.

syms x
y = solve(x^4 - x + 1, x)
y = 

(root(z4-z+1,z,1)root(z4-z+1,z,2)root(z4-z+1,z,3)root(z4-z+1,z,4))

vpa를 사용하여 근에 대한 수치적 근삿값을 구합니다.

yVpa = vpa(y)
yVpa = 

(0.72713608449119683997667565867496-0.43001428832971577641651985839602 i0.72713608449119683997667565867496+0.43001428832971577641651985839602 i-0.72713608449119683997667565867496-0.93409928946052943963903028710582 i-0.72713608449119683997667565867496+0.93409928946052943963903028710582 i)

digits 함수는 가변 정밀도 연산방식에 사용할 최소 유효 자릿수를 지정합니다. 또는 vpa(y,d) 구문을 사용하여 입력값 y를 최소 d자리의 유효 자릿수로 변환할 수 있습니다. 내부적으로 vpa는 지정된 것보다 더 많은 자릿수를 사용합니다. 이러한 추가 자릿수는 이후 계산의 반올림 오차를 방지하므로 이러한 자릿수를 보호 자릿수라고 합니다.

4개의 유효 자릿수를 사용하여 π를 근사합니다.

pi_4digits = vpa(sym(pi),4)
pi_4digits = 3.142

다음으로, 이전 결과를 사용하여 π를 6자리의 유효 자릿수로 근사합니다. 결과는 vpa 함수가 π의 초기 변환 중에 4자리 이상을 사용했다는 것을 보여주며, 이는 보호 자릿수가 사용되었음을 입증합니다.

pi_6digits = vpa(pi_4digits,6)
pi_6digits = 3.14159

배정밀도 형식은 64비트 메모리를 사용하여 숫자를 저장하므로 수치 정밀도가 제한됩니다. vpa는 원래 배정밀도 값보다 더 많은 자릿수를 반환하지만, 배정밀도 입력값에 대해 vpa를 호출하면 일반적으로 vpa는 배정밀도 표현의 일반적인 16자리 유효 자릿수를 넘어 손실된 정밀도를 복원할 수는 없습니다. 그러나 vpa는 pq, pπq, (pq)12, 2q 및 10q 형식으로 된 연산의 정밀도를 인식하고 높일 수 있는 알고리즘을 사용합니다. 여기서 p와 q는 적당한 크기의 정수입니다.

먼저, vpa가 log 함수를 포함하는 배정밀도 계산의 정밀도를 높일 수 없음을 보여줍니다. 배정밀도 결과에 대해 그리고 동일한 기호 결과에 대해 vpa를 호출합니다.

yDouble = log(3);
ySym = log(sym(3));
yDoubleToVpa = vpa(yDouble)
yDoubleToVpa = 1.09861
ySymToVpa = vpa(ySym)
ySymToVpa = 1.09861
d = yDoubleToVpa - ySymToVpa
d = 2.44249e-15

예상대로 배정밀도 결과는 소수점 이하 16자리 이후부터 기호 결과와 다릅니다.

vpa는 pq, pπq, (pq)12, 2q 및 10q 형식의 표현식에 대한 정밀도를 높입니다. 여기서 p와 q는 적당한 크기의 정수이며, 배정밀도 결과와 정확한 기호 결과에 대해 vpa를 호출하여 차이를 구합니다. 차이가 0.0인데, 이는 vpa가 배정밀도 입력값에서 손실된 정밀도를 복원한다는 것을 보여줍니다.

d = vpa(1/3) - vpa(1/sym(3))
d = 0.0
d = vpa(pi) - vpa(sym(pi))
d = 0.0
d = vpa(1/sqrt(2)) - vpa(1/sqrt(sym(2)))
d = 0.0
d = vpa(2^66) - vpa(2^sym(66))
d = 0.0
d = vpa(10^25) - vpa(10^sym(25))
d = 0.0

R2026a부터는 BoostPrecision 옵션을 false로 지정하여 pq, pπq, (pq)12, 2q 및 10q 형식의 배정밀도 표현식에 대한 정밀도를 높이지 않고 vpa를 사용할 수 있습니다. 예를 들어, 소수점 이하 16자리 이후 손실된 정밀도를 복원하지 않고 배정밀도 표현의 비트 패턴을 유지하면서 1/3의 배정밀도 값을 가변 정밀도로 변환합니다. 결과는 정확한 기호 결과에 대해 vpa를 호출한 것과 같지 않습니다.

yDoubleToVpa = vpa(1/3,BoostPrecision=false)
yDoubleToVpa = 0.333333
ySymToVpa = vpa(1/sym(3))
ySymToVpa = 0.333333
d = yDoubleToVpa - ySymToVpa
d = 0.0

서로 다른 정밀도를 갖는 숫자에 대해 연산을 수행하면 결과에 숨겨진 오차가 포함될 수 있습니다.

예를 들어, 1/10을 6자리의 정밀도와 5자리의 정밀도를 사용하여 계산합니다.

a = vpa(1/10,6)
a = 0.1
b = vpa(1/10,5)
b = 0.1

a와 b의 표시된 값은 같아 보이지만, 이 두 변수는 각각 6번째 유효 자릿수 이후와 5번째 유효 자릿수 이후에는 서로 다른 숫자를 저장하기 때문에 정확히는 같지 않습니다. 차이 a - b를 계산하여 두 값이 동일한지 확인합니다.

roundoff = a - b
roundoff = 0.0000000000000053290705182007513940334320068359
digits
 
Digits = 32
 

a - b의 결과는 0이 아닙니다. 그 이유는 a는 6자릿수까지 정확하고 b는 5자릿수까지 정확한데, 뺄셈에 사용된 digits가 디폴트로 32자릿수의 정밀도를 사용하기 때문입니다.

a와 b의 서로 다른 값들을 표시하려면 원래 값을 32자리의 유효 자릿수로 변환합니다.

a_32digits = vpa(a,32)
a_32digits = 0.099999999999999644728632119949907
b_32digits = vpa(b,32)
b_32digits = 0.099999999999994315658113919198513

이 변환된 값 사이의 차이를 계산합니다.

roundoff = a_32digits - b_32digits
roundoff = 0.0000000000000053290705182007513940334320068359

vpa를 사용하여 숫자 111111111111111111을 32자리의 유효 자릿수로 근사합니다. MATLAB에 숫자를 입력하면 표현 가능한 가장 가까운 배정밀도 값으로 변환되며, 이는 입력한 숫자와 정확히는 같지 않을 수 있기 때문에 16번째 자릿수 이후부터는 결과가 정확하지 않습니다.

xVpa = vpa(111111111111111111)
xVpa = 1.11111e+17

숫자를 정확하게 나타내려면 string형 입력값을 사용합니다. 여기서 vpa는 숫자 111111111111111111을 정확하게 32자리의 유효 자릿수로 근사합니다.

xVpa = vpa("111111111111111111")
xVpa = 1.11111e+17

R2022b 이후

sin([ππ2π2π3]X)를 나타내는 기호 표현식 S를 만듭니다. 여기서 X는 2×1 기호 행렬 변수입니다.

syms X [2 1] matrix
S = sin(hilb(2)*pi*X)
S = 

sin(Σ1 X)where  Σ1=(ππ2π2π3)

가변 정밀도 연산방식을 사용하여 표현식을 계산합니다.

SVpa = vpa(S)
SVpa = 

(sin(3.1415926535897932384626433832795 X1+1.5707963267948966192313216916398 X2)sin(1.5707963267948966192313216916398 X1+1.0471975511965977461542144610932 X2))

R2026a 이후

배정밀도 숫자를 기호 숫자로 변환하는 경우 vpa는 기본적으로 정밀도를 높이려고 시도하므로 의도치 않은 결과가 나타날 수 있습니다. 특히, vpa는 배정밀도 숫자의 최하위 유효 자릿수에 있는 값을 반올림 오차로 해석할 수도 있습니다.

예를 들어, 인접한 두 배정밀도 숫자인 1과 1 다음으로 큰 배정밀도 숫자를 살펴보겠습니다.

x = 1;
y = 1 + eps;

vpa를 사용하여 이 두 숫자를 변환하는 경우 변환된 숫자는 동일하며 그 차이는 0입니다. 이 경우, vpa는 y의 최하위 비트를 반올림 오차로 처리하기 때문에 해당 비트가 유지되지 않습니다.

d = vpa(y) - vpa(x)
d = 0.0

하지만 배정밀도 표현에서 이 두 숫자는 서로 다른 비트 패턴을 가지며, 이는 16진수 형식으로 확인할 수 있습니다.

x_hexStr = num2hex(x)
x_hexStr = 
'3ff0000000000000'
y_hexStr = num2hex(y)
y_hexStr = 
'3ff0000000000001'

vpa를 사용하여 배정밀도 입력값을 변환할 때 비트 패턴을 유지하려면 BoostPrecision 옵션을 false로 지정합니다. 이제, 변환된 숫자 사이의 차이가 eps에 가까워집니다.

d = vpa(y,BoostPrecision=false) - vpa(x,BoostPrecision=false)
d = 0.00000000000000022204460492503130808472633361816
format longE
eps
ans = 
     2.220446049250313e-16

vpa가 double형 숫자의 비트 패턴을 유지하지만 여전히 디폴트로 32자리의 유효 자릿수를 사용하며 double형 숫자의 유효 자릿수를 넘어서는 추가 자릿수를 채우려고 시도합니다. 변환된 숫자 사이의 차이가 eps가 되도록 하려면 vpa 연산에 대해 유효 자릿수를 16으로 설정하면 됩니다.

digits(16)
d = vpa(y,BoostPrecision=false) - vpa(x,BoostPrecision=false)
d = 0.0000000000000002220446049250313

마지막으로, vpa에서 사용하는 정밀도를 32자리로, 출력값 표시 형식을 디폴트 값으로 복원합니다.

digits(32)
format default

입력 인수

모두 축소

계산할 입력값으로, 스칼라, 숫자형 값 또는 string형으로 구성된 벡터, 행렬 또는 다차원 배열로 지정되거나 또는 기호 숫자, 기호 벡터, 기호 행렬, 기호 다차원 배열, 기호 표현식, 기호 함수, 기호 문자형 벡터 또는 기호 행렬 변수로 지정됩니다.

  • MATLAB®에 숫자를 입력하면 표현 가능한 가장 가까운 배정밀도 값으로 변환되며, 이는 입력한 숫자와 정확히 같지 않을 수도 있습니다. 숫자를 정확하게 나타내려면 y를 string형 입력값으로 지정할 수 있습니다.

  • y를 단정밀도 숫자로 지정할 경우 vpa는 이 숫자를 가변 정밀도로 변환하기 전에 먼저 배정밀도로 변환합니다.

데이터형: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | char | string | sym | symfun | symmatrix
복소수 지원 여부: 예

유효 자릿수로, 양의 정수 스칼라로 지정됩니다. 이 인수를 지정하지 않으면 digits 함수는 vpa에서 사용되는 유효 자릿수를 결정합니다.

d가 정수가 아닌 경우 vpa는 round 함수를 사용하여 이 값을 가장 가까운 정수로 반올림합니다.

R2026a 이후

배정밀도 입력값의 정밀도를 높이기 위한 옵션으로, 숫자형 또는 논리값 1(true) 또는 0(false)으로 지정됩니다. 기본적으로 y가 배정밀도인 경우 vpa는 이를 가변 정밀도를 갖는 기호 숫자로 변환할 때 y의 정밀도를 높이려고 시도합니다. 배정밀도 입력값의 원래 비트 패턴을 유지하려면 이 인수를 false로 지정하십시오.

y가 배정밀도가 아니면 이 인수는 아무런 영향을 미치지 않습니다.

출력 인수

모두 축소

가변 정밀도 출력값으로, 기호 숫자, 기호 벡터, 기호 행렬, 기호 다차원 배열, 기호 표현식 또는 기호 함수로 반환됩니다.

  • 거의 모든 입력 데이터형(예: sym, symmatrix, string, double, single, int64 등)에 대해 vpa는 출력값을 데이터형 sym으로 반환합니다.

  • 입력값이 symfun 유형의 기호 함수이면 vpa는 출력값을 데이터형 symfun으로 반환합니다. 예를 들어 syms f(x); f(x) = pi*x; g = vpa(f)는 출력값 g를 symfun 유형으로 반환합니다.

  • 입력값이 g = vpa(f(x))와 같이 sym 유형의 계산된 기호 함수이면 vpa는 출력값을 데이터형 sym으로 반환합니다.

데이터형: sym | symfun

팁

  • vpa는 지수에 있는 분수를 부동소수점으로 변환하지 않습니다. 예를 들어, vpa(a^sym(2/5))는 a^(2/5)을 반환합니다.

  • vpa는 내부적으로 digits에 지정한 자릿수보다 많은 자릿수를 사용합니다. 이러한 추가 자릿수는 이후 계산에서 반올림 오차를 방지합니다. 예제는 vpa에서 보호 자릿수를 사용하여 정밀도 유지하기 항목을 참조하십시오.

  • 1/3, 2^(-5) 또는 sin(pi/4)와 같은 숫자형 입력값에 대해 vpa를 호출하면 표현식이 먼저 64비트 또는 약 16자리의 정밀도를 갖는 배정밀도 숫자로 계산됩니다. 그런 다음 vpa는 정밀도를 지정된 유효 자릿수로 높입니다. 더 정확한 결과를 얻으려면 sym을 사용하여 대신 기호 입력값을 정의하십시오. 예를 들어, exp(1)을 32자리의 유효 자릿수로 근사하려면 vpa(exp(sym(1)))을 사용하십시오.

  • 기본적으로 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을 구별하지 않습니다.

    • 부동소수점 숫자 예외는 사용할 수 없습니다.

버전 내역

R2006a 이전에 개발됨

모두 확장