浮点数的表示方法(from CSAPP)

252 阅读1分钟

1. IEEE 浮点数表示

  • 我们用 s 表示符号位(s)的位数,k 表示阶码(exp)的位数,n表示尾数(frac)的位数,也就是上面这个图从左到右的三个部分。

单精度浮点数表示(float in C):s = 1, k = 8, n = 23 32bit 表示

双精度浮点数表示(double in C):s = 1, k = 11, n = 52 64bit 表示

2. 根据 exp 的值,可以分为三种不同情况(以单精度为例)

表示的值 V = (1)s(-1)^s × 2E2^E × M

  • 规格化

    E = e − bias 其中,e 是 阶码的值,bias = 2k12^{k−1} − 1(k是阶码的位数);

    M = 1 + f 其中,0 <= f < 1,采用隐藏最高位 1 的表示方法;

    question:为什么 bias 这样设计?

  • 非规格化

    E = 1 − bias

    M = f

    可以表示 0,−0.0 和 +0.0 在某些方面被认为不同,而在另一些方面则被认为相同。

可以表示非常接近 0.0 的值,它们提供了一种称为 "逐渐下溢" (gradual underflow) 的特性,即可能的数值在 0.0 附近均匀分布。

  • 特殊值

    无穷大,可以表示结果溢出,如两个非常大的数相乘,除 0 操作;

    NaN,Not a Number,如 1\sqrt{-1} 或 ∞ − ∞

3. Example Numbers

以一个 6 bit的表示为例,s = 1,k = 3,n = 2;

一个 8bit 的表示,s = 1,k = 4,n = 3;

4. 舍入

主要有四种舍入方式

  • 向偶数舍入

    对于小数,如果不在两个数的正中间,采取向最近整数舍入的方式,如 1.6 舍入至 2,1.4 舍入至 1;

    如果小数在两个数的正中间,采用向偶数取整的方式,如 1.5 舍入至 2,2.5 舍入至 2。

  • 向 0 舍入

  • 向下舍入

  • 向上舍入