Matlab:如何在不扩展底层数据类型的情况下执行定点运算?

inh*_*dle 7 matlab fixed-point

谷歌在这个问题上保持沉默.我目前正在Matlab中仅在16位有符号定点上实现数值计算器.但是对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
Run Code Online (Sandbox Code Playgroud)

我希望变量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};
Run Code Online (Sandbox Code Playgroud)

Moh*_*nia 5

本地解决方案: 您可以使用一个fimath对象来指定乘积结果的精度

F = fimath('OverflowMode','Wrap', 'RoundMode', 'Floor', ...
           'ProductMode', 'SpecifyPrecision', ...
           'ProductWordLength', 16, 'ProductFractionLength', 2);
dis.fimath = F;
Run Code Online (Sandbox Code Playgroud)

那么结果将是:

>> 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
Run Code Online (Sandbox Code Playgroud)

全局解决方案:或者,如果您希望将其应用于所有定点变量,您可以使用

globalfimath('OverflowMode','Wrap', 'RoundMode', 'Floor', ...
             'ProductMode', 'SpecifyPrecision', ...
             'ProductWordLength', 16, 'ProductFractionLength', 2);
Run Code Online (Sandbox Code Playgroud)

请注意,要限制为 16 位,您还需要指定 sum 的精度(使用SumMode和 的SumWordLength属性fimath),否则 sum 的字长将为 17:

>> dis+dis
ans =
     3

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 17
        FractionLength: 2
Run Code Online (Sandbox Code Playgroud)