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 = × × M
-
规格化
E = e − bias 其中,e 是 阶码的值,bias = − 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,如 或 ∞ − ∞
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 舍入
-
向下舍入
-
向上舍入