浮点数的几种特殊情况
当阶码是0的时候
(1)0的表示
对于阶码为0或255的情况,IEEE754标准有特别的规定:
如果 阶码E 是0 并且尾数M 是0,则这个数的真值为±0(正负号和数符位有关)。
因此+0的机器码为:0 00000000 000 0000 0000 0000 0000 0000。
-0的机器码为 0 0000000 000 0000 0000 0000 0000 0000。
当阶码是255的时候
(2)+∞和−∞的表示
如果 阶码E = 255 并且尾数M全是0,则这个数的真值为±∞(同样和符号位有关)。
因此+∞的机器码为0 11111111 000 0000 0000 0000 0000 0000。
-∞的机器码为 1 11111111 000 0000 0000 0000 0000 0000。
NaN(Not a Number)
如果 E = 255 并且 M 不是0,则这不是一个数(NaN)。
浮点数的精度和数值范围
根据上面的探讨,浮点数可以表示-∞到+∞,这只是一种特殊情况,显然不是我们想要的数值范围。
以32位单精度浮点数为例,阶码E由8位表示,取值范围为0-255,去除0和255这两种特殊情况,那么指数e的取值范围就是 E范围(1,254) e=E-127
1-127=-126
254-127=127。 e范围(-126,127)
解释一下:阶码E由8位表示,取值范围为0-255。去除了0和255 就只剩1~254
(1)最大正数
因此单精度浮点数最大正数值的符号位S=0,阶码E=254,指数e=254-127=127,尾数M=111 1111 1111 1111 1111 1111,其机器码为:
0 11111110 111 1111 1111 1111 1111 1111。
(−1)S×1.M×2^e (此时e等于127)
=[1+(1-2^-23)]* 2^127
(2)最小正数
最小正数符号位S=0,阶码E=1,指数e=1-127=-126,尾数M=0,其机器码为
0 00000001 000 0000 0000 0000 0000 0000。
那么最小正数为:
(−1)S×1.M×2^e (此时e等于-126)
=+(1.0)×2^−126
(3)最大负数
最大负数符号位S=1,阶码E=1,指数e=1-127==-126,尾数M=0,机器码与最小正数的符号位相反,其他均相同,
1 00000001 000 0000 0000 0000 0000 0000。
那么最大负数 为:
(−1)S×1.M×2^e (此时e等于-126)
=−(1.0)×2^−126
(4)最小负数
符号位S=0,阶码E=254,指数e=254-127=127
尾数M=111 1111 1111 1111 1111 1111,
其机器码为:1 11111110 111 1111 1111 1111 1111 1111。
那么最小负数 为:
(−1)S×1.M×2^e (此时e等于127)
=−[1+(1-2^-23)] ×2^127