每当添加两个固定点号时,您可能需要携带位才能正确代表结果。因此,当添加两个B位数(具有相同的缩放)时,与所使用的两个操作数相比,结果值具有额外的比特。
a = fi(0.234375,0,4,6);c = a + a
C = 0.4688数据码:固定点:二进制点缩放签名:无符号WordLength:5 FractionLength:6
a.bin
ans = 1111.
C.BIN.
ANS = 11110.
如果您添加或减去具有不同精度的两个数字,则需要对齐进行基数以执行操作。结果是,操作和操作数的结果之间存在多于一位的差异。
a = fi(pi,1,16,13);B = FI(0.1,1,12,14);c = a + b
C = 3.2416数据表:定点:二进制点缩放签名:签名WordLength:18 FractionLength:14
通常,完整的精度产品需要单词长度等于操作数的单词长度之和。在以下示例中,请注意产品的单词长度c
等于单词的长度一个
加上单词的长度b
.分数长度c
也等于分数长度一个
加上分数长度b
.
a = fi(pi,1,20),b = fi(exp(1),1,16)
a = 3.1416 DataTypeMode: Fixed-point: binary point scaling Signed: Signed WordLength: 20 FractionLength: 17 b = 2.7183 DataTypeMode: Fixed-point: binary point scaling Signed: WordLength: 16 FractionLength: 13
c = a * b
C = 8.5397数据否示:固定点:二进制点缩放签名:签名WordLength:36 FractionLength:30
注意,在C中,整数数据类型和双数据类型之间的操作的结果促使到双倍。但是,在Matlab®,内置整数数据类型和双精度数据类型之间的操作的结果是整数。在这方面fi
对象的行为类似于Matlab中的内置整数数据类型。
当做加法时fi
和双倍的
时,double类型被转换为afi
与同样的数字一样fi
输入。手术的结果是fi
.在做乘法时fi
和双倍的
时,double类型被转换为afi
具有相同的单词长度和签名fi
,最佳精密分数长度。手术的结果是fi
.
a = fi(pi);
A = 3.1416数据表:定点:二进制点缩放签名:签名WordLength:16 FractionLength:13
B = 0.5 * a
B = 1.5708数据否示:固定点:二进制点缩放签名:签名WordLength:32 FractionLength:28
在a之间做算术fi
还有一个内置整数数据类型,(u) int[8、16、32)
,保留整数的字长和签名性。手术的结果是fi
.
a = fi(pi);b = int8(2)* a
B = 6.2832数据表:固定点:二进制点缩放签名:签名WordLength:24 FractionLength:13
在a之间做算术fi
而逻辑数据类型,逻辑被视为无符号fi
对象,值为0或1,字长为1。手术的结果是fi
目的。
a = fi(pi);B =逻辑(1);c = a * b
c = 3.1416 DataTypeMode:定点:二进制点缩放Signed: Signed WordLength: 17 FractionLength: 13
FIMATH.
属性定义执行算术运算的规则fi
对象,包括数学,舍入和溢出属性。一个fi
对象可以有一个本地FIMATH.
对象,或它可以使用默认值FIMATH.
特性。你可以附上一个FIMATH.
对象一个fi
通过使用setfimath.
.或者,您可以指定FIMATH.
物业在fi
构造函数在创建。当一个fi
对象具有一个局部FIMATH.
属性的显示,而不是使用默认属性fi
对象显示FIMATH.
特性。在这个例子中,一个
有ProductMode.
在构造函数中指定的。
一个= fi(5、1、16 4'ProductMode',“KeepMSB”)
a = 5数据款:filed point:二进制点缩放符号:签名字数:16 fractionlength:4 roundingmethod:最近的溢出:饱和产品显示器:LeveMSB ProductWordLength:32序列:FultPrecision
ProductMode.
的属性一个
设定为KeepMSB
而剩下的FIMATH.
属性使用默认值。
请注意
有关的更多信息FIMATH.
对象、其属性及其默认值,请参见FIMATH对象属性.
下表显示了比特的增长fi
对象,一个
和B
,当他们的笑声
和ProductMode.
属性使用默认值FIMATH.
价值,全权
.
一个 | B | 和= A + B | 刺激= A * B | |
---|---|---|---|---|
格式 | FI(V.一个,S.1,W.1,F1) |
FI(V.B,S.2,W.2,F2) |
- - - - - - | - - - - - - |
符号 | 年代1 |
年代2 |
年代和 = (年代1 ||年代2 ) |
年代产品 = (年代1 ||年代2 ) |
整数位 | 我1= W.1-F1-1 |
我2= W.2-F2-2 |
我和= max(w1-F1,W.2-F2) + 1 - s和 |
我产品= (w1+ W.2) - (f1+ F.2) |
分数位 | f1 |
f2 |
F和= max (f1, F2) |
F产品= F.1+ F.2 |
总位 | w1 |
w2 |
年代和+ I.和+ F.和 |
w1+ W.2 |
这个例子展示了在为
-环形。
t.acc = fi([],1,32,0);T.x = fi(0)[], 16日;x =投(1:3,'喜欢', T.x);acc = 0 (1, 1,'喜欢',t.acc);为N = 1:length(x) acc = + x(N)结束
ACC = 1 S33,0 ACC = 3 S34,0 ACC = 6 S35,0
acc
随着循环的每次迭代而增加。这种增长导致了两个问题:一个是代码生成不允许在循环中更改数据类型。另一种情况是,如果循环足够长,您将在MATLAB中耗尽内存。看到控制位生长有一些浪费避免这个问题。
通过指定FIMATH.
的属性fi
对象,您可以在对象上执行操作时控制位的增长。
f = fimath(“SumMode”,“SpecifyPrecision”,'sumwordlength',8,......'sumfractionlength', 0);a = fi(8,8,0, F);B = fi(3,1, 8, 0);c = a + b
c = 11 DataTypeMode:定点:二进制点缩放Signed: Signed WordLength: 8 FractionLength: 0 RoundingMethod: Nearest OverflowAction: Saturate ProductMode: FullPrecision SumMode: speciyprecision SumWordLength: 8 SumFractionLength: 0 CastBeforeSum: true
的fi
对象一个
有一个地方FIMATH.
对象F
.F
指定总和的单词长度和分数长度。在默认值下FIMATH.
设置,输出,c
,通常具有字长9,并且分数长为0.然而因为一个
有一个地方FIMATH.
对象,由此产生fi
对象有单词长度8和分数长度0。
你也可以使用FIMATH.
控制位增长的特性为
-环形。
f = fimath(“SumMode”,“SpecifyPrecision”,'sumwordlength',32,......'sumfractionlength', 0);T.acc = fi ([], 1 32 0 F);T.x = fi(0)[], 16日;x =投(1:3,'喜欢', T.x);acc = 0 (1, 1,'喜欢',t.acc);为N = 1:length(x) acc = + x(N)结束
Acc = 1 s32,0 Acc = 3 s32,0 Acc = 6 s32,0
与...不同T.acc.
正在使用默认值FIMATH.
性质,比特增长acc
现在是受限制的。因此,单词长度的acc
保持在32。
控制位增长的另一种方法是使用下标作业。a(i)= b
赋值b
进入的元素一个
由下标向量表示,我
,同时保留numerictype.
的一个
.
t.acc = fi([],1,32,0);T.x = fi(0)[], 16日;x =投(1:3,'喜欢', T.x);acc = 0 (1, 1,'喜欢',t.acc);%分配给ACC而不改变其类型为n = 1:长度(x)ACC(:) = ACC + X(n)结束
ACC(:) = ACC + X(n)指示下标矢量的值,(:)
, 改变。然而numerictype.
输出acc
是相同的。因为acc
是一个标量,如果您使用,也会收到相同的输出(1)
作为下标矢量。
为n = 1:numel(x)ACC(1)= ACC + X(n);结束
Acc = 1 s32,0 Acc = 3 s32,0 Acc = 6 s32,0
的numerictype.
的acc
每次迭代都保持不变为
-环形。
下标作业还可以帮助您控制函数中的比特增长。在功能中,累积_sum.
,numerictype.
的y
不会更改,但要指定的元素中的值n做的。
功能y =累积_sum(x)%uculative_sum矢量的累积元素和。%vectors%v%,y = cumulative_sum(x)是包含的矢量x的元素的%累积和.Y的类型是X的类型。y =零(尺寸(x),'喜欢',X);Y(1)= x(1);为n = 2:长度(x)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 55 55 55 55 DataTypeMode:FIRED POINT:二进制点缩放签名:签名WordLength:8 FractionLength:0
请注意
有关下标作业的更多信息,请参阅subsasgn
函数。
另一种方法可以控制位增长是通过使用的accumpos
和accumneg
执行加法和减法运算的函数。与使用下标赋值类似,accumpos
和accumneg
保留其输入之一的数据类型fi
对象允许您在输入值中指定舍入方法并溢出操作。
有关如何实施的更多信息accumpos
和accumneg
,请参阅避免生成代码中的多字操作
在执行定点算法时,要考虑溢出的可能性和后果。的FIMATH.
Object指定执行算术运算时使用的溢出和舍入模式。
当操作的结果超过最大可表示值时,可能会发生溢出。的FIMATH.
对象有一个溢出
物业提供两种处理溢出的方法:饱和和包装。如果你设置溢出
至饱和
,溢流饱和到该范围内的最大值或最小值。如果你设置溢出
至包装
如果unsigned,如果签名,则使用模数算术,如果unsigned或两个补充包装,则任何溢出。
有关如何检测溢出的详细信息使用fipref溢出和溢出记录.
在选择四舍五入方法时,有几个因素要考虑,包括成本、偏差和是否存在溢出的可能性。定点设计师™软件提供了几种不同的舍入功能,以满足您的设计要求。
舍入方法 | 描述 | 成本 | 偏见 | 溢出的可能性 |
---|---|---|---|---|
CEIL. |
四舍五入到正无穷方向上最接近的可表示数。 | 低的 | 大阳性 | 是的 |
收敛 |
回合最接近的代表号码。在领带的情况下,收敛 舍入到最近的偶数。这种方法是工具箱提供的最小偏置圆形方法。 |
高的 | 无偏见的 | 是的 |
地面 |
向负无穷方向舍入到最近的可表示数,相当于2的补截断。 | 低的 | 大的负面 | 不 |
最近的 |
回合最接近的代表号码。在领带的情况下,最近的 在正无限度方向上舍入到最近的可代表数字。此舍入方法是默认值fi 对象创建和fi 算术。 |
缓和 | 小阳性 | 是的 |
圆形的 |
回合最接近的代表号码。在领带的情况下,圆形的 方法轮:
|
高的 |
|
是的 |
修复 |
向零方向四舍五入到最接近的可表示数。 | 低的 |
|
不 |