《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 解决方案 > 计算机系统原理(十一) 二进制浮点数和IEEE标准

计算机系统原理(十一) 二进制浮点数和IEEE标准

2017-06-22
关键词: 汇编语言

2.6我们进行了二进制整数运算的最后一役,本次LZ将和各位一起进入浮点数的世界,这里没有无符号,没有补码,但是有各种各样的惊奇。倘若你真正的进入了浮点数的世界,一定会发现它原来是这么有意思,而不是像之前一样,觉得了解浮点数的内容没什么用,只要会简单的使用就行了。当然,这其中也可能有部分猿友是觉得这部分内容太难,而对它失去了学习的兴趣。

就像之前的LZ一样,曾经对IEEE标准望而却步,不过相信这几章浮点数的介绍会让你有种顿悟的感觉。倘若你有了这样的感觉,也不要忘了“点个推荐哦。”

引言

整数运算虽然能解决计算机当中有关信息的很大一部分储存、运算等功能,但却是仍然不够的。否则假设我们要做一个超市的库存管理系统,那么所有商品的价格都只能是整数,这是不是让你难以接受呢。

因此有时候我们需要更精确的数值表示,这就需要浮点数出场了。对于浮点数的表示以及运算规则,在以前是各个计算机制造商各自有一套自己的标准,这给程序的可移植性造成了很大的困扰。

有需求就有创新,最终在1985年左右,浮点数标准IEEE754就应运而生了。它就像一代秦始皇一样,一统浮点数世界。秦始皇统一了文字、货币等,而IEEE754统一了浮点数的标准。

浮点数不仅仅是为了让数值的表示更加精确,也是为了表示一些整数无法达到的数字,比如一些接近于0的数字,或者一些非常大的数值。因此浮点数对于计算机的意义,可以说是相当之大。

二进制小数

尽管我们本章的主要内容应该是IEEE标准,不过我们先来看看二进制是如何表示小数的,这有助于我们理解浮点数的表示。如果是一个十进制小数,相信各位都再熟悉不过了,对于12345.6789来说,它的值是由下列式子得到的。

   12345.6789 = 1 * 104 + 2 * 103 + 3 * 102 + 4 * 101 + 5 * 100 + 6 * 10-1 + 7 * 10-2 + 8 * 10-3 +  9 * 10-4

这对我们来说应该是常识,那么对于二进制小数也是类似的,考虑这样一个小数10010.1110,它的值则可以由以下式子得到。

   10010.1110 = 1 * 24 + 0 * 23 + 0 * 22 + 1 * 21 + 0 * 20 + 1 * 2-1 + 1 * 2-2 + 1 * 2-3 +  0 * 2-4 = 16 + 2 + 1/2 + 1/4 + 1/8 = 18.875

从这个角度来看,二进制小数其实与十进制小数是一样的计算方式,只是这里是2的整数次幂而已。

在书中给出了二进制小数的公式,对于一个形式为bm....b0.b-1....b-n的二进制小数b来说,它的值为以下计算方式。

这里需要提醒的是,二进制小数不像整数一样,只要位数足够,它就可以表示所有整数。二进制小数无法精确的表示任意小数,比如最简单的,十进制小数0.3这样一个小数,二进制是无法精确的表示它的。

IEEE标准

IEEE标准采用类似于科学计数法的方式表示浮点小数,即我们将每一个浮点数表示为 V = (-1)s * M * 2E 。

这其中s为符号位,为0时为正,为1时为负。M为尾数,是一个二进制小数,它的范围是0至1-ε,或者1至2-ε(ε的值一般是2-k次方,其中设k > 0)。E为阶码,是一个二进制整数,可正可负,为了给尾数加权。

浮点格式分为两种,一种是单精度,一种是双精度。单双精度分别对应于编程语言当中的float和double类型。其中float是单精度的,采用32位二进制表示,其中1位符号位,8位阶码以及23位尾数。double是双精度的,采用64位二进制表示,其中1位符号位,11位阶码以及52位尾数。

从上面的位数上就能看出,双精度浮点数所表示的范围将远远大于单精度浮点数。针对阶码E的值,浮点数的值可以分为三种不同的情况,分别是规格化的,非规格化的以及特殊值,这三种情况就是浮点数的奥义所在了。


本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306118;邮箱:aet@chinaaet.com。