IEEE二进制浮点数算术标准(IEEE 754),是一个由 IEEE 制定的、用来在计算机中表示浮点数的标准,该标准目前已经被广泛的使用在计算机中。

IEEE 浮点数表示法是一个把浮点数用一个二进制整数表示出来的方法,而这个整数经过一定的转换,也可以重新转换为我们所需要的浮点数。为了介绍这一方法,首先需要介绍一个浮点数的表示公式:v = (-1)S x M x 2E
其中:

  1. S 用来保存数字的正负
  2. M 我们称之为尾数(Mantissa),或者叫做有效数字(Significand)
  3. E 叫做指数(Exponent)
  4. 2 叫做基数(Base)

接来看一个例子:例如小数 9.62510,首先我们把其转换为二进制小数 1001.1012(如果你对转化不熟悉,可以参考十进制小数转二进制小数方法),然后把 1001.101 转换为 1.001101 x 23(IEEE要求必须且只能保留一位整数),此时对应上面的公式,S 应为0,M 应为1.001101,E 应为3。好了,我们已经成功的把一个小数用公式表达出来了,下一步就是怎么把我们得到的值用整数形式存储起来呢?

浮点数的存储方式有很多种方式,这里介绍两种使用最频繁的方式:单精度格式和双精度格式。

1.单精度格式的存储

在使用单精度存储时,需要使用到 4 个字节(32位)的存储空间,存储空间的使用如下图所示:

其中:

  • 0 ~ f 共有 23 位小数 fraction,他们是用来保存对应公式 M 处的值的,即用 0 ~ 22 位来保存尾数。在这里是按照从左到右的顺序来排放的数字的,即小数最高位在左侧,向右依次减小。又因为 IEEE 中的 M 的第一位必然为 1,所以一般只从第二位(小数的第一位)开始计算。
  • 23 ~ 30 位用来保存指数部分,如图所示 exponent (exp)。其中,exp = Bias + E。我们已经知道,E 表示的是指数部分的值,而对于单精度类型而言,Bias 为127。所以对于上面的例子: exp = 127 + 3 = 130,转化为二进制就是 ‭10000010‬。
  • 31 位用来保存 S,正为0,负为1。

根据如上面描述,我们例子中的 9.625 的单精度表示值就为 0 ‭10000010‬ 00110100000000000000000(记得去掉 M 的整数位,位数不够就在后面补零,位数过多就直接截取)。

2.双精度格式的存储

双精度和单精度的存储非常相似,只是双精度的存储需要占用8个字节。其中 fraction 提升到了 52 位(0 ~ 51),exp 占据 52 ~ 62,S 依旧占据最高位。此外,对于双精度存储而言, Bias(偏移量)的值为 1023,这是与单精度存储所不相同的。

参考:
1.浮点数与IEEE 754 - 狼の禅 - 博客园
2.IEEE 754 - 维基百科,自由的百科全书