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