浮点数对形如 V = x ∗ 2 y V=x*2^y V=x∗2y的有理数进行编码。它对表示非常大的数( ∣ V ∣ > > 0 |V|>>0 ∣V∣>>0)、非常接近
0
的数(
∣ V ∣ < < 1 |V|<<1 ∣V∣<<1),以及实数的
近似运算是很有用的。
小数表示
十进制表示小数:
d m d m − 1 . . . d 1 d 0 . d − 1 d − 2 . . . d − n \begin{align} d_md_{m-1}...d_1d_0.d_{-1}d_{-2}...d_{-n} \end{align} dmdm−1...d1d0.d−1d−2...d−n
其中每个十进制数字 d i d_i di的取值范围是0 ~ 9
,这个表达式所表示的值为:
d = ∑ i = − n m 1 0 i ∗ d i \begin{align} d=\sum_{i=-n}^{m}10^i*d_i \end{align} d=i=−n∑m10i∗di
小数点左边的数字表示正幂,得到整数值;小数点右边的数字表示负幂,得到小数值。
小数点向左移动1
位表示d
被10
除;小数点向右移动1
位表示d
乘以10
。
类似地,二进制表示小数:
b m b m − 1 . . . b 1 b 0 . b − 1 b − 2 . . . b − n \begin{align} b_mb_{m-1}...b_1b_0.b_{-1}b_{-2}...b_{-n} \end{align} bmbm−1...b1b0.b−1b−2...b−n
其中每个二进制数字(比特位) b i b_i bi的取值是0
或1
,这个表达式所表示的值为:
b = ∑ i = − n m 2 i ∗ b i \begin{align} b=\sum_{i=-n}^{m}2^i*b_i \end{align} b=i=−n∑m2i∗bi
同理,小数点左边的数字表示正幂,得到整数值;小数点右边的数字表示负幂,得到小数值。
小数点向左移动1
位表示b
被2
除;小数点向右移动1
位表示b
乘以2
。
形如 0.11... 1 2 0.11...1_2 0.11...12的二进制数表示无限接近
1
的数。用 1.0 − ε 1.0 - \varepsilon 1.0−ε表示。
仅使用有限长度的编码,十进制表示法不能表示像 1 3 、 5 7 \frac{1}{3}、\frac{5}{7} 31、75这样的数,它只能表示那些能够被写成 x ∗ 1 0 y x*10^y x∗10y这样的数。同理,有限长度的二进制编码,只能表示那些能够被写成 x ∗ 2 y x*2^y x∗2y这样的数。其它的数只能被近似地表示,增加编码的长度可以提升精度。
练习1
填写下表中缺失的信息。
小数值 | 二进制表示 | 十进制表示 |
---|---|---|
1 8 \frac{1}{8} 81 | 0.001 | 0.125 |
3 4 \frac{3}{4} 43 | 0.11 | 0.75 |
25 16 \frac{25}{16} 1625 | 1.1001 | 1.5625 |
42 16 \frac{42}{16} 1642 | 10.1011 | 2.6875 |
9 8 \frac{9}{8} 89 | 1.001 | 1.125 |
47 8 \frac{47}{8} 847 | 101.111 | 5.875 |
55 16 \frac{55}{16} 1655 | 11.0011 | 3.1875 |
练习2
十进制数0.1
的二进制表示是一个无穷序列:
0.000110011 [ 0011 ] . . . 2 \begin{align} 0.000110011[0011]..._2 \end{align} 0.000110011[0011]...2
方括号里面的部分是无限重复的。
某系统内含一个时钟,类似一个计数器,每0.1
秒加1
。有一个变量x
,该变量用24
位二进制编码十进制数0.1
,x = 0.00011001100110011001100
。程序用x
乘以这个计数器的值,来以秒为单位确定时间。
0.1 - x
的二进制表示是什么?
是 0.000000000000000000000001100 [ 1100 ] . . . 2 0.00000000000000000000