exponenta event banner

fimath ProductMode и SumMode

Пример настройки

Примеры в разделах этого раздела показывают различия между четырьмя настройками 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

SpecifyPrecision

Теперь установлено 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 Свойства объекта