引入
N = S × r j N = S×r^j N=S×rj
N
:浮点数S
:尾数r
:基数j
:阶码
举个例子:
123.456
=
1.23456
×
1
0
2
123.456 = 1.23456×10^{2}
123.456=1.23456×102
其中123.456
是浮点数,1.23456
是尾数,10
是基数(10进制),2
是阶码。
可以发现,表示123.456
的方法不唯一,比如:
123.456
=
12.3456
×
1
0
1
=
0.123456
×
1
0
3
=
0.0123456
×
1
0
4
=
.
.
.
123.456 = 12.3456×10^{1} = 0.123456×10^{3} = 0.0123456×10^{4} = \quad ...
123.456=12.3456×101=0.123456×103=0.0123456×104=...
在二进制中也是如此:
10进制转化为二进制
11.62
5
10
=
1011.10
1
2
11.625_{10} = 1011.101_{2}
11.62510=1011.1012
表示方法同样多种:
1011.101
=
0.1011101
×
2
100
=
1.011101
×
2
11
=
.
.
.
1011.101 = 0.1011101×2^{100} = 1.011101×2^{11} = \quad...
1011.101=0.1011101×2100=1.011101×211=...
指数部分也用二进制表示,2100表示24,211表示23
可以看出,表示一个数的方式太多,因此要有一个规范(IEEE 754),在讲规范之前,先了解一下基础概念。
定点数
计算机中是没有通过硬件来表示小数点的,因此小数点及其位置是隐含规定的,所谓定点就是小数点的位置不变。
定点数又分为定点整数和定点小数。
定点整数
小数点隐含在最低位之后,最高位为符号位。
-
为什么有符号位?
计算机中用补码表示数(补码不会有
+0
和-0
之分),补码的最高位为符号位。
举个例子:
−
1
3
10
=
−
110
1
2
-13_{10} = -1101_{2}
−1310=−11012
用8位的定点整数来表示10进制的-13
:
如果是13
,则将符号位改为0
-
为什么符号位
0
表示正,1
表示负?数的符号表示为:-1符号位
- 若符号位=0,则数的符号为-10 = 1,表示正数
- 若符号位=1,则数的符号为-11 = -1,表示负数
定点小数
小数点隐含与数值位与符号位之间
举个例子:
0.62
5
10
=
0.10
1
2
0.625_{10} = 0.101_{2}
0.62510=0.1012
若用8位的定点小数来表示10进制的0.625
:
然而生活中的数常常不是纯整数
或是纯小数
,而是两者的结合
IEEE 754规范
因为表示一个浮点数的方法有很多,但是计算机中要有一个统一的规范,这规范就是IEEE 754
本文讲IEEE 754
的Float32
标准
V
=
−
1
S
×
M
×
R
E
V = -1^{S}×M×R^{E}
V=−1S×M×RE
V
:浮点数
R
:基数
- 符号:1bit
- 指数:8bit
- 尾数:23bit
同时规定:
-
1 ≤ M < 2 1≤M<2 1≤M<2
因此尾数的第一位固定为1,并且在表示时忽略。
-
尾数M采用的是
定点小数
表示。
- 移码(offset binary),是将二进制原码无符号整数所代表的值,减去一个预设值。
- 标准移码,预设值为二进制原码表示的最大整数的一半。 一个数的标准移码和补码,最高位相反,其余各位均相同。
-
E 用移码表示,8 位无符号数的表示范围是
[0, 255]
,而 IEEE754 规定移码的真值为E - 127
(127 被称为偏置),因此要存储阶码时,需要先加上偏置 127- 其中,8 位移码
1000 0000
的真值为 0,即补码0000 0000
的最高位符号位取反 - 手算时,如果考虑补码取反,那操作起来很麻烦,将移码直接看作是:无符号数 + 偏置更为方便,例如阶码值 = 3,则移码表示的阶码为 127 + 3 = 130 = 128 +2(1000 0010)
- IEEE754 中移码全 1 和全 0 保留,全 0 被认为是机器零,全 1 被认为是无穷大,因此 E 的取值为 1 ~ 254,减去偏置后对应真值 -126 ~ 127
- 其中,8 位移码
-
指数E采用的是
定点整数
表示 -
用符号位来表示尾数的符号
示例1
− 9.62 5 10 = − 1001.10 1 2 -9.625_{10} = -1001.101_{2} −9.62510=−1001.1012
尾数M = 1.001101
指数E = 310 = 112
- 上面提到过,尾数小数点左侧的1忽略,因此尾数表示为:
-
指数在表示时会减去127,因此指数部分的实际值应该为:
127 + 3 = 13 0 10 = 1000001 0 2 127+3 = 130_{10} = 10000010_{2} 127+3=13010=100000102
指数表示为: -
-9.625
为负数,因此符号位=1(-11=-1),符号位表示为:
-9.625
表示为:
示例2
0.0937 5 10 = 0.0001 1 2 0.09375_{10} = 0.00011_{2} 0.0937510=0.000112
2 − 4 = 0.0625 , 2 − 5 = 0.03125 , 2 − 4 + 2 − 5 = 0.09375 2^{-4} = 0.0625, \quad 2^{-5} = 0.03125,\quad 2^{-4}+2^{-5} = 0.09375 2−4=0.0625,2−5=0.03125,2−4+2−5=0.09375
-
尾数M = 1.1
尾数的小数点左侧的1忽略,所以M表示为:
-
指数E = -4
因为要减去
127
这个偏置,所以E=123
(123-127=-4),二进制为:01111011,所以E表示为: -
符号S = 0
因为
0.09375
为正数,符号为-10 = 1,符号位表示为:
0.09375
表示为: