信息的表示与存储 - 浮点数的运算

用户头像
引花眠
关注
发布于: 2020 年 06 月 28 日

IEEE 754

IEEE二进制浮点数算术标准(IEEE 754)是20世纪80年代以来最广泛使用的浮点数运算标准,为许多CPU与浮点运算器所采用。这个标准定义了表示浮点数的格式(包括负零-0)与反常值(denormal number)),一些特殊数值(无穷(Inf)与非数值(NaN)),以及这些数值的“浮点数运算符”;它也指明了四种数值舍入规则和五种例外状况(包括例外发生的时机与处理方式)。百度百科-IEEE 754

浮点数舍入

IEEE规定了对于浮点数x和y,在进行运算后,会对实际的存储的值进行舍入,丢弃一些bit位,IEEE 754有四种舍入方式:

  • 舍入到最接近:舍入到最接近,在一样接近的情况下偶数优先(Ties To Even,这是默认的舍入方式):会将结果舍入为最接近且可以表示的值,但是当存在两个数一样接近的时候,则取其中的偶数(在二进制中式以0结尾的)。

  • 朝0方向舍入:会将结果朝0的方向舍入。

  • 朝+∞方向舍入:会将结果朝正无限大的方向舍入。

  • 朝-∞方向舍入:会将结果朝负无限大的方向舍入。

举例:

方式 1.40 1.60 1.50 2.50 -1.50
舍入到最接近 1 2 2 2 -2
朝0方向舍入 1 1 1 2 -1
朝+∞方向舍入 2 2 2 3 -1
朝-∞方向舍入 1 1 1 2 -2

ps: 1.50 与1和2都很接近,但是因为2是偶数,所以1.5舍入结果位2,2.5也是因为如此。

浮点数运算

特殊参数的运算

一些特殊的参数(0,+∞,-∞,NaN)

  • 1.0/+0 为+∞

  • 1.0/-0 为-∞

  • 0.0/0.0 为NaN

  • +∞-∞ 为NaN

ps: NaN是唯一与自身不等的浮点数类型

浮点数的加减法

浮点数的加减运算一般由以下步骤完成:0 操作数判断,对阶、尾数运算、规格化、舍入处理、溢出判断

0 操作数判断

浮点数运算比较复杂,如果操作数中有0,则就不需进行下面的步骤了。

对阶

所谓对阶是指将两个进行运算的浮点数的阶码对齐的操作。对阶的目的是为使两个浮点数的尾数能够进行加减运算。因为,当对x和y进行加减运算时,只有使两浮点数的指数值部分相同,才能将相同的指数值作为公因数提出来,然后进行尾数的加减运算。

对阶的具体方法是:首先求出两浮点数阶码的差,即⊿E,将小阶码加上⊿E,使之与大阶码相等,同时将小阶码对应的浮点数的尾数右移相应位数,以保证该浮点数的值不变。几点注意:

  1. 对阶的原则是小阶对大阶,之所以这样做是因为若大阶对小阶,则尾数的数值部分的高位需移出,而小阶对大阶移出的是尾数的数值部分的低位,这样损失的精度更小。

  2. 若⊿E=0,说明两浮点数的阶码已经相同,无需再做对阶操作了。

  3. 采用补码表示的尾数右移时,符号位保持不变。

  4. 由于尾数右移时是将最低位移出,会损失一定的精度,为减少误差,可先保留若干移出的位,供以后舍入处理用。

尾数运算

尾数运算就是进行完成对阶后的尾数相加减。这里采用的就是我们前面讲过的纯小数的定点数加减运算。

结果规格化

由于在进行上述两个定点小数的尾数相加减运算后,尾数有可能是非规格化形式,为此必须进行规格化操作,对于IEEE754标准的浮点数来说,就是尾数必须是1.M的形式。。

规格化操作包括左规和右规两种情况:

  1. 左规操作:将尾数左移,同时阶码减值,直至尾数成为1.M的形式。例如,浮点数0.0011·25是非规格化的形式,需进行左规操作,将其尾数左移3位,同时阶码减3,就变成1.1100·22规格化形式了。

  2. 右规操作:将尾数右移1位,同时阶码增1,便成为规格化的形式了。要注意的是,右规操作只需将尾数右移一位即可,这种情况出现在尾数的最高位(小数点前一位)运算时出现了进位,使尾数成为10.xxxx或11.xxxx的形式。例如,10.0011·25右规一位后便成为1.00011·26的规格化形式了。

舍入处理

浮点运算在对阶或右规时,尾数需要右移,被右移出去的位会被丢掉,从而造成运算结果精度的损失。为了减少这种精度损失,可以将一定位数的移出位先保留起来,称为保护位,在规格化后用于舍入处理。

关于舍入上文有具体介绍。

溢出判断

与定点数运算不同的是,浮点数的溢出是以其运算结果的阶码的值是否产生溢出来判断的。

  1. 若阶码的值超过了阶码所能表示的最大正数,则为上溢,进一步,若此时浮点数为正数,则为正上溢,记为+∞,若浮点数为负数,则为负上溢,记为-∞;

  2. 若阶码的值超过了阶码所能表示的最小负数,则为下溢,进一步,若此时浮点数为正数,则为正下溢,若浮点数为负数,则为负下溢。正下溢和负下溢都作为0处理。

浮点数的乘除法

浮点数的乘除运算规则如下:

  1. 乘法 指数相加,尾数相乘

  2. 除法 指数相减,尾数相除

所以,浮点数的乘除运算没有对阶:0 操作数判断、阶码加减、尾数乘除、规格化、舍入处理、溢出判断,除了0 操作数判断、阶码加减、尾数乘除与浮点数加法不一致,其余步骤大体相同

0 操作数判断

浮点数运算比较复杂,如果操作数中有0,则结果可能为0、+∞、-∞、NaN

阶码加减与尾数乘除

按照整数加减运算,需要判断是否溢出。按照定点小数乘法对尾数乘除,

参考资料

  1. 百度百科-左移运算符

  2. 百度百科-IEEE 754

  3. 豆瓣-深入理解计算机系统(原书第3版)

  4. 计算机组成原理-白中英主编



发布于: 2020 年 06 月 28 日 阅读数: 38
用户头像

引花眠

关注

还未添加个人签名 2018.06.11 加入

还未添加个人简介

评论

发布
暂无评论
信息的表示与存储-浮点数的运算