深入理解计算机系统 2.4.2 IEEE浮点表示详细讲解

定义

IEEE浮点标准用以下公式表示\(V = (-1)^s * M * 2^E\)

  • 符号(sign):s决定这书是负数(s = 1)还是正数(s = 0),而对于数值0的符号位解释作为特殊情况处理 。
  • 尾数(significand):M是一个二进制小数,它的范围是\(1 ~ 2-\varepsilon\),或者是\(0 ~ 1-\varepsilon\)。
  • 阶码(exponent):E的作用是对浮点数加权,这个权重是2的E次幂(可能是负数)。

将浮点数的位表示划分为三哥字段,分别对这些值进行编码:

  • 一个单独的符号位s直接编码符号s。
  • k位的解码字段\(exp=e_k-1…e_1e_0\)编码阶码E。
  • n为小数字段\(frac=f_k-1…f_1f_0\),但是编码出来的值也依赖于解码字段的值是否为0.

在单精度浮点格式(C语言中的float中),s、exp和frac字段分别为1位、k=8位和n=23位,得到一个32位的表示。在双精度浮点格式(C语言中的double)中,s、exp和frac字段非别为1位、k=11位和n=52位,得到一个64位的表示。

avatar

给定位表示,根据exp的值,呗编码的值可以分成三种不同的情况(最后一种情况有两个变种)。

avatar

情况1:规格化的值

当exp的为模式既不全为0(数值0),也不全为1(单精度数值为255,双精度数值为2047)时,都属于这种情况。在这种情况中,阶码字段被解释为以偏置(biased)形式表示的有符号整数。阶码的值是E=e-Bias,其中e是无符号数,其位表示为\(e_k-1…e_1e_0\),而Bias是一个等于\(2^{k-1} - 1\)(单精度是127,双精度是1023)的偏置值。由此阐述指数的取值范围,杜宇单季度是-126+127,而双精度是-1022+1023。

小数字段frac被解释为描述小数值f,其中\( 0 \leq f < 1\),其二进制表示为\( 0.f_{n-1}…f_1f_0\),也就是二进制小数点在最高有效位的左边。尾数定义为M = 1 + f。有时,这种方式也叫做隐含的以1开头的(implied leading 1)表示,因为我们可以把M看成一个二进制表达式为\( 1.f_{n-1}…f_1f_0\)的数字。既然我们总是能够调整阶码E,是的尾数M在范围\( 1 \leq M < 2\)之中(假设没有溢出),那么这种表示方法是一种轻松获得一个额外精度位的技巧。既然第一位总是等于1,那么我们就不需要显示的表示它。

情况2:非规格化的值

当阶码域全为0时,所表示的书是非格式化形式。在这种情况下,阶码值是E=1-Bias,而尾数的值是M=f,也就是小数字段的值,不包含隐含的靠头1。

使阶码为1-Bias而不是简单的-Bias似乎是违反直觉的。这种方式提供了一种从非格式化值平滑转换到规格化值的方法。

非格式化数有两个用途。首先他们提供了一种表示数值0的方法,因为使用规格化数,我们必须总是使\( M \geq 1\),因此我们不能表示0。实际上,+0.0的浮点表示的位模式为全0:符号位是0,阶码字段全为0(表名是一个非规格化值),而小数域也全为0,这就得到M=f=0
。当符号位为1,而其它域全为0时,我们得到值-0.0.根据IEEE的浮点格式,值+0.0和-0.0在某些方面呗认为是不同的,而在其他方面是相同的。
非规格化书的另外一个功能是表示那些非常接近于0.0的数。他们提供了一种属性,称为逐渐溢出(gradual underflow),其中,可能的数值分布均匀的接近于0.0。

情况3:特殊值

最后一类数值是当指阶码全为1的时候出现的。当小数域全为0时,得到的值表示无穷,当s=0是\(+\infty\),或者当s=1时是\(-\infty\)。当我们把两个非常大的数相乘,或者除以零时,无穷能够表示溢出的结果。当小数域为非零时,结果值被称为"NaN",即"不是一个数(Not a Number)"的缩写。一些运算的结果不能是实数或无穷,就会返回这样的NaN的值,比如当计算\(\sqrt-1\)或\(\infty-\infty\)时。

示例

上面的书上有,下面的书上没有,我用例子详细讲解一下理论如何套上实际。

假如一个基于IEEE浮点个事的5位浮点表示,有1个符号位、2个阶码位(k=2)和两个小数位(n=2)。阶码偏置量\(2^{2-1}-1=1\)。

下表中列举了这个5位浮点表示的全部非负取值范围。使用下面的条件,填写表格中的空白项:

e:假设阶码字段是一个无符号证书所表示的值。

E:偏置之后的阶码值。

\(2^E\):阶码的权重。

f:小数值。

M:尾数的值。

\(2^E\) * M:该数(未规约的)小数值

