【整理】【计算机组成原理】浮点表示及其加减运算

前言:
最近网课经常不听课,老师留的作业全不会只好课下看书,这个习惯真的不好,费时费力.现整理一下关于浮点数的一些笔记.
课本是以<计算机组成原理(第3版)>蒋本删 为例

浮点表示法

概念

浮点数:让小数点的位置根据需要而浮动.
一般来说就是这个公式:N = M * r^E
按照课本来说, M为尾数,r为阶码的底,E为阶码,一般r=2,以及一些琐碎的知识点,比如尾数用原码或补码表示,阶码常用移码或补码表示,还有一些精度和表示范围等等这里不在陈述.
还有一张格式图:
在这里插入图片描述
类似于课本上的,这个浮点数的概念看起来很陌生,但实际上外面是很熟悉的在数学上,其实我们可以把这个浮点数类比科学计数法的形式或者说就是2进制的科学计数法

从十进制看来,M是一个1-9的数,r=10,E为几次方.
打个比方以 -6 * 10^4
回到浮点数的概念就会发现原来科学计数法的小数点也是根据需要而浮动的.

这样我们就回到课本再重新去理解相关的知识点.
范围和精度也就很好理解了,而整个浮点数的正负也就是由尾数的符号位(数符)决定,阶码的符号位(阶符)也就能理解了.
接下来我们来看浮点数的表示范围

表示范围

从十进制的科学计数法我们如何去找最大正数
我们会让尾数最大,且阶码也要越大越好,因此,我们希望尾数M是9最好且符号为正(整数为例),而阶码E可以是99999符号也为正一直延续下去.
阶符和数符都为正 尾数和阶码能有多大就有多大
回到浮点数,根据上面的原则,
最大正数
当然是阶符和数符都为正,也就是说都要取0,尾数要大阶码也要大在二进制中最大的数为1,所以尾数要取1,阶码也要取1但要记得它们的尾数如果都是4位的话,1111*2^1111这肯定是最大的数了,这也就很好理解课本上的东西了.比如说最小正数,绝对值最大负数了等等.

类比于咱们生活中常用的十进制科学计数法,我觉得理解浮点数起来也就容易很多了.

规格化浮点数

在十进制中同一个数用科学计数法表示有很多种,数学上我们肯定也学习到了一般习惯上我们希望尾数M是个个位数0-9的范围,而不是20,50,23,151这样的十位数百位数来表示,所以在浮点数表示上也会出现了这样的问题,我想规格化浮点数的概念就是因此而诞生的.

规格化浮点数:尾数的最高位必须是一个有效值.
M的绝对值应在下列范围:
1/r <= | M | < 1
具体请去看课本,具体的应用会在下文的浮点数的加减运算中出现.

浮点加减运算
课本上的通式看起来很复杂,不用记,只需要理解就行.
下面我不会大幅度的去将如何取计算,这些只需要看课本就行了
我想讲一些计算过程中会出现的问题.

**计算步骤
1. 对阶
2. 尾数加/减
3. 数结果规格化
4. 舍入
5. 溢出判

课本上有一个例题,但刚开始学的时候会有很多疑问,因为不仅是设置了两数的格式:阶码4位,用移码表示;尾数8位,用补码表示;而且答案是直接给出来并没有给出我们计算过程中可能出现的问题.

下面我会以一道例题为例讲讲我们在浮点数加减计算中可能出现的问题,
容易出问题的地方并不是表示他很难,而是表明我们对于概念的不熟悉.

出问题的地方我将会以序号形式表示出来.

题目如下:
X = 2^-001 * 0.101100
Y = 2^-001 * ( -0.111100 )
浮点数的阶码和尾数部分均用补码表示,求 X+Y ,X-Y.

解题步骤:
在按照浮点数的解题步骤时我们首先看一看题目,确定尾数是哪些,阶码是哪个,题目要求是用补码.

我们首先将这两个数的阶码和尾数的补码表示出来
尾数: X的尾数为 0.101100   [0.101100]补 = 0.101100  
	 ① 正数的补码形式还是它本身,并不是要取反+1
	   所以不要写成 [0.101100]补 =0.010100
	  Y的尾数为 -0.111100 [-0.111100]补 = 1.000100
阶码: X的阶码为 -011 [-011]补 = 1101
	  Y的阶码为 -001 [-001]补 = 1111

