一探浮点数

       浮点数是一种常用的表示数的方式,因小数点可以浮动得名。我们更关心的是在计算机中如何表示浮点数。到目前为止,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


2021年3.17更
  之前写这篇的时候还是在学计算机组成原理的时候,学了浮点数的大部分内容。但这学期一门课叫做计算机系统结构又新学了一点关于浮点数的内容,我在此做个补充。
  其实之前一直没有想过阶码、尾数的表示都是二进制,那用其他进制,比如16进制表示行不行呢?答案当然是:可以!东西的本质不变,表示的方法有很多种。
  这里放一张相关的图(图源:计算机系统结构(第五版)-李学干)
在这里插入图片描述
  对其中相关的参数进行下说明:
  p:阶码除去符号位后的位数(阶码整体使用p+1位表示)
  rm:表示的进制数(2,8,16…)
  m:2进制下尾数的位数
  m’:其他进制下尾数的位数。

  那使用比2大的进制有什么好处坏处呢?

  优点:扩大浮点数的表示范围、增加可表示数的个数、减少移位次数、降低右移造成的精度损失、提高运算速度
  缺点:降低数据的表示精度、数值的分布变稀。

  此处对于其他进制的介绍比较简略,起到一个抛砖引玉的作用(我从来没想过这个问题),更为详细的内容请大家参考其他资料。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值