执行定点算术
定点算术
加法和减法
当你添加两个定点数,你可能需要一个进位位正确表示结果。由于这个原因,当添加两个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
和双
,双是一个演员fi
numerictype一样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
,当他们的SumMode
和ProductMode
使用默认的属性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
对象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([],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
的numerictype
的acc
在每个迭代的是相同的为
循环。
下标赋值也可以帮助你控制增长的一个函数。的函数,cumulative_sum
,numerictype
的y
不会改变,但指定的元素的值吗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
函数。
accumpos
和accumneg
你可以控制一些增长的另一个方法是使用accumpos
和accumneg
函数执行加法和减法操作。类似于使用下标赋值,accumpos
和accumneg
保存的数据类型的输入fi
对象,同时允许您指定一个舍入方法,输入值和溢出的行动。
有关如何实现的更多信息accumpos
和accumneg
,请参阅避免多字操作生成的代码
溢出和舍入
当执行定点运算,考虑溢出的可能性和后果。的fimath
对象指定溢出和舍入模式执行算术运算时使用。
溢出
溢出可能发生当一个操作的结果超过最大或最小可表示的值。的fimath
对象有一个OverflowAction
财产提供了两种方法处理溢出:饱和度和包装。如果你设置OverflowAction
来饱和
溢出是饱和,最大值或最小值的范围。如果你设置OverflowAction
来包装
,任何溢出包装使用模运算,如果无符号,或二进制补码包装,如果签署。
如何检测溢流看到更多的信息使用fipref下溢和溢出日志。
舍入
有几个因素时要考虑选择一个舍入方法,包括成本,偏见,和是否有可能溢出。定点设计师™软件提供了几种不同的舍入函数来满足设计的要求。
舍入方法 | 描述 | 成本 | 偏见 | 溢出的可能性 |
---|---|---|---|---|
装天花板 |
轮的方向最接近可表示的数字正无穷。 | 低 | 大的积极 | 是的 |
收敛 |
最近的可表示的数字。的领带,收敛 到最近的偶数。这种方法是least-biased舍入方法提供的工具箱。 |
高 | 无偏见的 | 是的 |
地板上 |
轮的方向最接近可表示的数字负无穷,相当于二进制补码截断。 | 低 | 大的负面 | 没有 |
最近的 |
最近的可表示的数字。的领带,最近的 轮的方向最接近可表示的数字正无穷。这舍入方法是默认的fi 对象创建和fi 算术。 |
温和的 | 小正 | 是的 |
轮 |
最近的可表示的数字。在领带的情况下,
|
高 |
|
是的 |
修复 |
轮的方向最接近可表示的数字零。 | 低 |
|
没有 |