博客简介
本博客是计算机系统小班讨论内容之一,记录小班讨论的浮点数加法运算规则
- 浮点数加法规则
- 实例
- 汇编调试
浮点数加法规则
-
对阶,小阶向大阶对齐:两个浮点数进行加减运算时,首先要使两个数的阶码相 同,即小数点的位置对齐。若两个数的阶码相同,表示小 数点的位置是对齐的,就可以对尾数进行加减运算。反之 ,若两个数的阶码不相同,表示小数点的位置没有对齐, 此时必须使两个数的阶码相同,这个过程称为对阶。
将原来阶码小的数的尾数右移|△E|位,其阶码值加上|△E|, 即每右移一次尾数要使阶码加1,则该浮点数的值不变(但 精度变差了) -
尾数进行加法运算 :实现尾数的加运算,对两个完成对阶后的浮点数执行求和 操作。
-
结果规格化并进行舍入处理 :如果尾数不是规格化数,则需要进行规格化处理,并进 行舍入
-
判断溢出:根据阶码来判断是否溢出
实例
代码如下:
#include <stdio.h>
int main()
{
float a,b,c;
a=0.1234;//0
b=1.567;
c=a+b;
printf("%f\n",c);
return 0;
}
转化a:
value=0.1234=
0.000111111001011100100100011101000101001110001110111101
=1.11111001011100100100011101000101001110001110111101*2^-4
s=0
exp=-4+127=123=111 1011
frac=000111111001011100100100011101000101001110001110111101
value=0 0111101111111001011100100100011101000101001110001110111101
转化b:
value=1.567
1.10010001001001101110100101111000110101001111111=1.10010001001001101110100101111000110101001111111*2^0
s=0
exp=127=01111111
frac=10010001001001101110100101111000110101001111111=1.10010001001001101110100101111000110101001111111
value=0 01111111 10010001001001101110100101111000110101001111111
- 对阶:
a=1.11111001011100100100011101000101001110001110111101*2^-4
b=1.10010001001001101110100101111000110101001111111*2^0
小阶右移位向大阶对齐:
a=0.000111111001011100100100011101000101001110001110111101*2^0
b=1.10010001001001101110100101111000110101001111111*2^0
- 尾数运算:
a=0.000111111001011100100100011101000101001110001110111101*2^0
b=1.10010001001001101110100101111000110101001111111*2^0
——————————————————————————————————————————————————————————————————
01.101100001011111000001101111011010010100010001100111101
- 结果规格化并进行舍入
01.101100001011111000001101111011010010100010001100111101*2^0
s=0
exp=127=01111111
frac=101100001011111000001101111011010010100010001100111101
value=00111111 110110000 10111110 00001101 (11101101 00101000 10001100111101)
向偶数舍入:
value=00111111 110110000 10111110 00001110
- 判断溢出
由于在加法过程中没有出现进位,无溢出
1.690400
汇编调试
- 反汇编
objdump -d add1
- 首先将0x3dfcb924存入eax后压入栈中
- 再将0x3fc89375与0x3dfcb924相加后入栈
- 出栈将和存入内存0x1c(%esp)