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