이 예제에서는 Symbolic Math Toolbox™에서 가변 정밀도 연산방식을 사용하여 고정밀도 계산을 구하는 방법을 보여줍니다.
근사 정수를 나타내는 공식을 찾습니다. 예를 들어, exp(sqrt(163)*pi)를 30자리까지 계산해 보겠습니다. 결과는 반올림 오차가 있는 상태로 표시된 정수로 보입니다.
disp("Setting precision to 30 digits")
digits(30);
f = exp(sqrt(sym(163))*sym(pi));
vpa(f)
Setting precision to 30 digits ans = 262537412640768743.999999999999
동일한 값을 40자리까지 계산해 보면 값이 실제로 정수가 아닌 것을 알 수 있습니다.
disp("Setting precision to 40 digits")
digits(40);
vpa(f)
Setting precision to 40 digits ans = 262537412640768743.9999999999992500725972
다음으로, 값의 상한이 exp(1000)인 숫자를 살펴봅니다. 이 숫자를 올바로 계산하려면 정확한 소수점 이하 자릿수를 확인해야 합니다. 상한 exp(1000)에 대해 필요한 최소 유효 정밀도를 구합니다.
disp("Compute the required working precision") disp(">> d = log10(exp(vpa(1000)))") d = log10(exp(vpa(1000)))
Compute the required working precision >> d = log10(exp(vpa(1000))) d = 434.2944819032518276511289189166050822944
정밀도에 따라 값이 달라지는 함수를 처음 호출하기 전에 필요한 정밀도를 설정합니다. 예를 들면 round
, vpa
또는 double
과 같은 함수를 사용하는 경우가 이에 해당합니다.
digits(ceil(d) + 50);
이제, 1 ~ 1000 사이의 n에 대한 exp(sqrt(n)*pi) 형식의 숫자를 살펴봅니다. 이 형식의 숫자가 정수에 가까운지 확인합니다. 소수부에 대한 히스토그램 플롯에서 이를 확인할 수 있습니다.
A = exp(pi*sqrt(vpa(1:1000))); B = A-round(A); histogram(double(B), 50)
exp(n) 형식에 대한 근사 정수가 있는지 계산합니다.
A = exp(vpa(1:1000)); B = A-round(A); find(abs(B) < 1/1000);
이제, A의 요소에 대한 소수부가 상당히 균일하게 분포되어 있는지를 확인할 수 있습니다.
histogram(double(B), 50)