由于定点数表示的数字范围有限,当我们在数据位数不变的情况下,想增加数据的长度时,该怎么办呢?这就是浮点数要解决的问题。
阶码E反映浮点数的表示范围及小数点的实际位置(数值的大小),其中阶符为正表示要把尾数的数值部分的小数点往后移,为负值表示要把小数点往前移
尾数M的数值部分的位数n反映浮点数的精度,其中数符表示正负
举个简单的例子类比一下:
1000
π
1000\pi
1000π
=3141.5926……
≈
3.14
×
1
0
3
\approx3.14\times 10^{3}
≈3.14×103
≈
0.314
×
1
0
4
\approx0.314\times 10^{4}
≈0.314×104
≈
0.314159
×
1
0
4
\approx0.314159\times 10^{4}
≈0.314159×104
这里的乘号后面
1
0
x
10^{x}
10x 相当于是阶码部分,因为x均是正数,因此阶符都是0,此时x就是阶码的数值;乘号前面的3.14,0.314相当于尾数部分
一、浮点数的表示
定点数:
定点小数,小数点固定在第一位后面
定点整数,小数点固定在最后一位后面
浮点数:
阶码:常用补码或移码表示的定点整数
尾数:常用原码或补码表示的定点小数
浮点数的真值:
N
=
r
E
×
M
N=r^{E}\times M
N=rE×M
r 是浮点数阶码的底(隐含)通常 r=2;E称为阶码,M称为尾数。
尾数给出一个小数,阶码指明了小数点要向前/向后移动几位。
【例】阶码、尾数均用补码表示,求a,b的真值
a=0,01;1.1001
b=0,10;0.01001
【分析】a:阶码0,01对应真值+1;
尾数1.1001对应真值-0.0111;
a的真值:21 * (-0.0111)=-0.111(相当于小数点右移一位或者算数左移一位)
b:阶码0,10对应真值+2;
尾数0.01001对应真值+0.01001
b的真值:22 * (0.01001)=1.001(相当于算数左移两位)
1.浮点数的作用和基本原理
如果采用1B的存储空间存储a和b,a占8位正好;b占9位,如果将最后一位抛弃,势必降低了b的精度,此时,可采用浮点数规格化,保留浮点数精度
所以b = 22 * (0.01001) = 21 * (+0.1001)
这样保证了在存储空间不变的情况下,保留了浮点数的精度
2.浮点数规格化(重点)
规格化浮点数,规定尾数的最高位数值必须是一个有效值
左规:尾数算数左移一位(小数点右移),阶码减1,直到尾数最高位是有效位
右规:尾数算数右移一位(小数点左移),阶码加1(当浮点数运算的结果尾数出现溢出,双符号位为01或10时)
注:采用“双符号位”,当溢出发生时,可以挽救,更高的符号位是正确的符号位
3.浮点数的表示范围(了解)
1.用原码表示的尾数进行规格化
正数为0.1XX……X的形式,其最大值表示为0.11……1;最小值表示为0.10……0
尾数的表示范围是
1
2
≤
M
≤
(
1
−
2
−
n
)
\frac{1}{2}\leq M \leq (1-2^{-n})
21≤M≤(1−2−n)
负数为1.1XX……X的形式,其最大值表示为1.10……0;最小值表示为1.11……1
尾数的表示范围是
−
(
1
−
2
−
n
)
≤
M
≤
−
1
2
-(1-2^{-n})\leq M \leq -\frac{1}{2}
−(1−2−n)≤M≤−21
2.用补码表示的尾数进行规格化
正数为0.1XX……X的形式,其最大值表示为0.11……1;最小值表示为0.10……0
尾数的表示范围是
1
2
≤
M
≤
(
1
−
2
−
n
)
\frac{1}{2}\leq M \leq (1-2^{-n})
21≤M≤(1−2−n)
负数为1.0XX……X的形式,其最大值表示为1.01……1;最小值表示为1.00……0
尾数的表示范围是
−
1
≤
M
≤
−
(
1
2
+
2
−
n
)
-1\leq M \leq -(\frac{1}{2}+2^{-n})
−1≤M≤−(21+2−n)
4.浮点数规格化的题目
【例】若某浮点数的阶码、尾数用补码表示,共4+8位:
0,110;1.1110100,如何规格化?
【分析】阶码部分:+6
尾数部分:用补码表示,并且是负数,负数的补码,必须保证数值部分最高位一定是0,才能保证尾数尽可能多的表示一些精度,因为需要对尾数进行算数左移3位,低位补0,变为1.0100000,阶码减3
于是规格化后:0,011;1.0100000
注:
用原码还是补码表示,会影响规格化的规则
规格化原码尾数,最高数值位一定是1
规格化补码尾数,符号位与最高数值位一定相反
二、IEEE 754标准
不同之处:
①
尾数用原码表示,隐藏表示最高位
1
,实际表示的尾数是
1.
M
{\color{Red} 尾数用原码表示,隐藏表示最高位1,实际表示的尾数是1.M}
尾数用原码表示,隐藏表示最高位1,实际表示的尾数是1.M(用原码表示时,最高位是有效位,所以是1)
②
偏置值
=
2
n
−
1
−
1
{\color{Red} 偏置值=2^{n-1}-1}
偏置值=2n−1−1
③
阶码全
0
、全
1
有特殊用途
{\color{Red} 阶码全0、全1有特殊用途}
阶码全0、全1有特殊用途,因此8位的阶码正常范围是-126~127
阶码用移码表示,移码=真值+偏置值,此时的偏置值= 2 n − 1 − 1 2^{n-1}-1 2n−1−1
真值 -128=-1000 0000,此时偏置值为 0111 1111
移码=-1000 0000 + 0111 1111
= 0111 1111 - 1000 0000
= 1 0111 1111 - 1000 0000 (这一步操作是给被减数加了 2 8 2^{8} 28,最终结果是不变的)
= 1111 1111
【例】1.短浮点数 1 000 {\color{Red}1\color{Cyan}000} 1000 0001 { \color{Cyan} 0001} 0001 1 000 {\color{Cyan}1\color{green}000} 1000 1010 {\color{green}1010} 1010 0101 {\color{green}0101} 0101 0000 {\color{green}0000} 0000 1000 {\color{green}1000} 1000 0000 {\color{green}0000} 0000
数符s | 阶码E | 尾数数值M |
---|---|---|
1 {\color{Red}1} 1 | 00000011 {\color{Cyan}00000011} 00000011 | 00010100101000010000000 {\color{green}00010100101000010000000} 00010100101000010000000 |
规格化后的短浮点数的真值为:
(
−
1
)
s
×
1.
M
×
2
E
−
127
(-1)^{s}\times 1.M\times 2^{E-127}
(−1)s×1.M×2E−127
带入公式:
(
−
1
)
1
×
1.00010100101000010000000
×
2
3
−
127
(-1)^{1}\times 1.00010100101000010000000\times 2^{3-127}
(−1)1×1.00010100101000010000000×23−127
2.短浮点数0100 1011 0111 1111 1111 1111 1111 1111
带入公式:
(
−
1
)
0
×
1.11111111111111111111111
×
2
150
−
127
(-1)^{0}\times 1.11111111111111111111111\times 2^{150-127}
(−1)0×1.11111111111111111111111×2150−127=111111111111111111111111. (小数点右移23位)
【例】将十进制数-0.75转换为IEEE 754 的单精度浮点数格式表示
【分析】
(
−
0.75
)
10
=
(
−
0.11
)
2
=
(
−
1.1
)
2
×
2
−
1
(-0.75)_{10}=(-0.11)_{2}=(-1.1)_{2}\times 2^{-1}
(−0.75)10=(−0.11)2=(−1.1)2×2−1
数符=1
尾数部分=.100 0000 0000 0000 0000 0000 0000 (隐含最高位是1)
阶码真值= -1
单精度浮点型偏移量=127D
移码=阶码真值+偏移量=-1+111 1111 = 0111 1110(凑足8位)
(或者移码=127-1=126,对应二进制 0111 1110)
因此,最终可知
数符s | 阶码E | 尾数数值M |
---|---|---|
1 | 0111 1110 | 100 0000 0000 0000 0000 0000 |
【例】(2020年408)带符号整数用补码表示,float型数据用IEEE 754标准表示,当x机器数为C800 0000H时,x的值是()
【分析】
第一步,先十六进制转二进制:
C800 0000H = 1100 1000 0000 0000 0000 0000 0000 0000
第二步,确定数符、阶码和尾数:
数符s | 阶码E | 尾数数值M |
---|---|---|
1 | 100 1000 0 | 000 0000 0000 0000 0000 0000 |
第三步,逐个分析:
数符=1 --> 是个负数
尾数=.000 0000 0000 0000 0000 0000 0000 (隐含最高位是1) --> 尾数真值=1.0
阶码=100 1000 0=
2
7
+
2
4
2^{7}+2^{4}
27+24=144(移码),偏置值127D,由移码=真值+偏置值
因此阶码真值是=144-127=17
最终得出浮点数对应的真值= ( − 1.0 ) 2 × 2 17 (-1.0)_{2}\times 2^{17} (−1.0)2×217= − 2 17 -2^{17} −217
三、浮点数加减运算的题目
【例】(2009年选择题13题)设浮点数的阶码和尾数均采用补码表示,且位数分别为5位和7位(均含两位符号位)。若有两个数X=
2
7
×
29
/
32
2^7\times29/32
27×29/32,Y=
2
5
×
5
/
8
2^5\times5/8
25×5/8,则用浮点数加法计算X+Y的最终结果。
【分析】29/32=11101/
2
5
2^5
25=0.11101(小数点左移5位)
5/8=101/
2
3
2^3
23=0.101(小数点左移3位)
那么,X:00,111;00,11101;Y:00,101;00,10100
第一步,对阶(小阶向大阶看齐)
X的阶码7比Y的阶码5大,因此将Y的阶码加2,尾数右移2位,变为Y:00,111;00,00101
第二步,尾数相加
X:00,111;00,11101
Y:00,111;00,00101
尾数相加即:00,11101+00,00101=01,00010;相加后符号位为01,故需要右规(算数右移)
第三步,规格化
尾数右移一位,阶码加1,即就是:01,000;00,10001
第四步,判断溢出
符号位为01,说明发生了溢出(上溢)👉参考链接: 一位符号位和两位符号位的溢出判断