浮点数的加减法运算过程详解(面向小白的)

第一次写博客,难免有疏漏之处,如果有错误请批评指正,感谢!
对于浮点数的加减运算,书上写的名词太多,例子过程不太详细,面对查到的博客也有这种感觉,想明白后准备写个博客加深一下印象,也可能帮助到其他人。

一. 浮点数在计算机内的表示

1.定点数:小数点固定在某个位置不动的数据。

有两种可能的表示方法(第一种为整数,第二种为带小数点的小数):
第一种:直接举例: 1××××××××.(纯整数,小数点在最右边,即最低位右边)。
第二种:直接举例: 0. ××××××××(纯小数,小数点在符号位右边(此处0为符号位,是单符号位))。

2.浮点数:小数点位置可以浮动的数据。
常用下式表示:

N = M*RE

N为浮点数,M为尾数,E为阶码(个人认为是指数),R为阶的基数(底),一般R为2或8或16。此式与十进制的科学计数法的计数方法类似,比如123500 = 1.235*105,10为底数,5为指数。

计算机内浮点数的表示常用下图:

Ms(符号位)E(阶数)M(尾数)
1位n+1位(里边包括1位符号位)m位

至于做题的时候好多符号位都是两位符号位而不是1位符号位,个人认为是便于发现数据有没有溢出(加减是否溢出的判定规则之一是运算完毕后结果的两个符号位不相同即为溢出)。所以做题时本人习惯即使给的是1位符号位,也要写成两位的。

还有一个要说的是1.01101表示的是 -0.01101,而不是 -1.01101。

浮点数加减运算之前要了解的东西就这么多了吧…开始说加减运算。

二. 浮点数的加减运算步骤

不上公式,不用字母表示,一点都不好理解。就用常规的数字表达式做例子说。

第一个例子:X = 00.1011×23 Y = 00.1001×24

浮点数的加减运算分为五步:

1.对阶: 对阶还是比较好理解的。把指数小的数(X)的指数(3)转化成和指数高的数(Y)的指数(4)相等,同时指数小的数(X)的尾数的符号位后边补两个数指数之差的绝对值个(1个)0。对于本例来说,就是把X变为:

X = 00.01011 ×24

此时有人会考虑,原数算上两位符号位是6位,转化之后成了7位,最低位的那个1要舍去啊。其实最好不要舍去不写,在它下面画个下划线标注一下这原本是要舍去的那个数即可(因为如果在这里随便舍掉数字不写,后边计算过程可能会出错)。
还有人分不清到底是写一位符号位还是两位符号位,其实写几位都不影响最后结果。个人喜欢用两位(就算题目里写一位也可以自己写成两位,按两位去做),原因说过了,不再赘述。

2.尾数相加减
按照例子来说,尾数相加减:
0 0 . 0 1 0 1 1
+
0 0 . 1 0 0 1 (注意看是怎么对齐的
等于
0 0 . 1 1 1 0 1
这是相加,相减是把减数换成对应的补码再做相加运算即可。

3.规格化
规格化对初学者来说可能有点混乱,不过总结一下还是很明确的。
当出现以下两种情况时需要进行规格化。

①两个符号位不相同,右规:两个符号位不同,说明运算结果溢出。此时要进行右规,即把运算结果的尾数右移一位。需要右规的只有如下两种情况:01××××10××××01×××右移一位的结果为001×××10××××右移一位的结果为110×××。最后将阶码(指数)+1。

②两个符号位相同,但是最高数值位与符号位相同,左规:两个符号位相同,说明没有溢出。此时要把尾数连续左移,直到最高数值位与符号位的数值不同为止。需要左规的有如下两种情况:111×××000×××111×××左移一位的结果为11×××0000×××左移一位的结果为00×××0。最后将阶码(指数)减去移动的次数。

4.舍入
执行右规或者对阶时,有可能会在尾数低位上增加一些值,最后需要把它们移掉。(上面我说过,进行尾数加减时不要把对阶过程在尾数低位上增加的值去掉,不是不去掉,而是在舍入这一步去掉。)比如说,原来参与运算的两个数(加数和被加数)算上符号位一共有6个数,通过上边三个操作后运算结果变成了8个数,这时需要把第7和8位的数去掉。如果直接去掉,会使精度受影响,通常有下边两个方法:

①0舍1入法:
第一个例子:运算结果:X = 00.11010111,假设原本加数和被加数算上符号位一共有6个数,结果X是10个数,那么要去掉后四个数(0111)。由于0111首位是0(即要去掉的数最高位为0),这种情况下,直接去掉这四个数就可以。该例最后结果为 X = 00.1101
第二个例子:运算结果 Y = 00.11001001,这时要去掉的数为1001四个数,由于这四个数的首位为1(即要去掉的数最高位为1),这种情况下,直接去掉这四个数,再在去掉这四个数的新尾数的末尾加1。如果+1后又出现了溢出,继续进行右规操作。该例最后结果为 Y = 00.1101
②置1法:
这个比较简单,去掉多余的尾数,然后保证去掉这四个数的新尾数的最后一位为1(即是1不用管,是0改成1)即可。比如 Z=00.11000111,置1法之后的结果为Z=00.11001

5.检查阶码是否溢出:
阶码溢出在规格化和右移的过程中都有可能发生,若阶码不溢出,加减运算正常结束(即判断浮点数是否溢出,不需要判断尾数是否溢出,直接判断阶码是否溢出即可)。若阶码下溢,置运算结果为机器0(通常阶码和尾数全置0)。若上溢,置溢出标致。

好了。关于浮点数的加减我觉得就这些了,如果哪里有错误或者有什么不足,请指出,谢谢!

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