我们已经求出了 X,Y的浮点表示
[X]浮 = 1101 ; 0.101100
[Y]浮 = 1111 ; 1.000100 前者为阶码,后者为尾数.

接下来我们来按步骤解题
1) 对阶
比较 Ex 和Ey的大小,这里我们要注意的
Ex = 1101 Ey = 1111 用的补码表示,我们单单看这个的话肯定觉得Ex>Ey,但实际上从题目中看阶码的大小我们知道是Ey>Ex的,这是为什么呢?

② 个人觉得负数用补码表示来说,但看补码来说只能说越大的表明它越小,比较大小来说还是不要用补码来比较可以转换原码或者进行差比较

🔺E = Ex -Ey =1101-1111= 1010 = (-2)十进制表示
根据 小阶向大阶对齐原则 我们要让 Mx 向右移两位
Mx = 0.101100
右移后: M’x = 0.001011

③ 这里注意 负数补码的移位是 要记得左0右1
正数补码移位跟原码一样都是 补0

移位结束后 [X’]浮 = 1111 ; 0.001011

  1. 尾数加/减
    根据上一步我们现在就只需要进行加减就行
    首先进行加法:
    M’x + My = 0.111011 + 1.000100 = 1.001111
    ④ 这里注意,补码的加法来说不管两个数是否同号或异号都是进行加法运算,不要把补码的减法弄混了,不要想着这两个数是异号相当于是做减法,然后要把减数进行变补操作这样就错了

    接下来进行减法:
    M’x - My = 0.001011 - 1.000100 = M’x + [-My]补
    = 0.001011 + [[1.000100]补]补 =0.001011 + 0.111011=1.000111
    ⑤ 同样注意,补码的减法最终要变成加法运算,具体请看课本,但要注意 补码 和 变补 的区别
    补码 对于正数来说还是原码,对于负数来说是取反+1,但符号位不变的
    变补 是不管是正数还是负数,都要取反+1,且符号位也要变的

    ⑥ 还要注意 补码的减法不要想当然的进行惯性思维,比如说这道题,我们看到是正数减负数就想当然的认为是两个正数相加,然后就写成了 0.001011 + 0.000100这样的式子了,补码的减法规则和我们平时用到的规则不要混淆了.

  2. 尾数结果规格化

     这个可以这样理解我们其实已经求出了结果,
     但我们想要更规范一些,就是让答案更好看一些更准确
     一些,毕竟是要再计算机中运行实现的.
    

    这里我们要用到 “双符号位补码” 这个概念,也就是变形补码,这个请去课本查看就行,是判断溢出的.
    前面讲过规格化尾数 要求是:
    1/2 <= |M| <1

我们计算出的结果可能有6中情况,可以参照课本查看,其中有2种情况是符合规格化数的定义这里不在说了
还有2种是需要 左规的-------左移+阶码-1
还有2中是需要 右规的-------右移+阶码+1(最多进行一次)
条件参照课本.

回到例题

加法已经是规格化数不做改变
减法需要右规 步骤如下
1.000111 变形补码 -----> 01.000111 右规-----> 00.100011
阶码-001+1=000
⑦ 这里注意,变形补码的问题,变形补码的移位是最左边是符号位不需要移位,其他都要移位,忽略掉小数点即可,否则看着别扭,记得右移+0哟
还有有的同学我看在进行尾数加/减步骤时就进行变形补码操作了,结果当然也对,但要小心犯错,毕竟那时候的小数点左边是有两个数的.
4) 舍入
这道题不需要舍入,可以参考书上例题,想一想为什么这道题不需要舍入呢
5) 溢出判断
暂不考虑

最终结果
⑧ 这时候我们到了最后一步了但也要小心,因为我们所求的结果是[X + Y ]浮 和[ X - Y ]浮 并不是 X+Y 和 X-Y
还需要进行补码变成原码操作
[X+Y]浮 = 1101;1.001111
[X-Y]浮 = 0000;0.10011
最终结果应该为
X+Y = (-0.110001) * 2^-001
X- Y = (0.100011) * 2^000

知识点:
1. 补码的概念
2. 补码的加减运算
3. 补码的移位操作
4. 变形补码
5. 负数补码比较大小
6. 浮点数的理解

7. 什么叫做规格化
8. 浮点数的加减运算
9. 等等

现在终于写完了这道题,其实就只是一道题但有很多知识点,总结下来就是一些细节容易出错的地方,希望能有所收获帮助吧.

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值