一探浮点数

       浮点数是一种常用的表示数的方式,因小数点可以浮动得名。我们更关心的是在计算机中如何表示浮点数。到目前为止,IEEE754统一了浮点数的相关规范,本文也针对于IEEE754来进行分析。

       在一般的通用计算机中,通常来讲单精度浮点数(float)使用32个bit来表示,双精度(double)使用64个bit来表示。因为单双精度方法类似,只是表达范围不同,所以本文以单精度(32bits)为例进行探讨。

        对于单精度浮点数,32位被分为3部分,分别是符号位(1bit),阶码位(8bits),小数位(23bits)。对于浮点数,采用科学计数法的方式来进行数值上的表示。科学计数法也正好对应以上三部分。数值的正负又符号位体现,正数为0,负数为1。根据基数的不同,分为2,8,16进制等等,但映射到计算机中都是二进制。对于规格化浮点数来讲默认小数点前面的数字都是1,于是可以节省此bit位,不对此进行表示。小数部分对应三大部分中的小数位,直接按照小数点后的顺序对应即可。需要注意的就是不够23位的后面补0。

        重点是在阶码位,也是本文的主要讲述对象。首先阶码的选择是移码而不是补码。移码就是设置偏移量的原码,从数值上来看也是符号位取反的补码,移码减去1作为阶码。为什么选择移码而不是补码呢?因为浮点数中涉及到很多比较的操作,也叫做“对阶”(我理解为两个浮点数比大小,第一个比的是整体数值的符号,其次就是阶的大小),而补码进行比较,需要先转换成原码非常麻烦。所以在这一点上移码具有强大的优势。(当然了,可能还有其他的原因,欢迎各位读者补充)。

        为什么移码比较时具有优势呢?可以简单理解成使用移码在比较时都是正数,从原码变成移码的过程中加上了一个偏置常数(bias)。偏置常数的作用就是修改浮点数的规格化数阶数的表示范围。以IEEE754为例,有8位无符号数来表示阶数大小。因为特殊的规定,取消全是1的最大数和全是0的最小数,原因是保留全是1和全是0作为非规格化使用。所以表示范围是(1至254),共计254个数字。为了表示正负范围相同,偏置常数为254/2=127。在原来的左右两侧范围减去127后,表示的范围就变成(-126~127),以上这是属于表示阶段。当进行真正比较的时候,又重新加上偏置常数,变成正数,利于比较。所以一定要记住减去偏置常数后再用二进制做表示。
Bias的计算公式如下:

在这里插入图片描述

    在之前的学习过程中,老师留下一个疑问,为什么浮点数表示不精确,具体内容可见博客:link

    浮点数阶码为什么用移码表示,具体可见博客:link

    对浮点数介绍很详细(虽然目前没看懂的):link

猜你喜欢

转载自blog.csdn.net/gls_nuaa/article/details/104884578