当您添加两个定点数字时,您可能需要一个进位来正确地表示结果。因此,当添加两个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
对象到科幻
对象的使用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对象属性.
下表显示的位成长率科幻
对象,一个
和乙
,当他们的SumMode
和ProductMode
性能使用默认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
一个属性科幻
对象,你可以作为操作对象上进行控制位增长。
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
该numerictype
的ACC
保持在的每次迭代相同的对于
循环。
下标赋值还可以帮助您控制函数中的位增长。的函数,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
函数来执行加法和减法运算。类似于使用下标分配,accumpos
和accumneg
保留其输入中的一个的数据类型科幻
同时允许您指定输入值的四舍五入方法,以及溢操作对象。
有关如何实现的更多信息accumpos
和accumneg
见避免多字操作中生成的代码
当执行定点运算,考虑的可能性,溢出的后果。该fimath
对象指定执行算术运算时所使用的溢出和舍入模式。
当运算结果超过最大或最小可表示的数值溢出可能发生。该fimath
对象有一个OverflowAction
财产提供了处理溢出的方法有两种:饱和度和包裹。如果设置OverflowAction
至饱和
,溢出饱和到该范围内的最大或最小值。如果设置OverflowAction
至包裹
任何溢出采用模运算包,如果未签名,或补换行,如果签署。
有关如何检测溢出的详细信息,请参阅下溢和溢出时记录使用fipref.
有几个因素在选择时,四舍五入方法,包括成本,偏差,是否有溢出的可能性来考虑。定点设计师™软件提供了几种不同的舍入功能,以满足您的要求设计。
舍入方法 | 描述 | 成本 | 偏压 | 溢出的可能性 |
---|---|---|---|---|
小区 |
大红大紫到正无穷大的方向最接近的可表示数。 | 低 | 大正 | 是 |
会聚的 |
舍入到最接近的可表示数。在平局的情形中,会聚的 四舍五入到最接近的偶数。此方法是工具箱提供的最小偏差舍入方法。 |
高 | 不偏不倚 | 是 |
地板 |
舍入到负无穷大的方向最接近的可表示数,相当于补截断。 | 低 | 大的负 | 没有 |
最近的 |
舍入到最接近的可表示数。在平局的情形中,最近的 在正无穷方向上舍入到最接近可表示数。此舍入方法是默认的科幻 对象的创建和科幻 算术。 |
温和的 | 小阳 | 是 |
轮 |
舍入到最接近的可表示数。在平局的情形中,所述轮 方法回合:
|
高 |
|
是 |
固定 |
舍入到在零方向最接近的表示数。 | 低 |
|
没有 |