浮点数的加减法运算

浮点数的加法运算分为六个步骤:
1> 真值到机器数的转化(补码)
2> 对阶
3> 尾数加减
4> 结果规格化
5> 舍入处理
6> 溢出判断

我们先来看一个例子( 干八八的讲是在不好
X = -5/256, Y = +59/1024,按照补码运算规则计算 X-Y?,其中阶符占2位,阶码占3位,数符占2位,尾数占9位。

1> 真值到机器数的转化
-5(D) = -101(B)1/256  = 2^-8  --> X = 101 * 2^-8     = -0.101 * 2^-5   = -0.101 * 2^-101(101为二进制)
59(D) = 111011(B)1/1024 = 2^-10 --> Y = 111011 * 2^-10 = 0.111011 * 2^-4 = 0.111011 * 2^-100(100为二进制)

2> 对阶:使两个数的阶码相等,小阶向大阶看齐,尾数每右移一位,阶码 + 1
X():11011,11.011000000 
## 11(阶符)011(阶码),11(数符).011000000(尾数), 因为是负数,此时的阶码和数符补码为011
Y():11100,00,111011000
## 11(阶符)100(阶码),00(数符).111011000(尾数), 因为是正数,此时的原码和补码相同

此时对阶时需要求阶差,在计算机中不知大小,则用 ~~前一个 - 后一个~~    
E = 11011 - 11100 = 11011 + 00100 = 11111 --> 原码为 10001 = -1
此时的尾数向右移一位,因为该数为负数,所以空出来的数符位应该补 1
X = 11011,11.101100000

3> 尾数相减
—Y = 11100,11.000101000([Y]-> [-Y]补 连符号位一起取反再 + 1)
X - Y = 11.101100000 + 11.000101000 = 10.110001000

4> 规格化(右规形成如11.0..., 00.1...形式)
X - Y = 11100,10.110001000 = 11100,11.011000100

5> 舍入: 无舍入

6> 判溢出:属于常阶码,无溢出,可得此时真值为 2^-3 * (-10011101)

问:这是这一题完整的步骤,看懂了吗?
答:没看懂。
问:没关系,我一开始也没看懂,多看几遍说不定就懂了。

因为这是必须按照补码进行运算,所以在计算的时候,都是按照补码的形式做的。

这里用到了两次右规,分别是对阶和规格化这两步,告诉你一个秘密,数符符号为和尾数最高位为11.0或00.1时,此时无需在进行规格化,因为它已经满足了对应规格化的要求。

在讲一下这里的舍入问题,为什么回产生舍入呢?
–> 因为在进行移位时,尾数会多加 1 位,但是尾数由题意只满足对应的尾数,超过的一位就应该舍弃,比如 11100,10,11000100,在进行右规时,变成 11100,11,0110001000,此时的最后一位0应该舍弃,因为尾数只能有九位,解决办法有两种:“0” 舍 “1” 入恒置 “1” 法
“0” 舍 “1” 入:舍就直接舍了,但入可能会产生进位至数符位,此时产生溢出,这时又得做一次右规。
恒置 “1” 法: 最后一位直接写 1 即可。

我们再来谈谈数据范围和损失精度问题?
char -> int -> long -> double
float -> double
数据范围从小至大,不存在损失精度的问题。
问:但int -> float和float -> 会损失精度吗?
答:会。
问:为什么?
答:你猜。
问:因为int -> float是因为int表示整数,而float表示但进度浮点数,int不能表示小数,此时转换为float损失精度,但float -> int 为什么会损失精度?
答:因为int表示32位整数,但float只能表示24位,数据太大时,自然也会损失精度啊!
最后贴一张各种数据类型的数据范围(所占大小):
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值