定点知识
符号数与无符号数
符号表示
U(m,n): 无符号数,m位位宽,小数位宽为n,整数位宽为m-n
S(m,n): 有符号数,同上
动态范围
上述定点能表示为动态范围为:
U(m,n): 【0:1:2 ^m-1】x (1/2 ^n) ,即【0:1 / 2 ^n:(2 ^m-1)/(2 ^n)】
S(m,n): 【-2 ^(m-1):1:2 ^(m-1)-1】x (1/2 ^n) ,即【-2 ^(m-1)/(2 ^n):1/2 ^n:(2 ^(m-1)-1) / (2 ^n)】
数据相乘,输出位宽为多少?
以例子说明。
(1) U(3,1)x U(5,2)——> U(8,3)
即,对于无符号数,位宽为两者位宽之和,小数位位宽为两者小数位位宽之和
(2) S(3,1)x S(5,2)——> S(7,3)
即,对于有符号数,位宽为两者位宽之和 -1,小数位位宽为两者小数位位宽之和
需要注意,若两者都取所能取到的最小数,即 -2^2 x (-2 ^4) =2 ^ 6, S(7,3)无法表示2 ^6 。此种情况概率很小,但在仿真时需注意生成case验证。
数据相加,输出位宽为多少?
不包含小数位
先将两者拓展成相同位宽,输出多1位。
包含小数位
先将小数点对其,整数位拓展成相同整数位,小数位拓展成相同小数位。因此,输出为整数位多一位,小数位与最大小数位相同。
eg,U(5,2) + U(4,3) ——> U(6,3)
负数如何在十进制与二进制之间转换?
十进制——>二进制
同样以例子举例。十进制数:-128
(1)求该数绝对值,为128;
(2)若表示为位宽为8位的二进制,2^8 = 256;
(3)256-128=128,128对应的8位无符号数为10000000。
因此,-128对应的二进制为10000000。
二进制——>十进制
同样以例子举例。
二进制数:10000000
(1)该数作为无符号数,对应的十进制为128;
(2)8位位宽,2^8 = 256;
(3)用无符号数十进制128 - 256 = -128 。
注:如此算出的是补码
存在小数位如何转换?
存在小数的复数实现十进制转向二进制
以-0.5为例。大致思路如下:
首先令小数乘2^1,舍去小数位,得到-1;
按上述负数十进制转二进制的方法,若位宽为4,得到-1对应的二进制为1111;
再除以2^1,也就是将小数点左移,得到-0.5对应的二进制为S(4,1)111.1
存在小数的复数实现二进制转向十进制
同理,先将小数点右移,计算无小数位的二进制对应的十进制,再除以2^n。
移位后位宽的变化
移位不改变整体位宽,只是移动小数点,左除右乘,改变小数位宽。
S(m,n)x 2^k ——> S(m,n-k)