このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
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
プロパティは,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
プロパティに既定のfimath
値FullPrecision
が使用されている场合の,これらのオブジェクトのビット成长率を示します。
一种 | 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がメモリ不足になることです。この问题を回避する手法については,ビット成长率の抑制を参照してください。
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つの方法は,添字を使用した代入を使用することです。(我)= b
はB.
の値を添字ベクトル一世
で指定された一种
の要素に代入する一方で,一种
の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
では,y
のnumerictype
は変化しませんが,正で指定された要素の値は変化します。
功能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
の说明を参照してください。
ビット成长率を抑制するもう1つの方法は,关数accumpos
およびaccumneg
による加算および减算演算の実行です。添字を使用した代入と同様に,accumpos
およびaccumneg
では入力したFI.
オブジェクトの1つのデータ型を维持すると同时に,入力値の丸め手法とオーバーフローアクションを指定できます。
accumpos
およびaccumneg
の実装方法の詳細は,生成コードでのマルチワード処理の回避を参照してください。
固定小数点の算術演算を実行する場合は,オーバーフローの可能性と影響について検討してください。fimath
オブジェクトは,算術演算処理を実行するときに使用されるオーバーフローモードおよび丸めモードを指定します。
演算结果が表现可能な最小値または最大値を超えると,オーバーフローが発生することがあります。fimath
オブジェクトにはOverflowAction
プロパティがあり,饱和とラップという2种类の方法でオーバーフローを处理できます。OverflowAction
を饱和
に設定すると,オーバーフローは範囲の最大値または最小値に飽和されます。OverflowAction
を裹
に设定すると,オーバーフローは,符号なしの场合はモジュロ演算,符号付きの场合は2の补数を使用してラップします。
オーバーフローの検出方法の詳細は,fiprefを使用したアンダーフローとオーバーフローのログ作成を参照してください。
丸め手法を选択する场合は,コスト,バイアス,オーバーフローの可能性の有无など,さまざまな要因を考虑する必要があります.Fixed点设计™ソフトウェアは,设计の要件を満たすさまざまな丸め关数を提供します。
丸め手法 | 说明 | コスト | バイアス | オーバーフローの可能性 |
---|---|---|---|---|
CEIL. |
正の無限大方向の最も近い表現可能な数値に丸めます。 | 低 | 大きい正の数値 | あり |
收敛 |
最も近い表現可能な数値に丸めます。等距離の場合,收敛 は最も近い偶数に丸めます。このアプローチはツールボックスで提供される最もバイアスの小さい丸め手法です。 |
高 | バイアスなし | あり |
地面 |
2の補数切り捨てに等しく,負の無限大方向の最も近い表現可能な数値に丸めます。 | 低 | 大きい负の数値 | なし |
最近 |
最も近い表現可能な数値に丸めます。等距離の場合,最近 は,正の无限大方向の最も近い表现可能な数値に丸めます。これはFI. オブジェクトの作成とFI. 算術で既定の丸め手法です。 |
中 | 小さい正の数値 | あり |
轮 |
最も近い表現可能な数値に丸めます。等距離の場合,轮 メソッドは次のように丸めます。
|
高 |
|
あり |
使固定 |
ゼロ方向の最も近い表现可能な数値に丸めます。 | 低 |
|
なし |