十进制浮点数与IEEE浮点数互转

2021-03-06  本文已影响0人  JamFF

理论

浮点数在计算机中存储也是以二进制的形式,遵循 IEEE 二进制算数标准:

IEEE浮点标准

IEEE 标准从逻辑上采用一个三元组{S,E,M}来表示一个数 V:

V=(-1)^s \times M \times 2^E

浮点数的格式

上面这个图简单说就是:

示例

例1:将十进制 float 类型 9.0 转换为二进制表示

  1. 将 9.0 转换为二进制表示:1001.0
  2. 使用科学计数法表示:1.001\times2^{3}
  3. 确定符号(1位),由于是正数,所以符号位是:0
  4. 确定阶码(8位),指数是 3,但是这里需要用移码方式来表示。8 位的指数范围是:-127~128,所以需要偏移 127 才能保证没有负数,就是 130,用二进制表示:10000010
  5. 确定尾数(23位):尾数为:001,后面需要补 0 直到 23 位:00100000000000000000000
  6. 最终 float 类型 9.0 的二进制表示为:01000001000100000000000000000000

例2:将二进制 float 类型 11000000101000000000000000000000 转换为十进制表示

  1. 截取符号(1位),由于是 1,所以为负数;
  2. 截取阶码(8位),10000001,转换为十进制是 129,这是移码的表示方式,需要反向偏移 127,所以指数为:2;
  3. 截取尾数(23位),忽略后面的 0,尾数为:01
  4. 由此可以推断出,科学计数法表示:-1.01\times2^{2}
  5. 不使用科学计数法,二进制表示:-101
  6. 最终十进制表示为:-5.0

总结

上面都是简单的示例,用来了解转换步骤,至于 double 类型也是大同小异。

对于带有小数部分的浮点数,例如:8.25 如何转化;以及阶数的非规格化处理等等,这些不过多展开,建议大家自己看下《深入理解计算机系统》这本书。

最后附上一个【IEEE单精度浮点数转换工具】方便大家测试。

上一篇下一篇

猜你喜欢

热点阅读