V:该数规约后的小数值。

十进制:该数的十进制表示。

写出\(2E\)、f、M、\(2E\) * M和V的值,要么是整数(如果可能的话),要么是形如\(\frac{x}{y}\)的小数,这里y是2的幂。标注"-"的条目不用填。

e E \(2^E\) f M \(2^E\) * M V 十进制
0 00 00
0 00 01
0 00 10
0 00 11
0 01 00
0 01 01
0 01 10
0 01 11
0 10 00
0 10 01
0 10 10
0 10 11
0 11 00 - - - - - - -
0 11 01 - - - - - - -
0 11 10 - - - - - - -
0 11 11 - - - - - - -

1 非规格化的值

很明显在0 00 11之前都是非结构化数据,用0 00 00来举例,所以根据定义以及题目

  • k=2
  • n=2
  • \(Bias=2^{k-1} - 1=1\)
  • e(exp)=00
  • E=1-Bias=0
  • \(2^E=1\)
  • M=f(frac)=0
  • \(2^E * M=0\)
  • \(V = (-1)^s * M * 2^E=0\)
  • 十进制=0

所以更新上表如下

e E \(2^E\) f M \(2^E\) * M V 十进制
0 00 00 0 0 1 \(\frac{0}{4}\) \(\frac{0}{4}\) \(\frac{0}{4}\) 0 0

这里比较重要的是f和M的值,为什么是分数\(\frac{0}{4}\)呢,原文提到***小数字段frac被解释为描述小数值f,其中\( 0 \leq f < 1\),其二进制表示为\( 0.f_{n-1}…f_1f_0\),也就是二进制小数点在最高有效位的左边。***因为他在小数点右边,且n=2,所以
\(f=0 * 2^{-1}+0 * 2^{-2}\)(这部分内容时二进制数的位模式,这个自行补习)

2 规格化的值

从0 01 00开始到0 11 00之前都是规格化的值,我用0 01 00举例,所以根据定义

  • k=2
  • n=2
  • \(Bias=2^{k-1} - 1=1\)
  • e=01(十进制)=1(二进制)
  • E=e-Bias=0
  • \(2^E=1\)
  • \(f=0 * 2^{-1}+0 * 2^{-2}=0\)
  • \(M=1+f=\frac{4}{4}\)
  • \(2^E * M = 1\)
  • \(V = (-1)^s * M * 2^E=1\)
  • 十进制=1
e E \(2^E\) f M \(2^E\) * M V 十进制
0 01 00 1 0 1 \(\frac{0}{4}\) \(\frac{4}{4}\) \(\frac{4}{4}\) 1 1

3 特殊值

从0 11 00开始到结束是特殊值,根据定义

e E \(2^E\) f M \(2^E\) * M V 十进制
0 11 00 - - - - - - \(\infty\) -
0 11 01 - - - - - - NaN -
0 11 10 - - - - - - NaN -
0 11 11 - - - - - - NaN -

全部结果如下

e E \(2^E\) f M \(2^E\) * M V 十进制
0 00 00 0 0 1 \(\frac{0}{4}\) \(\frac{0}{4}\) \(\frac{0}{4}\)
0 00 01 0 0 1 \(\frac{1}{4}\) \(\frac{1}{4}\) \(\frac{1}{4}\)
0 00 10 0 0 1 \(\frac{2}{4}\) \(\frac{2}{4}\) \(\frac{2}{4}\)
0 00 11 0 0 1 \(\frac{3}{4}\) \(\frac{3}{4}\) \(\frac{3}{4}\)
0 01 00 1 0 1 \(\frac{0}{4}\) \(\frac{4}{4}\) \(\frac{4}{4}\)
0 01 01 1 0 1 \(\frac{1}{4}\) \(\frac{5}{4}\) \(\frac{5}{4}\)
0 01 10 1 0 1 \(\frac{2}{4}\) \(\frac{6}{4}\) \(\frac{6}{4}\)
0 01 11 1 0 1 \(\frac{3}{4}\) \(\frac{7}{4}\) \(\frac{7}{4}\)
0 10 00 2 1 2 \(\frac{0}{4}\) \(\frac{4}{4}\) \(\frac{8}{4}\)
0 10 01 2 1 2 \(\frac{1}{4}\) \(\frac{5}{4}\) \(\frac{10}{4}\)
0 10 10 2 1 2 \(\frac{2}{4}\) \(\frac{6}{4}\) \(\frac{12}{4}\)
0 10 11 2 1 2 \(\frac{3}{4}\) \(\frac{7}{4}\) \(\frac{14}{4}\)
0 11 00 - - - - - - \(\infty\) -
0 11 01 - - - - - - NaN -
0 11 10 - - - - - - NaN -
0 11 11 - - - - - - NaN -

猜你喜欢

转载自blog.csdn.net/ciqingloveless/article/details/83545012