fimath ProductMode и SumMode

Setup в качестве примера

Примеры в разделах этой темы показывают различия среди четырех настроек свойств ProductMode и SumMode:

  • FullPrecision

  • KeepLSB

  • KeepMSB

  • SpecifyPrecision

Чтобы следовать вперед, сначала установите следующие настройки:

p = fipref;
p.NumericTypeDisplay = 'short';
p.FimathDisplay = 'none';
p.LoggingMode = 'on';
F = fimath('OverflowAction','Wrap',...
     'RoundingMethod','Floor',...
     'CastBeforeSum',false);
warning off
format compact

Затем, задайте объекты fi a и b. Оба подписали 8-битные типы данных. Дробная длина выбрана автоматически для каждого объекта fi привести к самой лучшей точности:

a = fi(pi, true, 8)
a =
    3.1563
      s8,5
b = fi(exp(1), true, 8)
b =
    2.7188
      s8,5

FullPrecision

Теперь, установите ProductMode и SumMode для a и b к FullPrecision и посмотрите на некоторые результаты:

F.ProductMode = 'FullPrecision';
F.SumMode = 'FullPrecision';
a.fimath = F;
b.fimath = F;
a
a =
    3.1563			%011.00101
      s8,5
b
b =
    2.7188			%010.10111
      s8,5
a*b
ans =
    8.5811			%001000.1001010011
      s16,10
a+b
ans =
    5.8750			%0101.11100
      s9,5

В режиме FullPrecision размер слова продукта растет до суммы размеров слова операндов. В этом случае каждый операнд имеет 8 битов, таким образом, размер слова продукта составляет 16 битов. Длина части продукта является суммой дробных длин операндов, в этом случае 5 + 5 = 10 битов.

Размер слова суммы растет на один старший значащий бит, чтобы разместить возможность бита переноса. Длина части суммы выравнивается с дробными длинами операндов, и все дробные биты сохранены для полной точности. В этом случае оба операнда имеют 5 дробных битов, таким образом, сумма имеет 5 дробных битов.

KeepLSB

Теперь, установите ProductMode и SumMode для a и b к KeepLSB и посмотрите на некоторые результаты:

F.ProductMode = 'KeepLSB';
F.ProductWordLength = 12;
F.SumMode = 'KeepLSB';
F.SumWordLength = 12;
a.fimath = F;
b.fimath = F;
a
a =
    3.1563			%011.00101
      s8,5
b
b =
    2.7188			%010.10111
      s8,5
a*b
ans =
    0.5811			%00.1001010011
      s12,10
a+b
ans =
    5.8750			%0000101.11100
      s12,5

В режиме KeepLSB вы задаете размеры слова, и младшие значащие биты результатов автоматически сохранены. Этот режим моделирует поведение целочисленных операций на языке C.

Длина части продукта является суммой дробных длин операндов. В этом случае каждый операнд имеет 5 дробные биты, таким образом, длина части продукта является битами 10. В этом режиме сохранены все 10 дробных битов. Переполнение происходит, потому что результат полной точности требует целочисленных битов 6, и только целочисленные биты 2 остаются в продукте.

Длина части суммы выравнивается с дробными длинами операндов, и в этой модели сохранены все младшие значащие биты. В этом случае оба операнда имели 5 дробные биты, таким образом, сумма имеет 5 дробные биты. Результат полной точности требует целочисленных битов 4, и целочисленные биты 7 остаются в сумме, таким образом, никакое переполнение не происходит в сумме.

KeepMSB

Теперь, установите ProductMode и SumMode для a и b к KeepMSB и посмотрите на некоторые результаты:

F.ProductMode = 'KeepMSB';
F.ProductWordLength = 12;
F.SumMode = 'KeepMSB';
F.SumWordLength = 12;
a.fimath = F;
b.fimath = F;
a
a =
    3.1563			%011.00101
      s8,5
b
b =
    2.7188			%010.10111
      s8,5
a*b
ans =
    8.5781			%001000.100101
      s12,6
a+b
ans =
    5.8750			%0101.11100000
      s12,8

В режиме KeepMSB вы задаете размеры слова и старшие значащие биты суммы, и результаты продукта автоматически сохранены. Этот режим моделирует поведение многих устройств DSP, где продукт и сумма сохранены в общедвойных регистрах, и программист принимает решение передать старшие значащие биты от регистров до памяти после каждой операции.

Продукт полной точности требует целочисленных битов 6, и дробная длина продукта настроена, чтобы разместить все целочисленные биты 6 в этом режиме. Никакое переполнение не происходит. Однако продукт полной точности требует 10 дробные биты, и только 6 доступен. Поэтому точность потеряна.

Сумма полной точности требует целочисленных битов 4, и дробная длина суммы настроена, чтобы разместить все целочисленные биты 4 в этом режиме. Сумма полной точности требует только 5 дробные биты; в этом случае существует 8, таким образом, нет никакой потери точности.

Этот пример показывает, что, в режиме KeepMSB дробная длина изменяется независимо от того, происходит ли переполнение. Дробная длина установлена в сумму, должен был представлять продукт в случае, если оба условия используют максимальное возможное значение (18+18-16=20 в этом примере).

F = fimath('SumMode','KeepMSB','ProductMode','KeepMSB',...
    'ProductWordLength',16,'SumWordLength',16);
a = fi(100,1,16,-2,'fimath',F);
a*a
ans =
 
     0

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: -20

        RoundingMethod: Nearest
        OverflowAction: Saturate
           ProductMode: KeepMSB
     ProductWordLength: 16
               SumMode: KeepMSB
         SumWordLength: 16
         CastBeforeSum: true

Определение точности

Теперь установите ProductMode и SumMode для a и b к SpecifyPrecision и посмотрите на некоторые результаты:

F.ProductMode = 'SpecifyPrecision';
F.ProductWordLength = 8;
F.ProductFractionLength = 7;
F.SumMode = 'SpecifyPrecision';
F.SumWordLength = 8;
F.SumFractionLength = 7;
a.fimath = F;
b.fimath = F;
a
a =
    3.1563			%011.00101
      s8,5
b
b =
    2.7188			%010.10111
      s8,5
a*b
ans =
    0.5781			%0.1001010
      s8,7
a+b
ans =
   -0.1250			%1.1110000
      s8,7

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

Продукт полной точности требует целочисленных битов 6, и пример задает только 1, таким образом, продукт переполняется. Продукт полной точности требует 10 дробные биты, и пример только задает 7, таким образом, существует потеря точности в продукте.

Сумма полной точности требует целочисленных битов 4, и пример задает только 1, таким образом, сумма переполняется. Сумма полной точности требует 5 дробные биты, и пример задает 7, таким образом, нет никакой потери точности в сумме.

Для получения дополнительной информации об объекте fimath и его свойствах, см. fimath Свойства объектов