Математика одинарной точности

В этом примере показано, как выполнить арифметическую и линейную алгебру с данными об одинарной точности. Это также показывает, как результаты вычисляются соответственно в с одинарной точностью или с двойной точностью, в зависимости от входа.

Создание данных двойной точности

Давайте сначала создадим некоторые данные, которые являются двойной точностью по умолчанию.

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');

Создание нулей одинарной точности и единиц

Мы можем также создать нули одинарной точности и единицы с их соответствующими функциями.

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) берет половину количества байтов памяти хранилищу, потому что одиночные игры требуют всего четырех байтов (32 бита), тогда как удваивается, требуют 8 байтов (64 бита).

Арифметическая и линейная алгебра

Мы можем выполнить стандартную арифметику и линейную алгебру на одиночных играх.

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.

Программа, что работы или для Одинарной или для Двойной точности

Теперь давайте посмотрим на функцию, чтобы вычислить достаточно терминов в последовательности Фибоначчи, таким образом, отношение меньше правильного эпсилона машины (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, fnext, и goldenMean, со значениями, которые зависят от входного типа данных и допуска tol зависит от того типа также. Одинарная точность требует, чтобы мы вычислили меньше терминов, чем эквивалентное вычисление двойной точности.