主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

固定小数点演算の実行

固定小数点演算

加算と減算

2つの固定小数点数を加算するときは,结果を正确に表すためにキャリービットが必要となる场合があります。このため,2つの乙ビット数(同じスケーリングをもつ)を加算すると,结果の値は,使用される2つのオペランドと比べてビットが多くなります。

= fi (0.234375, 0, 4, 6);c = a +
c = 0.4688 DataTypeMode:定点:二进制点缩放符号:Unsigned WordLength: 5 FractionLength: 6
a.bin
ans = 1111
c.bin
ans = 11110

精度が异なる2つの数値を加算または减算する场合は,最初に基数点を揃えてから演算を行う必要があります。その结果,演算结果とオペランドではビット数が2以上异なることになります。

= fi(π,1、16、13);b = fi(0.1、1、12、14);C = a + b
C = 3.2416 DataTypeMode:定点:二进制点缩放符号性:签字字长:18 FractionLength:14

乘算

一般に,完全精度の積には,オペランドの語長の合計と同じ語長が必要です。以下の例では積Cの语长は,一种の语长にB.の语长を加算した长さと等しいことに注意してください。Cの小数部の長さも,一种の小数部の长さにB.の小数部の長さを加算した長さと等しくなります。

一个=科幻(PI,1,20),B =音响(EXP(1),1,16)
A = 3.1416 DataTypeMode:定点:二进制点缩放符号性:签字字长:20 FractionLength:17 B = 2.7183 DataTypeMode:定点:二进制点缩放符号性:签字字长:16 FractionLength:13
C = A * B
C = 8.5397 DataTypeMode:定点:二进制点缩放符号性:签字字长:36 FractionLength:30

他の组み込みデータ型を使用した计算

Cでは,整数データ型と双データ型の間での演算の結果は双に変換されることに注意してください。ただし,MATLAB®では,组み込み整数データ型と双データ型の间の演算の结果は,整数になります。この点で,FI.オブジェクトはMATLABの組み込み整数データ型のように動作します。

FI.の间で加算を行うと,双はFI.の入力と同じ数値型をもつFI.にキャストされます。演算の结果はFI.になります。FI.の间で乘算を行うと,双は,FI.と同じ語長と符号属性および最高精度の小数部の長さをもつFI.にキャストされます。演算の结果はFI.になります。

一个= fi (pi);
a = 3.1416 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 16 FractionLength: 13
B = 0.5 *一个
b = 1.5708 DataTypeMode:定点:二进制点缩放Signedness: Signed WordLength: 32 FractionLength: 28

FI.と組み込み整数データ型[U] INT [8,16,32]のうちの1つとの間で演算を行うと,整数の語長と符号属性が保持されます。演算の結果はFI.になります。

一个= fi (pi);B = INT8(2)*一
B = 6.2832 DataTypeMode:定点:二进制点缩放符号性:签字字长:24 FractionLength:13

FI.と論理データ型の間で演算を行うと,論理値は値が0または1で語長1の符号なしFI.オブジェクトとして处理されます。演算の结果はFI.オブジェクトになります。

一个= fi (pi);b =逻辑(1);C = A * B
C = 3.1416 DataTypeMode:定点:二进制点缩放符号性:签字字长:17 FractionLength:13

fimathオブジェクト

fimathプロパティは,FI.オブジェクトに数式,丸めおよびオーバーフロープロパティを含む算術演算を実行するためのルールを定義します。FI.オブジェクトはローカルなfimathオブジェクトをもつことも,既定のfimathプロパティを使用することもあります。setfimathを使用すると,fimathオブジェクトをFI.オブジェクトに添付できます。また,作成时にFI.コンストラクターでfimathプロパティを指定できます。FI.オブジェクトがローカルなfimathをもち,既定のプロパティを使用しない場合は,FI.オブジェクトの画面にfimathプロパティが表示されます。この例では,一种に,コンストラクターで指定されたProductModeプロパティがあります。

