7

Google はこの問題について沈黙を守っています。現在、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

変数cが WordLength 16、FractionLength 2 のままであることを望みます。基になるデータ型を拡張せずに 16 ビット固定小数点の算術演算を行うことは可能ですか? オーバーフローとアンダーフローのリスクを冒します。どんな助けでも素晴らしいでしょう。

EDIT :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};
4

1 に答える 1

5

ローカル ソリューション: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

グローバル ソリューション:または、これをすべての固定小数点変数に適用する場合は、次を使用できます。

globalfimath('OverflowMode','Wrap', 'RoundMode', 'Floor', ...
             'ProductMode', 'SpecifyPrecision', ...
             'ProductWordLength', 16, 'ProductFractionLength', 2);

16 ビットに制限するには、合計の精度も指定する必要があることに注意SumModeしてください (とSumWordLengthのプロパティを使用fimath)。そうしないと、合計の語長は 17 になります。

>> dis+dis
ans =
     3

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 17
        FractionLength: 2
于 2013-09-25T11:44:10.447 に答える