고정밀도의 수치 계산
이 예제에서는 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)