浮点运算
IEEE754浮点数
这里主要介绍单精度浮点数float,共32位,分为3部分:1位数符、8位阶码、23位尾数,尾数有隐含1.阶码为8位,表示规格化数时范围是1到254之间,偏置取127,这样阶码范围就为-126到127之间,阶码全0表示非规格化数,阶码全1尾数全0表示无穷大,数符为0表示正无穷,为1则为负无穷,阶码全1而尾数非0时则为NaN非数,可以总结如下:
l 规格化数
31 30 23 22 0
例如,表示-9.625,先求二进制表示 -9.625 = -1001.101,再移位-9.625=-1.001101 * 2 ^3,尾数001 1010 0000 0000 0000 0000,阶码3+127=130=1000 0010,数符1,合起来就是
1100 0001 0001 1010 0000 0000 0000 0000
写成16进制就为 C11A0000H,若采用小端方式存储在主存中,则该float数存储单元的内容依次为 00H 00H 1AH C1H
l NaN(非数)
31 30 23 22 0
l 无穷大
31 30 23 22 0
无穷用于表达计算中产生的上溢问题。比如两个极大的数相乘时,尽管两个操作数本身可以保存为浮点数,但其结果可能大到无法保存为浮点数,必须进行舍入操作。根据IEEE标准,此时不能将结果舍入为可以保存的最大浮点数(因为这个数可能与实际的结果相差太远而毫无意义),而应将其舍入为无穷。对于结果为负数的情况也是如此,只不过此时会舍入为负无穷,也就是说符号域为1的无穷。
非规格化数
31 30 23 22 0
在这种情况下,指数值 E=1-Bias(单精度下即为1-127=-126),而有效数字的值 M=f,也就是说它是小数段的值,不包含隐含的开头的 1。
浮点数的舍入与舍入误差
在浮点数的舍入问题上,IEEE 浮点格式定义了 4 种不同的舍入方式。其中,默认的舍入方法是向偶数舍入,而其他三种可用于计算上界和下界。
下表是 4 种舍入方式的应用举例。这里需要特别说明的是,向偶数舍入(向最接近的值舍入)方式会试图找到一个最接近的匹配值。因此,它将 1.4 舍入成 1,将 1.6 舍入成 2,而将 1.5 和 2.5 都舍入成 2。
浮点数的运算
l 规格化
n 规格化数:以补码为例,正数时为0.1xxx,负数时为1.0xxxx,最高有效位有效
n 左规:处理非规格化数,尾数每左移一位,阶码相应的减一,可能多次
n 右规:处理溢出,尾数右移一位,阶码加1
l 加法
n 对阶
小阶向大阶看齐,也即较小的浮点数,其阶码每加一,尾数就右移一位,此时尾数可能会舍入;
n 尾数求和
当参与相加的两个浮点数阶码经过对阶后,就可以进行尾数求和了;
n 规格化
尾数可能溢出,此时需要右规,相应的阶码加一,同样这里可能产生精度损失
n 溢出判断
这里的溢出判断是指阶码有无溢出
习题
1、模拟(三)
2和3正确,其它错误,选B