定点数
定点数:小数点的位置是确定的。
例如:定点数运算 1.1 * 1.1 = 1.2,小数点的位置没有变化。
定点的意思是,小数点固定在 32 位中的某个位置,前面的是整数,后面的是小数。
例子:以2.1为例,数据位宽24,小数点固定在从LSB->MSB第12位(fraction=12bit),2.1的Q12(12位)型定点小数为:2.1*2^12=8601.6
,由于这个数要用整数储存, 所以是8601即 0x2199,0b0010000110011001。因为舍弃了小数部分,所以0x2199不是精确的2.1,实际上它是8601/2^12 =2.099853515625
浮点数
浮点数:小数点位置是漂浮不定的。
例如:浮点数运算 1.1 * 1.1 = 1.21,小数点位置发生了变化。
IEEE 754 规定,浮点数的表示方法为:
最高的 1 位是符号位 s,接着的 8 位是指数E,剩下的 23 位为有效数字 M。
浮点数定点化
两个 16 位的浮点数运算,最高位是符号位: 2.918 * 3.1415926 = 9.1671672068,尝试将浮点数进行定点化。
- 定点转换(Qn=12)
符号1位,整数取3位(实际2位就够),小数12位,可以看成把 1 分成了 212份,因此:
2.918 * 212 = 11952.168 = 11952;
3.1415926 * 212 = 12867.8632896 = 12868; - 定点数相乘
11952 * 12868 = 153798336。 - 结果还原
相乘后,整数部分为 6 位,小数部分为 24 位。因此结果 = 153798336 / 2^24 = 9.167095184326171875,和原计算值差距非常小。 - 量化误差和量化精度
小数点的位置不同带来的量化误差不同,例如上面定点转换的过程中出现的小数点进行了四舍五入,这是因为 2.918 无法完全用 1/212来表示。小数位数越多,表示的量化精度越高,小数位为 Qn,最大量化精度为 1/2n。 - 无损定点化
所谓【无损定点化】只是数学概念,只要量化误差小于精度的一半,就认为是“无损”的。按照这个标准,那对小数点采取四舍五入的结果必然是无损的。但是校招时很多题采取的是“量化后直接去除小数”,那么小数大于 0.5 则不是无损的了。
浮点数乘法运算
链接:https://blog.51cto.com/u_14457/8573195
一般浮点数表示为(符号位,总位宽,小数位)
例如:(1,16,12)表示1bit符号位,16bit数据位宽,12bit小数位,3bit整数位;精度为1/2^12;
**加减法:**与普通二进制运算相同;
乘法:浮点转定点,再进行运算;
例如:(0,48,18)*(0,28,0)=(0,76,18);最终格式是对应位相加;若两个有符号数的乘法(1,16,11)*(1,16,14)=(1,31,25);取其中一个数的符号位,剩下总位宽15+16=31;小数位相加
浮点数定点化总结:
若小数点后有n位,如0.00002048小数点后面8位,定点化几位小数呢?
log2(0.00000001)=-26.5754
①定点化为26bit,绝对误差abs(0.00002048-2^-26)/0.00002048=0.9993
②定点化为27bit,绝对误差abs(0.00002048-2^-27)/0.00002048=0.99996
可以满足要求
例题
参考博客:https://www.cnblogs.com/will-w/p/15221939.html