浮点数的加减计算总结

–本篇后面计算部分待纠正。因为右移时是否采用舍入的策略,需要仔细考量。不特别提出,是不是右移时简单的截断即可?

Update : 研究了其他习题的做法,不强调右移时如何舍入时,直接丢掉,算术右移,丢失精度。在补码移位中,有左零右一的说法,即左移:低位补0,右移:高位补1.

首先要说的是:浮点运算中的下溢指的是:运算结果的绝对值小于机器数所能表示的最小绝对值。

再看告知浮点数的格式,最大值问题:
设浮点数共12位,其中阶码含1位阶符共4位,以2为底,补码表示。尾数含一位数符共8位,补码表示,规格化。该浮点数所能表示的最大正数是?

解答:首先,我们马上可以构想出补码最大时的样子,因为和原码一样,是0.1111111…1形式。
这里呢,尾数含数符共8位,所以是0.1111111(7个1) , 我做的时候没有计算,直接认为是 227

实际上稍微算一下:
21+22++27=21(271)/(211)=12

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
浮点数加减计算组成原理中的一个重要概念。在计算机中,浮点数通常采用IEEE 754标准进行表示。在进行浮点数加减运算时,需要先将两个数的阶码进行比较,将阶码小的数的尾数进行移,使得两个数的阶码相同,然后再对尾数进行加减运算。最后,需要对结果进行规格化处理,即将结果的阶码尾数进行调整,使得结果符合浮点数的规格化要求。 以下是一个浮点数加减的Python代码示例: ```python def float_add_sub(a, b, op): # 将a和b转换为二进制表示 a_bin = bin(a)[2:] b_bin = bin(b)[2:] # 将a和b的符号阶码尾数分离出来 a_sign = int(a_bin[0]) a_exp = int(a_bin[1:9], 2) a_frac = int(a_bin[9:], 2) b_sign = int(b_bin[0]) b_exp = int(b_bin[1:9], 2) b_frac = int(b_bin[9:], 2) # 计算a和b的真值 a_val = (-1)**a_sign * (1 + a_frac / 2**23) * 2**(a_exp - 127) b_val = (-1)**b_sign * (1 + b_frac / 2**23) * 2**(b_exp - 127) # 比较a和b的阶码,将阶码小的数的尾数进行移 if a_exp < b_exp: a_frac <<= b_exp - a_exp a_exp = b_exp else: b_frac <<= a_exp - b_exp b_exp = a_exp # 对尾数进行加减运算 if op == '+': res_frac = a_frac + b_frac else: res_frac = a_frac - b_frac # 判断结果是否需要进行规格化处理 if res_frac >= 2**23: res_frac >>= 1 res_exp = a_exp + 1 else: res_exp = a_exp # 将结果转换为二进制表示 res_sign = 0 if a_val + b_val >= 0 else 1 res_frac_bin = bin(res_frac)[2:].zfill(23) res_exp_bin = bin(res_exp)[2:].zfill(8) res_bin = str(res_sign) + res_exp_bin + res_frac_bin # 将结果转换为十进制表示 res_val = (-1)**res_sign * (1 + res_frac / 2**23) * 2**(res_exp - 127) # 返回结果的二进制表示和十进制表示 return res_bin, res_val ``` 使用上述代码,可以进行浮点数加减运算。例如,对于两个浮点数a=1.5和b=-0.75,可以进行如下的加减运算: ```python a = 0b00111111110000000000000000000000 # 1.5的二进制表示 b = 0b10111111100000000000000000000000 # -0.75的二进制表示 res_bin, res_val = float_add_sub(a, b, '+') # 进行加法运算 print(res_bin) # 输出:00111111110010000000000000000000,1.5-0.75=0.75的二进制表示 print(res_val) # 输出:0.75 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值