主要内容

执行定点算术

定点算术

加法和减法

每当添加两个固定点号时,您可能需要携带位才能正确代表结果。因此,当添加两个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对象

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.

通过指定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.对象FF指定总和的单词长度和分数长度。在默认值下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函数。

accumumos和occument.

另一种方法可以控制位增长是通过使用的accumposaccumneg执行加法和减法运算的函数。与使用下标赋值类似,accumposaccumneg保留其输入之一的数据类型fi对象允许您在输入值中指定舍入方法并溢出操作。

有关如何实施的更多信息accumposaccumneg,请参阅避免生成代码中的多字操作

溢出和四舍五入

在执行定点算法时,要考虑溢出的可能性和后果。的FIMATH.Object指定执行算术运算时使用的溢出和舍入模式。

溢出

当操作的结果超过最大可表示值时,可能会发生溢出。的FIMATH.对象有一个溢出物业提供两种处理溢出的方法:饱和和包装。如果你设置溢出饱和,溢流饱和到该范围内的最大值或最小值。如果你设置溢出包装如果unsigned,如果签名,则使用模数算术,如果unsigned或两个补充包装,则任何溢出。

有关如何检测溢出的详细信息使用fipref溢出和溢出记录

舍入

在选择四舍五入方法时,有几个因素要考虑,包括成本、偏差和是否存在溢出的可能性。定点设计师™软件提供了几种不同的舍入功能,以满足您的设计要求。

舍入方法 描述 成本 偏见 溢出的可能性
CEIL. 四舍五入到正无穷方向上最接近的可表示数。 低的 大阳性 是的
收敛 回合最接近的代表号码。在领带的情况下,收敛舍入到最近的偶数。这种方法是工具箱提供的最小偏置圆形方法。 高的 无偏见的 是的
地面 向负无穷方向舍入到最近的可表示数,相当于2的补截断。 低的 大的负面
最近的 回合最接近的代表号码。在领带的情况下,最近的在正无限度方向上舍入到最近的可代表数字。此舍入方法是默认值fi对象创建和fi算术。 缓和 小阳性 是的
圆形的 回合最接近的代表号码。在领带的情况下,圆形的方法轮:
  • 正数到正无穷方向上最接近的可表示数。

  • 负无穷方向上最接近的可表示数。

高的
  • 阴性样品小阴性

  • 对正负值均匀分布的样本不偏倚

  • 积极样品的小阳性

是的
修复 向零方向四舍五入到最接近的可表示数。 低的
  • 阴性样品大阳性

  • 对正负值均匀分布的样本不偏倚

  • 对阳性样品的大阴