一种小数表示方法

1、浮点数:小数点位置是漂浮不定的。

例如:浮点数运算 1.1 * 1.1 = 1.21,小数点位置发生了变化。
在这里插入图片描述
IEEE 754 规定,浮点数的表示方法为:

在这里插入图片描述

最高的 1 位是符号位 s,接着的 8 位是指数E,剩下的 23 位为有效数字 M。

**2、定点数:**小数点的位置是确定的。

例如:定点数运算 1.1 * 1.1 = 1.2,小数点的位置没有变化。
在这里插入图片描述

定点的意思是,小数点固定在 32 位中的某个位置,前面的是整数,后面的是小数。

小数点具体固定在哪里,可以自己在程序中指定。

以下针对浮点数的定点化进行讨论:

小数例子 : 2.918 12.918 3.1415926

转成定点数要定义小数需求多少位,整数需求多少位

例:16位的定点数(MAX:16’d32767 MIN:-32768)
3位整数位宽,12位的小数位,最高位的符号位
取低15位,其中第14,13,12位最大能表示7,
小数最大12位能表示的最大精度:1/4096=0.000244140625
(0.000244140625*4095 = 0.999755859375)
极限最大值表示:7.999755859375

说明:
判断能否用12位精度表示(即:无损失定点化),看能否除尽:
比如:12.918
3位整数位宽最大只能表示7 所以整数12需要4位位宽
小数部分0.918 判断:0.918/0.000244140625 = 3760.128 所以12位小数位能表示0.918

例:2.918进行定点化的过程:
8/32768 = 0.000244140625(最大精度),
这里是因为16位的定点数,3位整数位宽,12位的小数位,最高位的符号位。所能表示的最大绝对值是-8所对应的,而16bit所能表示的最大绝对值是-32768所对应的,所以16bit的最大精度为8/32768.也可以用7.999755859375/32767
更简单的,因为小数位宽为12bit,所以精度为1/2^12=0.000244140625(最大精度)

2.918/0.000244140625 = 11952.128 四舍五入的量化形式最终取11952, 表示2.918定点后的值
也可以直接2.918x2^12=11952.128
量化误差为:11952*0.000244140625=2.91796875,2.918-2.91796875=0.00003125

例:3.1415926进行定点化
3.1415926/(8/32768) ~=12,867.9632896,四舍五入取12868
12868转化为浮点数: 16’d12868 = 16’b0011 0010 0100 0100
其中: 整数部分表示 011 = 3 小数部分表示 0010 0100 0100 = 580
(10进制数580需要转换成小数:580/4096=0.1416015625)
量化误差:
12868-12,867.9632896=0.0367104;0.0367104/2^12=0.0000089625
或者:3.1415926-12868*(1/2^12)=-0.0000089625,量化误差0.0000089625

无损量化:
所谓【无损定点化】只是数学概念,只要量化误差小于精度的一半,就认为是“无损”的。按照这个标准,那对小数点采取四舍五入的结果必然是无损的。但是校招时很多题采取的是“量化后直接去除小数”,那么小数大于 0.5 则不是无损的了。
对12.918进行无损量化,要保留小数点后四位,就是比0.001多一位,同样,二进制的2^-8是0.00390625,它是0.008的1/2,也就是说在二进制中它能精确到0.008的后一位,也就是可以做到无损量化了。

总结:
1.定义位宽
2.表示出最大最小值
3.定点化过程

浮点数的乘法表示(注意相乘后位宽变化):
例:2.9183.1415926 ~= 1195212868
浮点结果 : 2.9183.1415926 = 9.1671672068
定点结果 : 11952
12868 = 153798336 ~= 9.167095184326171875
‭‬
153798336 = 0000 1001 0010 1010 1100 0110 1100 0000‬
整数部分表示: 001001 = 9
小数部分表示: ‭2803392‬/(2^24) = 0.167095184326171875‬

例:正数的定点化
5bit的正数位,8bit的小数位
11.11111定点数的结果
很简单因为8bit的小数位,所以最大精度为1/2^8=0.00390625
11.11111/0.00390625=2844.44416,所以2844即为11.11111的定点化表示形式,
量化误差
2844=0_1011_0001_1100,5bit 0_1011表示整数部分11,8bit 0001_1100表示小数部分0.11111

