3.5浮点运算
- 规格化数:若一个用科学计数法表示的数,没有前导零,且小数点左边只有一位整数,则称为规格化数。如1.22*10^9。
- 规格化数的优点:
- 简化了浮点数的数据交换;
- 简化了浮点算术算法
- 提高了用一个字存储数的精度。
3.5.1浮点表示
- 尾数:位于浮点数的尾数字段,其值在0~1之间。
- 指数:位于浮点数的指数字段,表示小数点的位置。
- 浮点表示的设计者必须在尾数位宽和指数位宽之间做出合适的折中。因为字的长度是固定的。
MIPS中浮点表示如下:
s为符号位(1为负数),指数域为8位宽(包含符号位),尾数域为23位宽。这种表示方法称为符号数值表示(sign and magnitude) - 浮点数表示范围 ~
- 溢出(上溢):正的指数太大导致在指数域放不下。
- 下溢。
-
精度
- 双精度:浮点数由2个32位的字表示。
- 单精度:浮点数由一个32位的字表示。
双精度浮点表示(MIPS):表示范围 ~
- IEE754标准
就是说,上述方法表示的二进制浮点数,小数点左侧的数字一定是1,所以将二进制浮点数表示的前导位1直接省略,用来提高精度。
所以这样就表示成了
F表示0和1之间的数,E表示指数域的值。IEEE754标准的另一些特点就是用特殊的符号来表示异常事件。列如,用 +∞或者- ∞表示除零中断。最大的指数保留下来表示那些特殊符号。
由于这种符号数值表示方法将符号位放在最前,所以作比较的时候就很容易了,先比较符号位,如果相同在比较指数位,但指数位有一个问题,由于用的是补码,如果是负数,那么它最前面的数字是1,这就不好玩了,本来是负数,结果搞得他好像很大似的。所以我们要找一种办法,使得这种比较简单一点。没错这种方法就是带偏阶的记数法。需要从偏阶中减掉偏阶才能获得真实值。
- IEEE754标准规定单精度的偏阶为127。这样-1就可以表示为-1+127,就是,即。-10就是即,这样就很完美了,只要比较每一位上的数字大小就可以知道整个数值的大小关系了。
3.5.2浮点加法
直接用流程图表示:
- 第一步当中应该是将数的尾数部分右移,这样尾数就会减小,为了保证数字正确,指数部分必须增大,这样就刚好达到我们的目的。
- 第四步,判断是否是规格化数,这是因为对尾数进行四舍五入的时候,可能发生不测,进而需要再次规格化。
硬件加的结构示意图:
3.5.3浮点乘法
流程图如下:
第一步中要减去一个偏阶值,是因为当两个指数相加时,偏阶值加了两次。
其他步骤和加法相似,第五步,符号要根据两个源操作数来确定,同号为正,异号为负。
3.5.4MIPS中的浮点指令
MIPS有如下指令来支持IEEE754标准:
浮点单精度加(add.s)和双精度加(add.d)。
浮点单精度减(sub.s)和双精度减(sub.d)。
浮点单精度乘(mul.s)和双精度乘(mul.d)。
浮点单精度除(div.s)和双精度除(div.d)。
浮点单精度比较(c.x.s)和双精度比较(c.x.d)。
其中x指的是,等于(eq),不等于(neq),小于(lt),小于等于(le),大于(gt),大于等于(ge)。
- 浮点比较为真跳转(bclt)和浮点比较为家跳转(bclt)。
MIPS增设了单独的浮点寄存器:$f0, $f1,$f2………。
浮点存取指令:lwc1,swc1。
双精度寄存器是一组单精度寄存器的偶数-奇数对,并使用偶数寄存器作为名称,列如,单精度 \$f2和 \$f3作为双精度\$f2。
关于上述的比较和跳转指令给出如下例子和解释:
3.5.5算法精确性
- IEEE754在计算中间值的时候,会在右边多保留2位,分别称为保护位和舍入位。
- 保护位:在浮点计算中,右边多保留的两位中的第一位。
- 舍入位:在浮点计算中,右边多保留的两位中的第二位。
就是说比起规格化数的话,他会在右边多出两位,以提高最终结果的精度。