一个=科幻(5,1,16,4,“ProductMode”'KeepMSB'
a = 5 DataTypeMode: Fixed-point: binary point scaling signness: Signed WordLength: 16 FractionLength: 4 RoundingMethod: Nearest OverflowAction: Saturate ProductMode: KeepMSB ProductWordLength: 32 SumMode: FullPrecision
一种ProductModeプロパティはKeepMSBに设定されていますが,残りのfimathプロパティには既定値が使用されます。

メモ

fimathオブジェクト,そのプロパティおよびこれらの既定値の詳細は,fimathオブジェクトプロパティを参照してください。

ビット成长率

次の表に,FI.オブジェクト一种B.SumModeおよびProductModeプロパティに既定のfimathFullPrecisionが使用されている场合の,これらのオブジェクトのビット成长率を示します。

一种 B. 总和= A + B PROD = A * B
形式 网络连接(V一种,S1,W1,F1 网络连接(VB.,S2,W2,F2 - -
符号 S.1 S.2 S.=(S.1||S.2 S.产品=(S.1||S.2
整数ビット 一世1= W1-F1-s1 一世2= W2-F2-s2 一世= max (w1-F1,W2-F2)+ 1 - S 一世产品=(瓦特1+ W2) - (F1+ F2
小数部ビット F1 F2 F= MAX(六1, F2 F产品= F1+ F2
合計ビット W.1 W.2 S.+我+ F W.1+ W2

次の例では,为了ループでビット成長が発生する仕組みを示します。

T.acc = fi(32岁的[],1 0);T.x = fi(0)[], 16日;X =铸造(1:3,“喜欢”,T.x);ACC =零(1,1,“喜欢”, T.acc);为了N = 1:长度(X)ACC = ACC + X(N)结尾
0 Acc = 1 s33,0 Acc = 3 s34,0 Acc = 6 s35,0
ループが反复されるたびに,ACC.の语长が増加します。この増加によって,2つの问题が生じます0.1つは,コード生成ではループ内のデータ型を変更できないことです。もう1つは,ループが长い场合にMATLABがメモリ不足になることです。この问题を回避する手法については,ビット成长率の抑制を参照してください。

ビット成长率の抑制

fimathの使用

FI.オブジェクトのfimathプロパティを指定することで,このオブジェクトにおける演算実行时のビット成长率を抑制できます。

F = fimath('SumMode''SpecifyPrecision'“SumWordLength”8...“SumFractionLength”,0);一个=科幻(8,1,8,0,F);B =科幻(3,1,8,0);C = A + B
C = 11 DataTypeMode:定点:二进制点缩放符号性:签字字长:8 FractionLength:0 RoundingMethod:最近OverflowAction:饱和和ProductMode:FullPrecision SumMode:SpecifyPrecision SumWordLength:8 SumFractionLength:0 CastBeforeSum:真

FI.オブジェクトの一种はローカルなfimathオブジェクトFをもっています。Fは合计の语长と小数部の长さを指定します。既定のfimath設定では,出的力Cは一般に语长が9,小数部の长さが0になります。ただし,一种はローカルなfimathオブジェクトをもつため,作成されるFI.オブジェクトは语长が8,小数部の长さが0になります。

fimathプロパティを使用しても,为了ループのビット成长率を抑制できます。

F = fimath('SumMode''SpecifyPrecision'“SumWordLength”,32,...“SumFractionLength”,0);T.acc =科幻([],1,32,0,F);T.x = fi(0)[], 16日;X =铸造(1:3,“喜欢”,T.x);ACC =零(1,1,“喜欢”, T.acc);为了N = 1:长度(X)ACC = ACC + X(N)结尾
ACC = 1 s32,0 ACC = 3 s32,0 ACC = 6 s32,0

T.accが既定のfimathプロパティを使用していた场合と异なり,ACC.のビット成長率は制限されるようになります。そのため,ACC.の语长は32のままです。

添字を使用した代入

ビット成长率を制御するもう1つの方法は,添字を使用した代入を使用することです。(我)= bB.の値を添字ベクトル一世で指定された一种の要素に代入する一方で,一种numerictypeを维持します。

T.acc = fi(32岁的[],1 0);T.x = fi(0)[], 16日;X =铸造(1:3,“喜欢”,T.x);ACC =零(1,1,“喜欢”, T.acc);赋值给acc而不改变它的类型为了N = 1:长度(X)ACC(:) = ACC + X(N)结尾

Acc (:) = Acc + x(n)は,添字ベクトル(:)の値の変更を指示します。しかし,出力ACC.numerictypeはそのまま维持されます。ACC.はスカラーであるため,添字ベクトルとして(1)を使用している場合も受け取る出力は同じです。

为了N = 1:numel(x) acc(1) = acc + x(N);结尾
ACC = 1 s32,0 ACC = 3 s32,0 ACC = 6 s32,0

ACC.numerictype为了ループを反復しても変化しません。

添字を使用した代入は,関数内でビット成長率を抑制する場合にも役立ちます。关数cumulative_sumでは,ynumerictypeは変化しませんが,正で指定された要素の値は変化します。

功能Y = cumulative_sum(x)的% CUMULATIVE_SUM向量中元素的累积和。%对于向量,Y = cumulative_sum(X)是一个包含%X的元素的累积和Y型的是X的类型y = 0(大小(x),“喜欢”,X);Y(1)= X(1);为了N = 2:长度y(N) = y(N -1) + x(N);结尾结尾
Y = cumulative_sum(FI([1:10],1,8,0))
Y = 1 3 6 10 15 21 28 36 45 55 DataTypeMode:定点:二进制点缩放符号性:签字字长:8 FractionLength:0

メモ

添字を使用した代入の详细は,关数subsasgnの说明を参照してください。

accumposとaccumneg

ビット成长率を抑制するもう1つの方法は,关数accumposおよびaccumnegによる加算および减算演算の実行です。添字を使用した代入と同様に,accumposおよびaccumnegでは入力したFI.オブジェクトの1つのデータ型を维持すると同时に,入力値の丸め手法とオーバーフローアクションを指定できます。

accumposおよびaccumnegの実装方法の詳細は,生成コードでのマルチワード処理の回避を参照してください。

オーバーフローと丸め

固定小数点の算術演算を実行する場合は,オーバーフローの可能性と影響について検討してください。fimathオブジェクトは,算術演算処理を実行するときに使用されるオーバーフローモードおよび丸めモードを指定します。

オーバーフロー

演算结果が表现可能な最小値または最大値を超えると,オーバーフローが発生することがあります。fimathオブジェクトにはOverflowActionプロパティがあり,饱和とラップという2种类の方法でオーバーフローを处理できます。OverflowAction饱和に設定すると,オーバーフローは範囲の最大値または最小値に飽和されます。OverflowActionに设定すると,オーバーフローは,符号なしの场合はモジュロ演算,符号付きの场合は2の补数を使用してラップします。

オーバーフローの検出方法の詳細は,fiprefを使用したアンダーフローとオーバーフローのログ作成を参照してください。

丸め

丸め手法を选択する场合は,コスト,バイアス,オーバーフローの可能性の有无など,さまざまな要因を考虑する必要があります.Fixed点设计™ソフトウェアは,设计の要件を満たすさまざまな丸め关数を提供します。

丸め手法 说明 コスト バイアス オーバーフローの可能性
CEIL. 正の無限大方向の最も近い表現可能な数値に丸めます。 大きい正の数値 あり
收敛 最も近い表現可能な数値に丸めます。等距離の場合,收敛は最も近い偶数に丸めます。このアプローチはツールボックスで提供される最もバイアスの小さい丸め手法です。 バイアスなし あり
地面 2の補数切り捨てに等しく,負の無限大方向の最も近い表現可能な数値に丸めます。 大きい负の数値 なし
最近 最も近い表現可能な数値に丸めます。等距離の場合,最近は,正の无限大方向の最も近い表现可能な数値に丸めます。これはFI.オブジェクトの作成とFI.算術で既定の丸め手法です。 小さい正の数値 あり
最も近い表現可能な数値に丸めます。等距離の場合,メソッドは次のように丸めます。
  • 正の数値は,正の無限大方向の最も近い表現可能な数値に丸めます。

  • 負の数値は,負の無限大方向の最も近い表現可能な数値に丸めます。

  • 負のサンプルでは小さい負の数値

  • 正の数値と負の数値が均等に分布するサンプルではバイアスなし

  • 正のサンプルでは小さい正の数値

あり
使固定 ゼロ方向の最も近い表现可能な数値に丸めます。
  • 負のサンプルでは大きい正の数値

  • 正の数値と負の数値が均等に分布するサンプルではバイアスなし

  • 正のサンプルでは大きい負の数値

なし