漫谈计算机组成原理(十)浮点数运算

本文讲什么?

浮点数和定点数一样,都是计算机中数据的存储形式。定点数我们可以理解成纯小数或者纯整数,但是实际上在计算机中参与运算的数字并非都是定点数。比如,有些数据过大,比如2^100^这样的数据,如果写成二进制的形式,寄存器肯定是无法放下的。于是就有了浮点数这种数据。
本文主要讲述浮点数的概念、浮点数的规格化,以及浮点数的各种运算。

浮点数

所谓浮点数,就是小数点的位置会改变的数字。什么情况下小数点会发生改变呢?比如下面这样:

22.101 = 0.22101 * 10^2 = 0.022101 * 10^3(注意,此处的数据都是十进制的)

上面的22.101的小数点的位置之所以会发生变化,究其原因不过是乘以了10的对应次方。根据我们以前学过的内容,10同样可以换成其他的数字,比如2,相应的幂次也会发生变化。我们称这个10或者2为基数,基数的幂次为阶码;而小数点不断变化的数称作尾数。再看一个数字:

11.0101(2) = 0.110101*2^10 = 0.0110101*2^11(格式:【尾数符号|尾数|阶码符号|阶码】)

注意啊,上面的数字全部都是二进制的,包括基数和阶码。一开始我看这个数字是懵逼的,因为我就是搞不明白为啥0.110101*2^3^ = 0.110101*2^11^,后来才明白,原来11是3的二进制形式,这块千万要看好,我就被坑了。

浮点数在计算机中的表现形式:和上面我给出的格式略有不同,因为上面的那种形式是我用来给大家解释说明的。而下面这种格式才是真正存储在计算机中的格式。
浮点数的表示格式

浮点数的表示范围:就像我们之前说过的定点数,同样有其表示的范围,浮点数也是一样,同样有表示范围,如果一个数字超过了这个表示范围,则称为溢出。表示范围如下图:
浮点数的表示范围

浮点数有上溢区和下溢区之分,当浮点数的阶码大于最大阶码时,称为上溢,此时机器停止运算,进行溢出中断处理;如果阶码小于最小的阶码时,称为下溢, 此时溢出的数值非常小,直接强制将浮点数的尾数置为0,可以继续执行运算。

浮点数的规格化:其实浮点数的规格化没什么好说的,基本上是和我们当年学的科学计数法是一个样子的。我们就说一下基数为2的规格化方式:基数为2时,尾数最高为1的数规格化数。规格化时,尾数左移一位,阶码减1;尾数右移一位,阶码加1。当尾数小于等于1的时候,规格化就完成了。
我们来看看如何将一个数规格化成浮点数(包括其原码、反码、补码):
- 例子:设浮点数字长为16位,其中阶码5位,尾数11位,令x=-54,请将其规格化为基数为2的浮点数
1)先将-54转换为二进制形式:-110110
2)规格化得到-(0.1101100000)* 2^110^
3)得到在浮点机中的结果:[x]~原~ = 0.0110;1.1101100000,[x]~补~=0.0110;1.0010100000,[x]~反~=0.0110;1.0010011111.

浮点数的运算

从上面的介绍中能够知道,在计算机中,浮点数都能够表示成* 尾数(乘)基数 ^阶码^*的这种形式,这就给浮点数的四则运算带来了巨大的便利。

浮点数的加减法运算

浮点数的加法非常简单,只需要记住下面的这几个步骤就能够准确的运算:

1)对阶,使得两数的小数点位置对齐。
2)尾数求和,将对阶后的两个尾数按照定点的加减法运算规则计算。
3)规格化,为增加有效数字的位数,提高运算精度,必须将求和(差)后的尾数规格化
4)舍入,为提高精度,要考虑尾数右移时候丢失的数值位
5)溢出判断,判断计算结果是否存在溢出

因为浮点数的加法比较简单,我们就不给出具体的例子了,我只是强调几点。
- 所谓的对阶,就是对阶码进行运算。我们让两个阶码做减法,判断哪个阶码更大,谁大就向谁看齐。同时,两个阶码差几就让对应的尾数向左或者向右移动几位,使得阶码之间的差值为0.
- 尾数求和就是两个尾数相加,这个没什么好说的,按照定点的运算就可以了。
- 尾数计算完毕后,需要规格化。
因为在上面我们讲了浮点数的表示范围,当基数为2的时候,规格化数s的绝对值应该属于[1/2,1)之间,所以当s<0的时候,补码规格化形式为00.1xxxxx,而s>0的时候,补码规格化形式为11.0xxxx。 所以,尾数的最高数值位和符号位不同的时候,就存在两种可能的情况。

这就导致当规格化数小于0的时候,规格化有两种方式。

浮点数的乘除法运算

浮点数的乘除法运算其实也是基于加减运算的。
运算步骤如下:

1)阶码相加减:按照定点整数的加减法运算方法对两个浮点数的阶码进行加减运算。

2)尾数相乘或相除:按照定点小数的阵列乘除法运算方法对两个浮点数的尾数进行乘除运算。为了保证尾数相除时商的正确性,必须保证被除数尾数的绝对值一定小于除数尾数的绝对值。若被除数尾数的绝对值大于除数尾数的绝对值,需对被除数进行调整,即被除数的尾数每右移1位,阶码加1,直到被除数尾数的绝对值小于除数尾数的绝对值。

3)结果规格化并进行舍入处理:浮点数乘除运算结果的规格化和舍入处理与浮点数加减运算结果的规格化和舍入处理方法相同。并且在浮点数乘除运算的结果中,由于乘积和商的绝对值一定小于1,因此在浮点乘除运算结果进行规格化处理时只存在向左规格化,不可能出现向右规格化。

4)判断溢出:浮点数乘除运算结果的尾数不可能发生溢出,而浮点数运算结果的溢出则根据运算结果中浮点数的阶码来确定,溢出的判定和处理方法与浮点加减运算完全相同。

例子像下面这样:
- 例子:设两浮点数x=2-001×(-0.100010),y=2-100×(0.010110),求x*y
[x]~浮~=11111,1.011110 [y]~浮~=11100,0.010110

1)阶码相加
[Ex+Ey]补=[Ex]补+[Ey]补=11111+11100=11011

2)尾数作直接补码阵列乘法运算
[Mx]补×[My]补=1.110100010100

3)结果规格化并进行舍入处理
积的尾数左移2位,阶码减2,采用“0舍1入”法进行舍入处理后,得
[x×y]浮=11001,1.010001

4)判断溢出
乘积的阶码的双符号位相同,故乘积无溢出。
所以x×y=2-111×(-0.101111)

结束语

至此,计算机运算方法这一章节就算是完成了,大家如果有问题可以私信、留言。
如果你喜欢我的文章,欢迎关注我的微信公众号:最高权限比特流

参考:
《计算机组成原理》唐朔飞
博客:https://blog.csdn.net/xingqingly/article/details/18981671

posted @ 2018-08-31 20:28  roobtyan  阅读(4473)  评论(0编辑  收藏  举报