关于浮点数在内存当中的表示

来源:互联网 发布:频响软件 编辑:程序博客网 时间:2024/05/23 19:20

1.IEEE754标准

  电气和电子工程师协会(IEEE)定义了几种存储浮点数的标准。最常用的就是单精度和双精度。
  单精度数据格式采用总共32位(4字节)来存储一个浮点表示法的实数。符号占用1位,指数占用8位(采用余127码),尾数使用23位(无符号数)。
  双精度数据格式采用总共64位(8字节)来存储一个浮点表示法的实数。符号占用1位,指数占用11位(采用余1023码),尾数使用52位(无符号数)。

2.单精度表示方法

  下面以单精度为例讨论浮点数的表示方法:
这里写图片描述

符号位S:占用1位,0表示正,1表示负;

指数位E:指数为占用8位,采用余127码系统,可表示的值为0~255,其中,0和255(即8位全部为1)是两个特殊值,后面会详细讨论。姑且认为指数位可表示的值为1~254,对应的指数范围是-126~127.

尾数位M:尾数位占用23位,表示小数位,范围从0~2^23-1.

一个实数存储为浮点数格式的步骤是:

  1. 在S中存储符号(0或1)

  2. 将数字转换为二进制

  3. 规范化

  4. 找到E,M的值

  5. 连接S,E,M

例子:写出十进制-5.75的127余码表示。

  1. 符号位为1,S=1;

  2. 5.75=101.11=1.011122

  3. E=2+127=129,M=0111

    因此,5.75的单精度表示方法为:

1 10000001 10110000000000000000000

类似的,对于-161.875有:

161.875=10100001.111=1.0100001111*2^7S=1;E=7+127=134=10000110;M=0100001111;//单精度表示为:1 10000110 0100001111;

3.几个特殊情况

  1. 指数E=0时,有效数最高位为0,而不再是1,只有当0<E<281
    时,有效数最高位为1。当指数位为0,且位数位为0时,表示+-0。

  2. 指数E=281且尾数部分为0,则表示正无穷大或者负无穷大,视符号位而定。

  3. 指数E=281且尾数部分不为0,则表示这不是一个数。

百度百科对这几条规则解释的很清楚,参见IEEE754

4.上溢和下溢

由上面的规则可以推导出32位浮点数的表示范围。
正最大值:

S E M 0 11111110 11111111111111111111111

Nmax=+(1224)×2+128

正最小值:

S E M 0 00000001 00000000000000000000001

Nmax=+(121)×2127

负最大值:
Nmax=(1224)×2+128

负最小值:
Nmax=(121)×2127

0 0