浮点数
浮点数的定义:
d=i=−n∑m2i×di
这个定义导致我们只有在表示2kx时候是精确的,其它数字的小数部分都会变成循环小数。而由于这些数字的编码长度都是有限的,通过这种表达方式表示的浮点数都是有限的。
IEEE 浮点数标准
以下内容引用自文章【读薄 CSAPP】壹 数据表示
IEEE 的浮点数标准更多是从数值角度来建立的,对于舍入,上溢出和下溢出都有比较统一的处理方法。但与此同时也给硬件优化带来了比较大的困难。因为和平时使用的数制也有一定差异,从理解的角度来看不够直观,但是好在主流的 CPU 都支持浮点数,所以我们不必过多涉及这方面的细节。
在 IEEE 标准中,我们用下面的公式来表达浮点数:
(−1)sM2E
其中 s 是符号位,决定正负;M 通常是一个值在 [1.0, 2.0) 的小数;E 是次方数。具体编码时结构如下,这里用单精度、双精度和扩展精度为例:其中 s 是符号位,决定正负;M 通常是一个值在 [1.0, 2.0) 的小数;E 是次方数。具体编码时结构如下,这里用单精度、双精度和扩展精度为例:
下图中 s
对应着符号位,exp
对应着 E(注意,不一定等于 E,因为位数限制表达能力有限),frac
对应着 M
(注意,不一定等于 M
,因为位数限制表达能力有限)。不同的位数就代表了不同的表示能力,也就是单精度,双精度,扩展精度的来源。
形式 |
指数 |
小数部分 |
零 |
0 |
0 |
非规约形式 |
0 |
大于0小于1 |
规约形式 |
1到2e−2 |
大于等于1小于2 |
无穷 |
2e−1 |
0 |
NaN |
2e−1 |
非0 |
例子如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| s exp frac E 值 ------------------------------------------------------------------ 0 0000 000 -6 0 0 0000 001 -6 1/8 * 1/64 = 1/512 0 0000 010 -6 2/8 * 1/64 = 2/512 ... 0 0000 110 -6 6/8 * 1/64 = 6/512 0 0000 111 -6 7/8 * 1/64 = 7/512 ------------------------------------------------------------------ 0 0001 000 -6 8/8 * 1/64 = 8/512 0 0001 001 -6 9/8 * 1/64 = 9/512 ... 0 0110 110 -1 14/8 * 1/2 = 14/16 0 0110 111 -1 15/8 * 1/2 = 15/16 0 0111 000 0 8/8 * 1 = 1 0 0111 001 0 9/8 * 1 = 9/8 0 0111 010 0 10/8 * 1 = 10/8 ... 0 1110 110 7 14/8 * 128 = 224 0 1110 111 7 15/8 * 128 = 240 ------------------------------------------------------------------ 0 1111 000 n/a 无穷
|
今日体重