Loading

计算机组成与设计-浮点数

引言

日常计数中我们常用科学计数法来表示一些比较大或特别小的数字,例如3.15576×109。归一化科学计数法表示不以0开头的科学计数法,即小数点前一位不能为0。

而对于计算机来说要用二进制来表示这样的数字,也就产生了浮点数。浮点表示其二进制点不固定。在C语言中关键字float代表了这一数据类型。

  

表示方法

MIPS指令集架构中,浮点数表示方法如下图所示:

 

上图代表单精度浮点数。1bit的符号位;8bit的指数位,代表数字的范围大小;23位的分数位,即代表0~1之间的数字,代表数字的精度。

当然也有双精度浮点数,即C语言中的double关键字表示的数据类型。MIPS用两个字来表示一个双精度数据:

 

这里指数位扩展到11bit,范围扩大了一些;而分数位扩大到了52bit,因此精度更高,数据的准确程度更高。

Biased Notation

 

浮点数的指数部分有正有负,如果用补码进行表示就会出现矛盾。1/2即2-1被表示为11111111,而2即21被表示为 00000001,如果进行整数比较(因为用高位进行比较能节约硬件资源和计算时间,首先比较符号位,再是表示范围的指数部分)就会出现1/2比2大的情况,而这明显是错误的。

因此以一种偏置法对指数进行表示:

对于单精度浮点数,指数部分长度为8bit,表示范围为:-127~128,因此偏置为127。新的表示方法如下:

这样1/2表示为2-1=2126-127,指数部分为0111 1110;2表示为2128-127,指数部分为1000000;就能够正确得比较大小了。

隐含的1

需要注意的是:以归一化科学计数法表示的浮点数都是1. 几的模式表示,因此小数点前的1可以隐含,使得分数位可以扩大一位的精度。即significant就是分数位的具体数值,不需要考虑leading1。

0与特殊数字的表示

 目前仅考虑了指数为1~254范围,分数位为任意数据的情况,事实上还有几类数据没有深入考虑:

 

  • 首先是0该如何表示,首先指数位为0,其次分数位也是0。样区分了指数位为1~254的标准浮点数的情况。而符号位可为1也可为0,+0和-0在一些限制性比较中起到作用。
  • 接着是指数位为0,但是分数位不是0。实际上这代表了非规范化数字(denormalized numbers)
  • 然后是指数位为255,分数位为0。表示正负无穷,比如浮点数的计算中除0,计算结果应该是正负无穷而不是溢出。
  • 最后是指数位为255,分数位为非0。这种情况表示NaN,即不是一个数字。比如在计算sqrt(-4.0)或者0/0,可以用于程序的debug等等。

浮点数运算

 浮点数加法的流程如下图所示:

 

参考资料:

1. Computer Organization and Design The Hardware/Software Interface. (Fifth edition)

2. 国立清华大学资讯工程学系课件

posted @ 2022-02-23 20:44  月光小猪(已长膘)  阅读(359)  评论(0编辑  收藏  举报