Main Content

고정밀도의 수치 계산

이 예제에서는 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)

관련 항목