浮点数表示对形如$V=x*2^y$的有理数进行编码

二进制小数

  • 十进制小数表示法使用如下形式的表示: $$d_md_{m-1}…d_1d_0.d_{-1}d_{-2}…d_{-n}$$

  • 其中每个十进制数$d_i$的取值范围是$0\sim9$。这个表达式描述的数值$d$定义如下: $$d=\sum_{i=-n}^{m}10^i*d_i$$

  • 数字权的定义与十进制小数点符号“.”相关,这意味着小数点左边的数字的权是10的正幂,得到整数值,而小数点右边的数字的权是10的负幂,得到小数值。

  • 二进制小数的表示形如 $$b_mb_{m-1}…b_1b_0.b_{-1}b_{-2}…b_{n-1}b_{-n}$$

  • 其中每个二进制数字,$b_i$的取值范围为0和1。

  • 这种表示方法表示的数$b$定义如下: $$b=\sum_{i=-n}^{m}2^i*b_i$$

  • 符号“.”现在是二进制的小数点,点左侧的位的权是2的正幂,点右侧的位的权是2的负幂。

  • 二进制表示法只能准确表示那些能够被写成$x*2^y$的数,其他的值只能够近似地表示。

  • 以上统称为定点表示法,不能很有效地表示非常大地数字。例如,表达式$5*2^{100}$是101后面跟随100个零的位模式来表示。

IEEE浮点表示

  • 通过给定$x$和$y$的值,来表示形如$x*2^y$的数。

  • IEEE浮点标准用$V=(-1)^sM2^E$的形式来表示一个数:

    • 符号$s$决定这数是负数($s=1$)还是整数($s=0$),而对于数值0的符号位解释作为特殊情况处理。
    • 尾数$M$是一个二进制小数吗,它的范围是$1\sim2-\epsilon$或者是$0\sim1-\epsilon$。
    • 阶码$E$的作用是对浮点数加权,这个权重是2的$E$次幂。
    • 一个单独的符号位$s$直接编码符号$s$。
    • $k$位的阶码字段$exp=e_{k-1}…e_1e_0$编码阶码$E$。
    • $n$位小数字段$frac=f_{n-1}…f_1f_0$编码尾数$M$,但是编码出来的值也依赖于阶码字段的值是否等于$0$。
  • 在单精度浮点格式(float)中,$s$、$exp$、$frac$字段分别为$1$、$k=8$位、$n=23$位,得到一个32位的表示。

  • 在双精度浮点格式(double)中,$s$、$exp$、$frac$字段分别为$1$、$k=11$位、$n=52$位,得到一个64位的表示。

  • 给定位表示,根据$exp$的值,被编码的值可以分为三种不同的情况。

  • 规格化的值

    • 当$exp$的位模式既不全为0,也不全为1(单精度为255,双精度为2047),都属于这种情况。在这种情况下,阶码字段被解释为以偏置形式表示的有符号整数。也就是说,阶码的值是$E=e-Bias$,其中$e$是无符号数,其位表示为$e_{k-1}…e_1e_0$,而$Bias$是一个等于$2^{k-1}-1$(单精度为127,双精度为1023)的偏置。由此产生指数的取值范围,对于单精度是$-126\sim+127$,对于双精度是$-1022\sim+1023$。
    • 小数字段$frac$被解释为描述小数值$f$,其中$0\leq f<1$,其二进制表示为$0.f_{n-1}…f_1f_0$,也就是二进制小数点在最高有效位的左边。尾数定义为$M=1+f$,这种方式也叫做隐含的以1开头的表示,因此我们可以把$M$看成一个二进制表达式为$1.f_{n-1}f_{n-2}…f_0$的数字。
  • 非规格化的值

    • 当阶码域为全0时,所表示的数是非规格化形式。在这种情况下,阶码值是$E=1-Bias$,而尾数的值是$M=f$,也就是小数字段的值,不包含隐含的开头的1。
    • 使阶码值为$1-Bias$而不是$-Bias$,这会使非规格化值平滑转换到规格化值。
    • 非规格化值有两个用途。1、提供了一种表示数值0的方法,因为使用规格化数,我们必须总是使$M\geq 1$,因此不能表示0。实际上,$+0.0$的浮点表示的位模式为全0。2、表示那些非常接近于$0.0$的数。
  • 特殊值

    • 当阶码全为1时,即为特殊值。当小数域为全0时,得到的值表示无穷,当$s=0$时是$+\infty$,当$s=1$时是$-\infty$。当小数域为非零时,结果值被称为“NaN”。
  • 8位浮点数非负值表示示例: 8位浮点数表示

舍入

浮点数计算

  • 对阶
    • 小阶向大阶对齐,尾数右移。
  • 尾数运算
  • 结果规格化
  • 舍入处理