定点数相乘
定点转换(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 / 224 = 9.167095184326171875,和原计算值差距非常小。

一种浮点数表示方法

(是否有符号数,总位宽,小数部分位宽)
小数部分位宽是指小数部分量化精度

举例:
(0,8,6):8’b0100_0010 :表示无符号数,8-0-6=2,2bit表示整数位,6bit表示小数位:1+2*(1/2^6)=1.03125; 反过来,1.03125* 2的6次方 = 8’b0100_0010;
(1,9,3):9’b1_1110_0101表示有符号数,最高位是符号位,9-1-3=5,次5bit是整数位,剩下3bit是
小数位:-(28+5*(1/2^3))= -28.625
比如说两个(1,9,3)的数参与运算:
-28.625:9’b1_1110_0101 ; -3.125:9‘b1_0001_1001
符号位不参与运算:
9’b1_1110_0101 + 9‘b1_0001_1001 = 10’b10_1111_1110
10’b10_1111_1110 是(1,10,3)的数,即:-(31+6/2^3)= -31.75

(1,6,8):此种情况较为特殊,小数部分位宽精度大于整个数据位宽,此时除去最高位符号位剩余的所有bit都表示小数部分。这是因为某些情况下,小数精度达到小数点后8bit但是,有效位只保留6bit,这样做是为了节省资源,再数据在参与运算时,可以降低加法器/乘法器等运算位宽或者说寄存器等。
如:10_0111 表示有符号数,-(7*(1/(2^8)))=-0.02734375

此处负数不是补码???

另外浮点数量化方法有:
低位截位,高位截位,饱和截位(大于某阈值取最大值,小于某阈值取最小值),四舍五入,向下取整,向上取整 等

为什么需要补码?

都是因为“0”这个特殊数字的存在。

先问你一个问题:0是正数还是负数?你肯定会说:0既不是正数也不是负数,这是我们初中学到的数学知识。这个回答没有问题,所以以后每次碰到0,人们都不会把它当正数或负数。

那么计算机呢?计算机不同于人脑,计算机在碰到任何数字之前只根据最高位的符号位来判断正负性,“0”表示正数,“1”表示负数。

前面我们推论了为何要用反码,那么用8位二进制反码表示的正数范围: +0 —— +127;负数范围: -127 —— -0。但是,其中有两个特殊的编码会出现:

[0_0000000]=+0 (反码)

[1_1111111]=-0 (反码)

其实,+0和-0代表的都是0。这样一来,“0”这个数字在计算机中的编码就不是唯一的了。对于计算机来说,这是绝对不行的,因为任何数字都只能有1个编码。

于是,聪明的人就做了这样一个决定:把0当成正数,也即+0,这样0的编码就变成:0_0000000。那8位二进制表示的正数范围仍然是: +0 —— +127。

但是,对于负数就必须要做调整,也即-0必须要让位—1_1111111这个编码不能表示-0。我们可以把负数整体向后“挪动1位”:只要将8位二进制表示的负数范围从:-127 —— -0变成:-128 —— -1,就能成功解决问题。

那么怎么整体挪动1位呢?方法就是反码+1。{1_1111111}编码就不再表示-0,而变成了-1。顺着推,最小的编码{1_0000000}就是-128。

我们给这个反码+1又人为的取了一个新的名字,叫补码。于是乎,补码的定义如下:

1.正数的补码保持原码不变:3={0_0000011}

2.负数先求反码,然后再加1:-5=[1_1111010]+1={1_1111011}

于是3+{-5}={-2}的计算过程为:

{0_0000011}+{1_1111011}={11111110}

至此,通过补码就成功解决了数字0在计算机中非唯一编码的问题,且也能实现减法变加法。

所以,在计算机的世界里,0是正数。这点和我们学的数学不一样。

{0_1111111}=+127 (补码)

{0_0000000}=+0 (补码)

{1_1111111}=-1 (补码)

{1_0000000}=-128 (补码)

在Verilog中,可以使用定点小数表示小数。定点小数一种固定小数点位置的表示方法,有两种常用的表示方法:Q表示法和S表示法。 Q表示法中,Qn表示低n位为小数,其余位为符号位和整数位。例如,Q8.8表示8位小数和8位整数。这种表示方法可以用于表示范围较大的小数。 S表示法中,Sn中低(15-n)位为小数,其余位为符号位和整数位。例如,S7.8表示7位小数和8位整数。这种表示方法可以用于表示范围较小但精度较高的小数。 在使用XILINX VIVADO中的IP核时,通常使用Q表示表示小数。 需要注意的是,在Verilog中使用定点小数进行计算时,可能会存在精度误差。例如,如果0.2乘以26等于12.8,在Verilog中会使用12进行计算,误差范围为0.8/12.8 = 0.0625。为了减小误差范围,可以增大定点小数的倍数,但不需要过度增加放大倍数。根据实际情况,在合理的误差范围内选择适当的定点小数表示方法即可。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [Verilog表示小数-定点小数](https://blog.csdn.net/SLAM_masterFei/article/details/103279004)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [verilog中的定点数、浮点数、定点小数、定点整数的表示及运算](https://blog.csdn.net/woshiyuzhoushizhe/article/details/105920861)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [verilog的小数问题](https://blog.csdn.net/zhangyanhe/article/details/50804815)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值