Main Content

단정밀도(Single Precision) 계산

이 예제에서는 단정밀도 즉, 데이터형이 'single'인 데이터에 대해 산술 연산과 선형 대수 연산을 수행하는 방법을 보여줍니다. 또한 입력값에 따라 결과를 단정밀도 또는 배정밀도로 적절히 계산하는 방법도 보여줍니다.

배정밀도(Double Precision) 데이터 생성

먼저 데이터를 만들어 보겠습니다. 데이터형은 기본적으로 배정밀도 즉, 'double'입니다.

Ad = [1 2 0; 2 5 -1; 4 10 -1]
Ad = 3×3

     1     2     0
     2     5    -1
     4    10    -1

단정밀도로 변환

single 함수를 사용하여 데이터를 단정밀도로 변환할 수 있습니다.

A = single(Ad); % or A = cast(Ad,'single');

단정밀도 0으로 구성된 행렬과 단정밀도 1로 구성된 행렬 생성

각각 해당하는 함수를 사용하여 단정밀도 0과 단정밀도 1로 구성된 행렬을 만들 수도 있습니다.

n = 1000;
Z = zeros(n,1,'single');
O = ones(n,1,'single');

작업 공간의 변수를 살펴보겠습니다.

whos A Ad O Z n
  Name         Size            Bytes  Class     Attributes

  A            3x3                36  single              
  Ad           3x3                72  double              
  O         1000x1              4000  single              
  Z         1000x1              4000  single              
  n            1x1                 8  double              

일부 변수는 single 유형이며 변수 A(Ad의 단정밀도 버전)는 절반의 메모리 바이트 수로 저장된 것을 알 수 있습니다. 배정밀도는 데이터 하나를 저장하는 데 8바이트(64비트)를 필요로 하는 반면 단정밀도는 4바이트(32비트)를 필요로 합니다.

산술 연산과 선형 대수 연산

단정밀도 데이터에 대해 표준 산술 연산과 선형 대수 연산을 수행할 수 있습니다.

B = A'    % Matrix Transpose
B = 3x3 single matrix

     1     2     4
     2     5    10
     0    -1    -1

whos B
  Name      Size            Bytes  Class     Attributes

  B         3x3                36  single              

이 연산의 결과인 B는 단정밀도입니다.

C = A * B % Matrix multiplication
C = 3x3 single matrix

     5    12    24
    12    30    59
    24    59   117

C = A .* B % Elementwise arithmetic
C = 3x3 single matrix

     1     4     0
     4    25   -10
     0   -10     1

X = inv(A) % Matrix inverse
X = 3x3 single matrix

     5     2    -2
    -2    -1     1
     0    -2     1

I = inv(A) * A % Confirm result is identity matrix
I = 3x3 single matrix

     1     0     0
     0     1     0
     0     0     1

I = A \ A  % Better way to do matrix division than inv
I = 3x3 single matrix

     1     0     0
     0     1     0
     0     0     1

E = eig(A) % Eigenvalues
E = 3x1 single column vector

    3.7321
    0.2679
    1.0000

F = fft(A(:,1)) % FFT
F = 3x1 single column vector

   7.0000 + 0.0000i
  -2.0000 + 1.7321i
  -2.0000 - 1.7321i

S = svd(A) % Singular value decomposition
S = 3x1 single column vector

   12.3171
    0.5149
    0.1577

P = round(poly(A)) % The characteristic polynomial of a matrix
P = 1x4 single row vector

     1    -5     5    -1

R = roots(P) % Roots of a polynomial
R = 3x1 single column vector

    3.7321
    1.0000
    0.2679

Q = conv(P,P) % Convolve two vectors
Q = 1x7 single row vector

     1   -10    35   -52    35   -10     1

R = conv(P,Q)
R = 1x10 single row vector

     1   -15    90  -278   480  -480   278   -90    15    -1

stem(R); % Plot the result

Figure contains an axes object. The axes object contains an object of type stem.

단정밀도 또는 배정밀도에 대해 작동하는 프로그램

이제 피보나치 수열(Fibonacci Sequence)에서 충분한 항을 계산하여 비율이 single형 또는 double형의 올바른 머신 엡실론(eps)보다 작게 유지되도록 하는 함수를 살펴보겠습니다.

% How many terms needed to get single precision results?
fibodemo('single')
ans = 19
% How many terms needed to get double precision results?
fibodemo('double')
ans = 41
% Now let's look at the working code.
type fibodemo
function nterms = fibodemo(dtype)
%FIBODEMO Used by SINGLEMATH demo.
% Calculate number of terms in Fibonacci sequence.

% Copyright 1984-2014 The MathWorks, Inc.

fcurrent = ones(dtype);
fnext = fcurrent;
goldenMean = (ones(dtype)+sqrt(5))/2;
tol = eps(goldenMean);
nterms = 2;
while abs(fnext/fcurrent - goldenMean) >= tol
   nterms = nterms + 1;
   temp  = fnext;
   fnext = fnext + fcurrent;
   fcurrent = temp;
end

여기서는 여러 변수 fcurrent, fnextgoldenMean을 입력 데이터형에 종속된 값으로 초기화했으며 허용오차 tol도 해당 데이터형에 종속적입니다. 단정밀도에서는 상응하는 배정밀도 계산보다 더 적은 항을 계산해야 합니다.