浮点数加法——小班讨论3

博客简介

本博客是计算机系统小班讨论内容之一,记录小班讨论的浮点数加法运算规则

  • 浮点数加法规则
  • 实例
  • 汇编调试

浮点数加法规则

  • 对阶,小阶向大阶对齐:两个浮点数进行加减运算时,首先要使两个数的阶码相 同,即小数点的位置对齐。若两个数的阶码相同,表示小 数点的位置是对齐的,就可以对尾数进行加减运算。反之 ,若两个数的阶码不相同,表示小数点的位置没有对齐, 此时必须使两个数的阶码相同,这个过程称为对阶。
    将原来阶码小的数的尾数右移|△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 0000110111101101 00101000 10001100111101)
 向偶数舍入:
 ‬ value=00111111 110110000 10111110 00001110
  • 判断溢出
    由于在加法过程中没有出现进位,无溢出
1.690400

汇编调试

  • 反汇编objdump -d add1
    在这里插入图片描述
  • 首先将0x3dfcb924存入eax后压入栈中
  • 再将0x3fc89375与0x3dfcb924相加后入栈
  • 出栈将和存入内存0x1c(%esp)
原创文章 236 获赞 430 访问量 7万+

猜你喜欢

转载自blog.csdn.net/weixin_44307065/article/details/105151094