浮点数在内存中的存储

1、IEEE浮点标准

根据IEEE的标准,任意一个浮点数V可以用下面的公式来表示:

V = (-1)s * 2e * M

  • s – 符号,决定是正数还是负数
  • E – 阶码,对浮点数的加权,权重是2的E次幂(可能是负数)
  • M – 尾数,一个二进制小数,它的范围是0至1,或者1到2(后面进行说明)

将浮点数的位划分为三个段,分别对应上述公式中的3个变量。

  • s位一个单独的符号位
  • k位的阶码字段 exp,用来编码E
  • n位小数字段 frac,用来编码M,但编码出来的值也依赖阶码字段是否等于0

浮点数在内存中的存储_第1张图片从上图可知:

单精度浮点:
1位符号位,8位阶码以,23位尾数

双精度浮点:
1位符号位,11位阶码,52位尾数

如果给定了位 s 的表示,根据 exp 的值,被编码的值可以分为三种不同的情况(最后一种情况有两个变种)。下图是单精度的情况:

浮点数在内存中的存储_第2张图片
三种不同的情况下阶码E和尾数M的计算方法不同,下面就对着三种情况进行整理。

2、规格化

是否是规则化,主要根据 exp的值来定。

规则化时:exp 的位既不全为0(数值0),也不全为1(单精度位255,双精度位2047),这是最普遍的情况。

在这种情况下,阶码字段被解释为以 “偏置” 形式表示的有符号正数。“偏置”的意思就是在原有的值基础上加上一个偏移量,对于阶码位数为k的情况来说,偏移量 Bias = 2k-1-1。假设e是阶码二进制表示的无符号数值,那么真实的价码 E = e - Bias

对于单精度来说,阶码位数为8,则Bias = 28-1-1 = 127,对于多精度来说,阶码位数为11,则Bias = 211-1-1 = 1023。

小数段位frac被解释为描述小数值f,其二进制表示为 0.fn-1…f1f0,也就是二进制小数点在最高有效位的左边。尾数M = 1 + f,M可以看成一个二进制表达式为 1.fn-1…f1f0 的数字,1是固定的,所以可以隐藏掉

示例:
二进制 0 10000010 01000111010111000010100 表示的十进制。

符号s 为0,表示正数
阶码 E = 130 -127 = 3
尾数 M = 1.01000111010111000010100
浮点数 V = (-1)s * 2e * M = +1.01000111010111000010100 * 23 = 1010.001110101110000101

整数部分:1010 的十进制为 10。
小数部分:0. 001110101110000101的十进制为1*2(-3)+1*2(-4)+ 1*2(-5) + 1*2(-7)+ 1*2(-9)+ 1*2(-10)+ 1*2(-11)+ 1*2(-16) +1*2(-18)=0.23

所以0 10000010 01000111010111000010100 表示的浮点数为 10.23。

3、非规格化

当阶码 位exp 全为0 时,所表示的数是非规格化的。此时,阶码值 E = 1 - Bias,为尾数 M = f = 0.fn-1…f1f0 。

非规则化有两个用途:

  1. 提供了表示数值0 的方法,规则化的 M总是大于等于1的
  2. 表示那些非常接近于 0.0的数

4、特殊值

当阶码 位exp 全为1 时,所表示的数是特殊值的。这里又分了两种情况

  • 当frac位全为0时,表示正负无穷,根据s来定。
  • 当frac位不全为0时,表示这个数不是一个有效值(NaN)

浮点数的知识就整理到这里了。

感谢大家,我是假装很努力的YoungYangD(小羊)

参考资料:
《深入理解计算机系统》
https://www.jianshu.com/p/f0537a661a5e
https://zhuanlan.zhihu.com/p/43804632

你可能感兴趣的:(计算机基础)