float加法运算原理

以12.125 + 3.025为例:

设a = 12.125, 二进制为:01000001 01000010 00000000 00000000

Sa = 0, Ea = 1000 0010, Ma = 1.1000010 00000000 00000000

设b = 3.25,二进制为: 01000000 01010000 00000000 00000000

Sb = 0, Eb = 1000 0000, Mb = 1.1010000 00000000 00000000

(符号部分用S表示,指数部分用E表示,尾数部分用M表示)

 

1) 对阶

  两数相加,小数点位置对齐才可相加。所以,首先得让两数的指数相同,这边的话按大的指数对齐。

  比较两数的指数大小,按大的指数对齐(即:按Ea对齐),然后右移指数小的数的尾数(即:Mb右移Ea-Eb位)

  对阶后:

  Eb = 1000 0010

  Mb = 0.0110100 00000000 00000000 00,最后2个bit超出23bit,先放到一边后续会用于舍入处理,然后对尾数截断

  截断后 Mb = 0010100 00000000 00000000

 

2) 尾数相加

  Ma + Mb =

  1.1000010 00000000 00000000

  0.0110100 00000000 00000000

  = 1.1110110 00000000 00000000

 

3) 规格化结果

结果还是23bit,这边不需要处理

 

4) 舍入处理

  步骤1)中,超出的2个bit会在这边用于舍入处理,00没有超过11的一半,所以舍掉

 

5) 得出最终结果

  S = 0, E = 1000 0010, M = 1.1110110 00000000 00000000

  即:0(1000 0010)(1110110 00000000 00000000) = 15.375

 

参考

二进制浮点数以及二进制浮点数算术运算-CSDN博客

浮点数的加减乘除运算细节 - 立体风 - 博客园

float、double 的二进制表示、移码、舍入方案 - f9q - 博客园

浮点数运算的一些问题 - haruyuki - 博客园

Float (IEEE754 Single precision 32-bit) Converter

float相加产生精度损失的原因是什么? - 知乎

 

 
posted @   yanghui01  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示