Matlab: как выполнить арифметику с фиксированной точкой без расширения базового типа данных?
Google молчит по этому вопросу. В настоящее время я реализую числовой калькулятор только на 16-битной знаковой фиксированной точке в Matlab. Но арифметическая операция на 16-битной фиксированной точке вызывает расширение типа данных до следующего
>> a = int16(1.5 * 4)
a = 6
>> T = numerictype(1, 16, 2)
T = DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 16
FractionLength: 2
>> dis = reinterpretcast(a, T)
dis = 1.5000
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 16
FractionLength: 2
>> c = dis * dis
c = 2.2500
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 32
FractionLength: 4
Я хочу переменную c
остается в WordLength 16, FractionLength 2. Возможно ли, что арифметическая операция на 16-битной фиксированной точке выполняется без расширения базового типа данных? Я собираюсь рискнуть любым переполнением и утечкой. Любой помощь была бы потрясающей.
редактировать ввести fimath
в командное окно вызвать ошибку. Почему возникает эта ошибка?
>> F = fimath('OverflowAction','Wrap', 'RoundingMethod', 'Floor', ...
'ProductWordLength', 16, 'ProductFractionLength', 2);
No public field OverflowAction exists for class embedded.fimath.
Error in fimath (line 72)
this.(varargin{k}) = varargin{k+1};
1 ответов
локальное решение:
Вы можете использовать fimath
объект чтобы указать точность результата продукта:
F = fimath('OverflowMode','Wrap', 'RoundMode', 'Floor', ...
'ProductMode', 'SpecifyPrecision', ...
'ProductWordLength', 16, 'ProductFractionLength', 2);
dis.fimath = F;
тогда результат будет:
>> dis*dis
ans =
2.25
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 16
FractionLength: 2
RoundMode: floor
OverflowMode: wrap
ProductMode: SpecifyPrecision
ProductWordLength: 16
ProductFractionLength: 2
SumMode: FullPrecision
MaxSumWordLength: 128
глобальное решение: кроме того, если вы хотите, чтобы это применялось ко всем переменным fixedpoint, вы можете использовать
globalfimath('OverflowMode','Wrap', 'RoundMode', 'Floor', ...
'ProductMode', 'SpecifyPrecision', ...
'ProductWordLength', 16, 'ProductFractionLength', 2);
Примечание чтобы ограничить до 16 бит, вам также нужно указать точность для sum (используя SumMode
и SumWordLength
свойства fimath
) в противном случае сумма будет иметь длину слова 17:
>> dis+dis
ans =
3
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 17
FractionLength: 2