又看了一次“浮点数的表示”

概述

从读书到工作,关于“浮点数的表示”的内容,从不同的书籍/网页里都看过好几次了。当时看时可能觉得理解了,但时间一久,有些内容似乎又记不住了。一方面,可能大多数情况下无需了解;另一方面,可能是因为有些细节没有完全理解或没有注意。借着之前又看了一次“浮点数的表示”的内容,将相关的一些理解和总结记录一下。

IEEE 754

具体的内容可以查看参考资料,书里讲得非常好。这里简单列出几点:

  • 浮点数使用科学计数法的方式来表示小数。3个部分:符号位,指数(或叫阶码,这里统一叫指数),底数(或叫尾数,这里统一叫底数);
  • 3种模式。规格化模式(指数部分不为全0和不为全1),非规格化模式(指数部分为全0),特殊值模式(指数部分为全1);
  • 指数的编码。指数部分使用偏置(Biased)编码(一种有符号数的编码方式:有符号数的数值=无符号数的数值-Biased)。规格化模式时,Biased=2^(k-1)-1;非规格化模式时,Biased=2^(k-1)-2。指数为无符号的数值-Biased;
  • 底数的编码。规格化模式时,底数为1.xxxx…xxxx(小数点前的1不需要存储);非规格化模式时,底数为0.xxxx…xxxx(小数点前的0不需要存储);
  • 会有+0和-0;
  • 精心设计后的“单调性”:对于正值是升序排列(浮点数位表示的无符号值越大,对应的小数值就越大);对于负值是降序(浮点数位表示的无符号值越大,对应的小数值就越小)。从而有“非规格化数”->“规格化数”->“无穷大”这样很好的分布。

8位浮点格式的非负值示例
上图来源于参考资料。以8位浮点编码(指数4位,底数3位)为例,列出非负值对应的位表示,指数,底数,数值。虽然只是8位浮点编码,不是标准的32位或64位,但是,麻雀虽小,五脏俱全,足够体会浮点编码的特性。例如,通过“位表示”和“值”这两列,可以看出刚才提到的“单调性”。

为什么要使用偏置(Biased)编码指数?

作为科学计数法的指数部分,需要可以表示负数。为什么要使用偏置编码呢?细想一下,可以发现使用偏置编码是实现“单调性”的关键!可以看一下上面的图中的“位表示”和“值”这两列。

对于规格化模式,为什么偏置值要选取2^(k-1)-1?

使用偏置编码,在选取偏置值时,很合理的想法是所能表示的正数个数和负数个数尽可能对半。对于k=4位指数部分,有以下情况:

  • 偏置值选2^(k-1)=8。那么,能表示的范围为:-7到6(排除全0和全1);
  • 偏置值选2^(k-1)+1=9。那么,能表示的范围为:-8到5(排除全0和全1);
  • 偏置值选2^(k-1)-1=7。那么,能表示的范围为:-6到7(排除全0和全1)。

为了让正数个数和负数个数尽可能对半,就会选第一种和第三种。第一种好处是能表示更接近0的数;第三种好处是能表示更大的数(更大的正数或更小的负数)。应该是为了能表示更大的数,因此,偏置值选取2^(k-1)-1。

对于非规格化模式,为什么偏置值要选取2^(k-1)-2?

对于非规格化模式,偏置值选得越大,就能表示更接近0的数(因为指数值为0-Biased)。另一方面,为了实现“单调性”,偏置值不能太小。考虑到规格化模式(指数的位表示最小为1,底数为1.xxxx…xxxx);与非规格化模式(指数的位表示为0,底数为0.xxxx…xxxx)的区别,对于非规格化模式,如果偏置值选取2^(k-1)-2,即,比规格化模式的偏置值小1,就可以实现从“非规格化数”到“规格化数”的均匀的过渡!可以看一下上面的图中的“最大的非规格化数”和“最小的规格化数”这两行。

浮点数=定点数集合

从另一个角度来说,浮点数=定点数集合。下面具体说明一下。

定点数

“定点数”分为整数部分和小数部分,而且小数点的位置是固定不变的(这里说的定点数,不考虑符号,其实就是二进制小数。出于好记,且与浮点数相对应,这里直接叫定点数)。一个n位的定点数,如果小数部分为m位,那么,整数部分就为n-m位。小数部分的位数是固定的,所以小数点的位置是固定的。特别地,m=0时,这个n位的定点数即表示为整型。我们可以得出:

  • 表示的数值为各个位的数值的和。对于整数部分,数值为bit*2^i,i表示小数点前第i位(i从0开始);对于小数部分,数值为bit*(1/(2^i)),i表示小数点后第i位(i从1开始);
  • n位定点数中,最低有效位为1,且其他位为0所表示的数值有这个意义:是能表示的最小的大于0的数!!而且,是能表示的相邻的数值的间隔!!可以称这个值为最小间隔!!。例如,n=4且m=0时(即为n位整形),最小间隔为1;n=4且m=2时,最小间隔为1/4,即为0.25;
  • n位定点数能表示的数值范围。最小值为0(全0),最大值为全1对应的数值。其他能表示的数值为最小值和最大值之间,以最小间隔为间隔均匀分布!!例如,n=4且m=0时(即为n位整形),最小间隔为1,数值范围为0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15;n=4且m=2时,最小间隔为1/4,即为0.25,数值范围为0,0.25,0.5,0.75,1,1.25,1.5,1.75,2,2.25,2.5,2.75,3,3.25,3.5,3.75。

定点数集合

定点数集合,表示不同总位数n和不同小数位数m的定点数集合。浮点编码中的每个指数值和不同模式的底数,就确定了一种定点数类型。即,确定了m和n,而且超出底数位数的位为0。每一种定点数类型都有一个能表示的数值范围,而且以最小间隔均匀分布。例如,对于上面的图的情况,8位浮点编码(指数4位,底数3位):

  • 当指数部分为全0时,即,属于非规格化,指数值为-6。这时,可以得到一种定点数表示,n=10,m=9,而且超出底数位数的位为0:0.000000xxx。最小值为0;最大值为0.000000111,即为2^(-7)+2^(-8)+2^(-9)=7/512;最小间隔为0.000000001,即为2^(-9)=1/512;
  • 当指数部分为1时,即,属于规格化,指数值为-6。这时,可以得到一种定点数表示,n=10,m=9,而且超出底数位数的位为0:0.000001xxx。最小值为0.000001000,即为2^(-6)=1/64;最大值为0.000001111,即为2^(-6)+2^(-7)+2^(-8)+2^(-9)=15/512;最小间隔为0.000000001,即为2^(-9)=1/512;
  • 当指数部分为6时,即,属于规格化,指数值为-1。这时,可以得到一种定点数表示,n=5,m=4,而且超出底数位数的位为0:0.1xxx。最小值为0.1000,即为2^(-1)=1/2;最大值为0.1111,即为2^(-1)+2^(-2)+2^(-3)+2^(-4)=15/16;最小间隔为0.0001,即为2^(-4)=1/16;
  • 当指数部分为14时,即,属于规格化,指数值为7。这时,可以得到一种定点数表示,n=8,m=0,而且超出底数位数的位为0:1xxx0000.。最小值为10000000.,即为2^(7)=128;最大值为11110000,即为2^7+2^6+2^5+2^4=240;最小间隔为00000001.,即为2^0=1。

根据上面所述,可以得出:浮点数=定点数集合。

参考资料

《深入理解计算机系统》 - 2.4 浮点数

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值