一. 实数的表达方法
1.定点数表示法
<整数部分>.<小数部分>
例. 666.66
2.浮点数表示法
- 科学计数法:有效数字+基数(base)+指数(exponent)+正负符号位
规范化表示:±d.ddd*β^e(0<=di<=β)
例. β=10, d范围[0,9]; β=2, d范围[0,1]
(1001.101)2 = 1*2^3+0*2^2+…+ 1*2^(-1) + 0*2^(-2) + 1*2^(-3) = 9.625
二. IEEE754标准的浮点表示法
V = (-1)s × M × 2E
1. 符号位(sign)s
s决定该数是正数(s=0)还是负数(s=1),十进制数0特殊处理
2. 阶码(exponent)
E = e- bias, 与15的偏差值
(1)可表示的数据量:2^5=32
(2)表示范围:规格化数据(normal data),E不全为0或者1, 11111和00000有其他含义
max_e = 11110 -01111 = 15
min_e = 00001 -01111 = -14
3. 尾数(significand)M
M是一个二进制小数,normal data中有一个隐含的1( 1.xxxxx)—— M=1+ M
min_M = 0000 0000 01 = 1 + 2^(-10) = 1.000976525
max_M = 1111 1111 11 = 1 0000 0000 00 – 0000 0000 01 = 1 + 2 ^0 -2^(-10) = 1.9990234375
三.数据表示范围(举例正数范围)
- normal value 规格化数
E不全为0或者1, M任意。
E=15, M= max ,S=0
--> 0 11110 1111111111 = (-1)^0 * 2^15 * (1 + 1 - 2^-10) = 65504 (FP16 最大值)
E = -14,M = 0 (min), S = 0
--> 0 00001 0000000000 = (-1)^0 * 2^-14 * (1 + 0) = 2^-14 ≈ 6.104 E-5 (最小正规格化数)
- Subnormal value 非规格化数
E = 00000, M不全为0时,表示subnormal value, 是非常小的数,表示接近0的数。
E=1-15=-14, 而不是0-15,原因:为了平滑过渡,通过增加1可以弥补subnormal value最高位没有的1,此时小数域最高不是1而是0
--> 0 00000 0000000001 = (-1)^0 * 2^-14 * (0 + 2^-10) = 2^-24 ≈5.96E-8
- 零
0 00000 0000000000 = (-1)^0 * 2^-14 * (0 + 0) = +0
1 00000 0000000000 = -0
- 无穷大
E=11111, M全为0
0 11111 0000000000 = +inf
1 11111 0000000000 = -inf
- NaN, not a number 非数值型
E=11111, M不全为0
四.浮点数舍入方式
结论:浮点数并不能表示所有的实数
比如十进制的2.1没有完全对应的二进制数,浮点数只能近似的表示一些实数,为了尽量精确的表示这个实数就只能尽量增加二进制的位数,但是数据类型的位数是有限的
IEEE浮点格式定义了多种的舍入方式,如:
方式 | 解释 | -2.50 | -1.50 | 1.50 | 2.50 | 1.6 | 1.4 |
Round half to even | 默认模式, 与我们熟悉的“四舍五入”比较的不同只有:对.5的舍入,采用取偶数的方式 | -2 | -2 | 2 | 2 | 2 | 1 |
Round toward 0(截断) | C/C++的类型转换 | -2 | -1 | 1 | 2 | 1 | 1 |
Round toward -∞ (向下舍入) | C/C++函数floor() | -3 | -2 | 1 | 2 | 1 | 1 |
Round toward +∞ (向上舍入) | C/C++函数ceil() | -2 | -1 | 2 | 3 | 2 | 2 |