引入
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采用的是
定点小数
表示。 -
E为无符号整数,但因为指数可以为负数,因此
IEEE 754
规定E
要减去127(这个127有个高大上的名字:偏置
)指数有8bit并且是无符号整数,所以
E∈[0, 255]
而减去127后,
E∈[-127, 128]
-
指数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
表示为: