对于指数(阶码)和尾数我们有4种特殊情况
- 指数全0,尾数全0
- 指数全0,尾数非0
- 指数全1,尾数全0
- 指数全1,尾数非0
无穷(3)
- 正无穷:0 11111111 0000 0000 0000 0000 0000 000
- 负无穷:1 11111111 0000 0000 0000 0000 0000 000
在C语言中,一个int型数据除0,结果会溢出。
但是浮点型数据除0,结果是无穷。
非数(4)
- sqrt(-4)=?
- 0.0/0=?
- 无穷加无穷=?
- 无穷除无穷=?
以上类似这种得不出结果的式子,结果用非数(NaN)表示。对应的浮点数的指数全1,尾数非0 。
零(1)
指数全0,尾数全0用来表示0
0.00000000
×
2
−
126
0.0000 0000\times2^{-126}
0.00000000×2−126
非规格化数(2)
我们知道浮点数是有范围的,靠近0之间的数无法用规格化数表示。即-2-126至2-126。
我们用指数全0,尾数非0表示这个区间的数。
与规格化数不同的是,尾数省略的首位不是1,而是0。
公式
- SP(单精度) ( − 1 ) s × ( 0 + E ) × 2 − 126 (-1)^{s}\times(0+E)\times2^{-126} (−1)s×(0+E)×2−126
- DP(双精度) ( − 1 ) s × ( 0 + E ) × 2 − 1022 (-1)^{s}\times(0+E)\times2^{-1022} (−1)s×(0+E)×2−1022
- 这里-126和-1022是固定的,不是0-127和0-1023(移码减去偏置常数)
用十进制表示数值数据
为了减少10进制与2进制的转换,有些系统用十进制表示数值数据。
ASCII码
符号位用一个字节表示,位于数字串之前。
- 正号:2B
- 负号:2D
其他的数字对应ASCII码即可。
比如:
+236可表示为 2B 32 33 36H
-2369可表示为 2D 32 33 36 39H
H代表16进制表示
BCD码
BCD(Binary Coded Decimal),即用二进制编码十进制
所以需要每一个十进制位用二进制编码。
十进制数共10个数,0~9,所以需要用4位2进制编码,尽管4位2进制可表示16种状态,剩余6种是多余的。
16种状态中,挑出10种状态编码十进制即可。另外用2种表示正负。
C++调试
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
int n1 = 0;
int n2 = 1;
float n3 = 0;
float n4 = 1;
float n5 = -1;
float n6 = pow(2, -126-23);
float n7 = 0.5*n6;
//cout << n2 / n1 << endl; 溢出,无法执行
cout << n4 / n1 << endl; //正无穷
cout << n5 / n1 << endl; //负无穷
cout << n3 / n1 << endl; //非数
cout << sqrt(n5) << endl;//非数
cout << n6 << endl;//单精度正数最小值
cout << n7 << endl;//比单精度最小值再小一点
system("pause");
return 0;
}
运行结果