执行定点算术

定点运算

加减

当您添加两个定点数字时,您可能需要一个进位来正确地表示结果。因此,当添加两个b位数字(以相同的比例)时,与使用的两个操作数相比,结果值有一个额外的位。

一个=科幻(0.234375,0,4,6);C = A +一
C = 0.4688 DataTypeMode:定点:二进制点缩放符号性:无符号字长度:5 FractionLength:6
a.bin
ans = 1111
c.bin
ans = 11110

如果加上或减去不同精度的两个数字,小数点首先需要对齐,以执行该操作。其结果是,有一个以上的位的操作和操作数的结果之间的差。

= 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®,一个内置的整数数据类型和双数据类型是整数之间的操作的结果。在这方面,科幻对象的行为像内置在MATLAB整数数据类型。

当这样做的加成科幻,双被转换为科幻的数字类型相同科幻输入。该操作的结果是一个科幻.在做乘法的时候科幻,双被转换为科幻用的相同的字长度和符号性科幻和最佳精度分数长度。该操作的结果是一个科幻.

一个= fi (pi);
a = 3.1416 DataTypeMode: Fixed-point: binary point scale signe度:Signed WordLength: 16 FractionLength: 13
B = 0.5 *一个
B = 1.5708 DataTypeMode:定点:二进制点缩放符号性:签字字长:32 FractionLength:28

当执行之间的算术科幻其中一个内置的整数数据类型,[U] INT [8,16,32],则保留该整数的字长和符号。该操作的结果是一个科幻.

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

当执行之间的算术科幻和一个逻辑数据类型,逻辑被视为无符号科幻对象,具有0或1的值,并且字长1操作的结果是一个科幻宾语。

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

该fimath对象

fimath属性定义的规则上进行算术运算科幻对象,包括数学、舍入和溢出属性。一个科幻对象可以有一个本地fimath对象,也可以使用默认fimath属性。您可以将fimath对象到科幻对象的使用setfimath.或者,你可以指定fimath在属性科幻构造器在创建。当一个科幻对象有一个地方fimath,而不是使用默认属性,的显示科幻对象显示了fimath属性。在这个例子中,一个ProductMode属性在构造函数中指定。

一个=科幻(5,1,16,4,“ProductMode”'KeepMSB'
A = 5 DataTypeMode:定点:二进制点缩放符号性:签字字长:16 FractionLength:4 RoundingMethod:最近OverflowAction:饱和和ProductMode:KeepMSB ProductWordLength:32 SumMode:FullPrecision
ProductMode财产一个被设置为KeepMSB而其余fimath属性使用默认值。

注意

有关更多信息,fimath对象,它的属性,它们的默认值,请参阅fimath对象属性.

位元成长

下表显示的位成长率科幻对象,一个,当他们的SumModeProductMode性能使用默认fimath值,FullPrecision.

一个 总和= A + B PROD = A * B
格式 网络连接(V一个,S1,W1,F1 网络连接(V,S2,W2,F2 - -
标志 小号1 小号2 小号=(小号1||小号2 小号产品=(小号1||小号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 小号+我+ F w ^1+ W2

这个例子显示了如何发生的位成长率对于循环。

T.acc= Fi([],1,32,0); T.x = fi([],1,16,0); x = cast(1:3,“喜欢”,T.x);ACC =零(1,1,“喜欢”,T.acc);对于N = 1:长度(X)ACC = ACC + X(N)结束
ACC = 1 s33,0 ACC = 3 s34,0 ACC = 6 s35,0
字长ACC与循环的每次迭代增加。这增加导致两个问题:一个是代码生成不允许在一个循环中不断变化的数据类型。另一种是,如果循环是足够长的时间,你在MATLAB运行内存不足。看到控制一些增长对于一些策略,以避免这个问题。

控制一些增长

使用fimath

通过指定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:真

科幻宾语一个有一个地方fimath宾语F.F指定的总和的字长和分数长度。在默认fimath设置,输出,C,通常具有字长9,和分数长度0。然而,因为一个有本地fimath对象,由此产生的科幻对象具有字长8和分数长度为0。

您还可以使用fimath属性控制位生长在对于循环。

F = fimath('SumMode''SpecifyPrecision''SumWordLength',32,...'SumFractionLength',0);T.acc =科幻([],1,32,0,F);T.x =科幻([],1,16,0);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。

下标赋值

另一种方法来控制的位成长率是通过下标分配。(我)= b分配的值b成的元素一个用下标向量指定一世,同时保留numerictype一个.

T.acc= Fi([],1,32,0); T.x = fi([],1,16,0); x = cast(1:3,“喜欢”,T.x);ACC =零(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

numerictypeACC保持在的每次迭代相同的对于循环。

下标赋值还可以帮助您控制函数中的位增长。的函数,cumulative_sum中,numerictypeÿ不改变,但在元素中指定的值ñ做。

功能Y = cumulative_sum(x)的%CUMULATIVE_SUM一个矢量的元素的累积和。对于向量,Y =累积量_sum(X)是一个包含%X的元素的累积和Y型的是X的类型y = 0(大小(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 DataTypeMode:定点:二进制点缩放符号性:签字字长:8 FractionLength:0

注意

有关下标分配的详细信息,请参阅subsasgn功能。

accumpos和accumneg

你可以控制的位成长率的另一种方法是使用accumposaccumneg函数来执行加法和减法运算。类似于使用下标分配,accumposaccumneg保留其输入中的一个的数据类型科幻同时允许您指定输入值的四舍五入方法,以及溢操作对象。

有关如何实现的更多信息accumposaccumneg避免多字操作中生成的代码

溢出和舍入

当执行定点运算,考虑的可能性,溢出的后果。该fimath对象指定执行算术运算时所使用的溢出和舍入模式。

溢出

当运算结果超过最大或最小可表示的数值溢出可能发生。该fimath对象有一个OverflowAction财产提供了处理溢出的方法有两种:饱和度和包裹。如果设置OverflowAction饱和,溢出饱和到该范围内的最大或最小值。如果设置OverflowAction包裹任何溢出采用模运算包,如果未签名,或补换行,如果签署。

有关如何检测溢出的详细信息,请参阅下溢和溢出时记录使用fipref.

四舍五入

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

舍入方法 描述 成本 偏压 溢出的可能性
小区 大红大紫到正无穷大的方向最接近的可表示数。 大正
会聚的 舍入到最接近的可表示数。在平局的情形中,会聚的四舍五入到最接近的偶数。此方法是工具箱提供的最小偏差舍入方法。 不偏不倚
地板 舍入到负无穷大的方向最接近的可表示数,相当于补截断。 大的负 没有
最近的 舍入到最接近的可表示数。在平局的情形中,最近的在正无穷方向上舍入到最接近可表示数。此舍入方法是默认的科幻对象的创建和科幻算术。 温和的 小阳
舍入到最接近的可表示数。在平局的情形中,所述方法回合:
  • 正数到正无穷大的方向最接近的可表示数。

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

  • 小负对负样本

  • 无偏的有均匀分布的正值和负值样本

  • 小阳的阳性样品

固定 舍入到在零方向最接近的表示数。
  • 为阴性样品大的正

  • 无偏的有均匀分布的正值和负值样本

  • 大的负阳性标本

没有