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