主要内容

执行定点算术

定点算术

加法和减法

当你添加两个定点数,你可能需要一个进位位正确表示结果。由于这个原因,当添加两个B-bit数(以相同的比例),结果值相比有一个额外的位所使用的两个操作数。

= fi (0.234375, 0, 4, 6);c = a +
c = 0.4688 DataTypeMode:定点:二进制扩展Signedness:无符号字: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:定点:二进制扩展Signedness:签了字:18 FractionLength: 14

乘法

一般来说,一个完整的精密产品需要一个单词长度等于操作数的单词长度的总和。在接下来的例子中,注意产品的单词长度c等于这个词的长度一个加的字长b。的部分长度c也等于分数的长度吗一个+的分数长度b

一个= fi(π,1,20),b = fi (exp (1), 1, 16)
= 3.1416 DataTypeMode:定点:二进制扩展Signedness:签了字:20 FractionLength: 17 b = 2.7183 DataTypeMode:定点:二进制扩展Signedness:签了字:16 FractionLength: 13
c = a * b
c = 8.5397 DataTypeMode:定点:二进制扩展Signedness:签了字:36 FractionLength: 30

数学与其他内建数据类型

注意,在C语言中,一个操作的结果之间的一个整数数据类型和两个数据类型促进双。然而,在MATLAB®之间的一个操作,结果一个内置整数数据类型和数据类型是整数的两倍。在这方面,fi对象在MATLAB像内置的整数数据类型。

在做加法fi,双是一个演员finumerictype一样fi输入。操作的结果fi。在做乘法之间fi,双是一个演员fi同一个词的长度和signednessfi和最佳精度部分长度。操作的结果fi

一个= fi (pi);
= 3.1416 DataTypeMode:定点:二进制扩展Signedness:签了字:16 FractionLength: 13
b = 0.5 *
b = 1.5708 DataTypeMode:定点:二进制扩展Signedness:签了字:32 FractionLength: 28

在做算术之间fi的一个内置整数数据类型,(u) int [8、16、32)这个词的长度和signedness整数保存。操作的结果fi

一个= fi (pi);b = int8 (2) *
b = 6.2832 DataTypeMode:定点:二进制扩展Signedness:签了字:24 FractionLength: 13

在做算术之间fi和逻辑数据类型,逻辑被视为一个无符号fi对象的值为0或1,字长1。操作的结果fi对象。

一个= fi (pi);b =逻辑(1);c = a * b
c = 3.1416 DataTypeMode:定点:二进制扩展Signedness:签了字: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”)
= 5 DataTypeMode:定点:二进制扩展Signedness:签了字:16 FractionLength: 4 RoundingMethod:最近OverflowAction:饱和ProductMode: KeepMSB ProductWordLength: 32 SumMode: FullPrecision
ProductMode的属性一个被设置为KeepMSB而剩下的fimath属性使用默认值。

请注意

更多的信息fimath对象,它的属性,其默认值fimath对象属性

一些增长

下面的表显示了增长fi对象,一个B,当他们的SumModeProductMode使用默认的属性fimath值,FullPrecision

一个 B 和= A + B 刺激= A * B
格式 fi (v一个,年代1w1f1) fi (vB,年代2w2f2) - - - - - - - - - - - -
标志 年代1 年代2 年代总和= (年代1| |年代2) 年代产品= (年代1| |年代2)
整数位 1= w1- f1- s1 2= w2- f2- s2 总和= max (w1- f1w2- f2)+ 1总和 产品= (w1+ w2)- (f1+ f2)
分数位 f1 f2 F总和= max (f1f2) F产品= f1+ f2
总比特 w1 w2 年代总和+我总和+ F总和 w1+ w2

这个例子展示了如何增长可以发生在一个循环。

T.acc= fi([],1,32,0); T.x = fi([],1,16,0); x = cast(1:3,“喜欢”,T.x);acc = 0 (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的属性fi对象,您可以控制一些增长的对象上执行操作。

F = fimath (“SumMode”,“SpecifyPrecision”,“SumWordLength”8“SumFractionLength”,0);一个= fi (8 1 8 0 F);b = fi (3、1、8,0);c = a + b
c = 11 DataTypeMode:定点:二进制扩展Signedness:签了字:8 FractionLength: 0 RoundingMethod:最近OverflowAction:饱和ProductMode: FullPrecision SumMode: SpecifyPrecision SumWordLength: 8 SumFractionLength: 0 CastBeforeSum:真的

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([],1,16,0); x = cast(1:3,“喜欢”,T.x);acc = 0 (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 = 0 (1, 1,“喜欢”,T.acc);%分配acc不改变它的类型n = 1:长度(x) acc (:) = acc + x (n)结束

acc (:) = acc + x (n)规定的值在下标向量,(:),改变。然而,numerictype的输出acc是相同的。因为acc是一个标量,你也收到相同的输出,如果你使用(1)下标向量。

n = 1:元素个数(x) acc (1) = acc + x (n);结束
acc = 1 s32, 0 acc = 3 s32, 0 acc = 6 s32, 0

numerictypeacc在每个迭代的是相同的循环。

下标赋值也可以帮助你控制增长的一个函数。的函数,cumulative_sum,numerictypey不会改变,但指定的元素的值吗n做的。

函数y = cumulative_sum (x)% CUMULATIVE_SUM累积的和一个向量的元素。%%为向量,Y = cumulative_sum (X)是一个向量包含%累计之和的元素X Y = X的类型的类型。y = 0(大小(x),“喜欢”,x);y = x (1) (1);n = 2:长度(x) (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:定点:二进制扩展Signedness:签了字:8 FractionLength: 0

请注意

有关下标赋值的更多信息,请参阅subsasgn函数。

accumposaccumneg

你可以控制一些增长的另一个方法是使用accumposaccumneg函数执行加法和减法操作。类似于使用下标赋值,accumposaccumneg保存的数据类型的输入fi对象,同时允许您指定一个舍入方法,输入值和溢出的行动。

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

溢出和舍入

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

溢出

溢出可能发生当一个操作的结果超过最大或最小可表示的值。的fimath对象有一个OverflowAction财产提供了两种方法处理溢出:饱和度和包装。如果你设置OverflowAction饱和溢出是饱和,最大值或最小值的范围。如果你设置OverflowAction包装,任何溢出包装使用模运算,如果无符号,或二进制补码包装,如果签署。

如何检测溢流看到更多的信息使用fipref下溢和溢出日志

舍入

有几个因素时要考虑选择一个舍入方法,包括成本,偏见,和是否有可能溢出。定点设计师™软件提供了几种不同的舍入函数来满足设计的要求。

舍入方法 描述 成本 偏见 溢出的可能性
装天花板 轮的方向最接近可表示的数字正无穷。 大的积极 是的
收敛 最近的可表示的数字。的领带,收敛到最近的偶数。这种方法是least-biased舍入方法提供的工具箱。 无偏见的 是的
地板上 轮的方向最接近可表示的数字负无穷,相当于二进制补码截断。 大的负面 没有
最近的 最近的可表示的数字。的领带,最近的轮的方向最接近可表示的数字正无穷。这舍入方法是默认的fi对象创建和fi算术。 温和的 小正 是的

最近的可表示的数字。在领带的情况下,方法轮:

  • 积极的数字最接近可表示的数量的方向正无穷。

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

  • 小负负样本

  • 无偏的样品均匀分布的正面和负面的价值

  • 小阳性阳性样本

是的
修复 轮的方向最接近可表示的数字零。
  • 大的正,负样本

  • 无偏的样品均匀分布的正面和负面的价值

  • 大负为正样本

没有