浮点数是“计算机系统基础”课程中的一大重点,也是难点。其内部机制,如符号位、阶码、尾数、偏置值和舍入规则,常常让许多同学感到困惑。
下面这道题是该课程期末考试中的一道经典高频题型,因为它全面地考察了浮点数的全部核心知识点。让我们通过完整解构这道题,来一次性掌握浮点数的核心概念,轻松应对考试。
题目
假设一种浮点数表示格式,其中符号位为1位,阶码部分为4位(采用移码表示),尾数部分为3位。规格化数采用隐藏位 (hidden bit) 的方式。
我们将回答以下四个问题:
- 该浮点数表示法中阶码的偏置值 (Bias) 是多少?
- 这种格式能够表示的最大的规格化数是多少?
- 这种格式能够表示的最小的正非规格化数是多少?
- 计算 6.5 + 1.25 在该格式下的运算过程与结果。
(1) 偏置值 (Bias) 的计算
浮点数的阶码(Exponent)通常用移码(Biased Representation)表示,以方便硬件进行比较。偏置值的大小取决于阶码的位数 k k k。
-
计算公式:
B i a s = 2 k − 1 − 1 Bias = 2^{k-1} - 1 Bias=2k−1−1 -
本题计算:
题目中阶码位数为 k = 4 k=4 k=4,因此:
B i a s = 2 4 − 1 − 1 = 2 3 − 1 = 7 Bias = 2^{4-1} - 1 = 2^3 - 1 = \textbf{7} Bias=24−1−1=23−1=7
(2) 最大规格化数的确定
一个浮点数的值由公式 V = ( − 1 ) S × M × 2 E V = (-1)^S \times M \times 2^E V=(−1)S×M×2E 决定。要获得最大值,我们需要符号位 S = 0 S=0 S=0(正数),以及最大的阶码 E E E 和最大的尾数 M M M。
-
最大阶码 E E E:
- 规格化数的阶码域 e e e 不能全为0或全为1。对于4位阶码,其范围是 [ 0001 2 , 1110 2 ] [0001_2, 1110_2] [00012,11102],即十进制的 [ 1 , 14 ] [1, 14] [1,14]。
- 实际的指数 E E E 通过公式 E = e − B i a s E = e - Bias E=e−Bias 计算。
- 因此,最大阶码 E m a x = 14 − 7 = 7 E_{max} = 14 - 7 = \textbf{7} Emax=14−7=7。
-
最大尾数 M M M:
- 规格化数采用隐藏位,意味着尾数 M M M 的形式为 1. f 1.f 1.f(其中 f f f 是尾数域的小数部分)。
- 要使尾数最大,3位尾数域应全部为1,即 f = 111 2 f=111_2 f=1112。
- 所以,最大尾数 M = ( 1.111 ) 2 M = (1.111)_2 M=(1.111)2。
-
最终计算:
V m a x = ( − 1 ) 0 × ( 1.111 ) 2 × 2 7 V_{max} = (-1)^0 \times (1.111)_2 \times 2^7 Vmax=(−1)0×(1.111)2×27
其中, ( 1.111 ) 2 = 1 + 1 2 + 1 4 + 1 8 = 1.875 (1.111)_2 = 1 + \frac{1}{2} + \frac{1}{4} + \frac{1}{8} = 1.875 (1.111)2=1+21+41+81=1.875。
V m a x = 1.875 × 128 = 240 V_{max} = 1.875 \times 128 = \textbf{240} Vmax=1.875×128=240
(3) 最小正非规格化数的确定
非规格化数(Denormalized Number)用于表示接近于0的数,填补规格化数无法表示的精度空隙。其阶码域 e e e 全为0。
-
指数 E E E:
- 对于非规格化数,实际指数 E E E 的计算方式固定为 E = 1 − B i a s E = 1 - Bias E=1−Bias。
- E = 1 − 7 = -6 E = 1 - 7 = \textbf{-6} E=1−7=-6。
-
尾数 M M M:
- 非规格化数没有隐藏位,其尾数 M M M 的形式为 0. f 0.f 0.f。
- 要获得最小的正数,尾数既不能为0,又要尽可能小。因此,3位尾数域应为 001 2 001_2 0012。
- 所以,最小正尾数 M = ( 0.001 ) 2 M = (0.001)_2 M=(0.001)2。
-
最终计算:
V m i n _ p o s = ( − 1 ) 0 × ( 0.001 ) 2 × 2 − 6 V_{min\_pos} = (-1)^0 \times (0.001)_2 \times 2^{-6} Vmin_pos=(−1)0×(0.001)2×2−6
其中, ( 0.001 ) 2 = 1 8 (0.001)_2 = \frac{1}{8} (0.001)2=81。
V m i n _ p o s = 1 8 × 1 2 6 = 1 8 × 1 64 = 1 512 ( 即 0.001953125 ) V_{min\_pos} = \frac{1}{8} \times \frac{1}{2^6} = \frac{1}{8} \times \frac{1}{64} = \frac{1}{512} \quad (\text{即 } 0.001953125) Vmin_pos=81×261=81×641=5121(即 0.001953125)
(4) 浮点数加法:6.5 + 1.25
浮点数加法是考试的重中之重,需要严格遵循“对阶、尾数相加、规格化、舍入”的步骤。
-
二进制转换:
- 6.5 = 110.1 2 = 1.101 2 × 2 2 6.5 = 110.1_2 = 1.101_2 \times 2^2 6.5=110.12=1.1012×22
- 1.25 = 1.01 2 = 1.010 2 × 2 0 1.25 = 1.01_2 = 1.010_2 \times 2^0 1.25=1.012=1.0102×20 (尾数补齐至3位)
-
对阶 (Align):
- 选择较大的阶码作为公共阶码,即 2 2 2^2 22。
- 将阶码较小的数向大阶码对齐,其尾数需右移 2 − 0 = 2 2-0=2 2−0=2 位。
- 1.25 = ( 1.010 2 × 2 0 ) → ( 0.0101 2 × 2 2 ) 1.25 = (1.010_2 \times 2^0) \rightarrow (0.0101_2 \times 2^2) 1.25=(1.0102×20)→(0.01012×22)
-
尾数相加 (Add):
1.1010 (6.5) + 0.0101 (1.25) ---------------- 1.1111
- 加法结果为 ( 1.1111 ) 2 × 2 2 (1.1111)_2 \times 2^2 (1.1111)2×22。
-
规格化与舍入 (Normalize & Round):
- 结果的尾数 ( 1.1111 ) 2 (1.1111)_2 (1.1111)2 有4位小数,超出了格式允许的3位,必须进行舍入。
- 我们采用 IEEE 754 标准的默认舍入规则:向偶数舍入 (Round to nearest, ties to even)。
- 精确结果为 ( 1.1111 ) 2 × 2 2 = 31 16 × 4 = 31 4 = 7.75 (1.1111)_2 \times 2^2 = \frac{31}{16} \times 4 = \frac{31}{4} = \textbf{7.75} (1.1111)2×22=1631×4=431=7.75。
- 该值正好位于两个可表示的数
7.5
7.5
7.5 和
8.0
8.0
8.0 的正中间:
- 向下: ( 1.111 ) 2 × 2 2 = 7.5 (1.111)_2 \times 2^2 = 7.5 (1.111)2×22=7.5
- 向上: ( 10.000 ) 2 × 2 2 = ( 1.000 ) 2 × 2 3 = 8.0 (10.000)_2 \times 2^2 = (1.000)_2 \times 2^3 = 8.0 (10.000)2×22=(1.000)2×23=8.0
- 向偶数舍入规则规定:当结果恰好在两数中间时,选择那个使尾数最低有效位为0的数。
- 7.5 7.5 7.5 的尾数是 1.11 1 ‾ 2 1.11\underline{1}_2 1.1112(奇数)。
- 8.0 8.0 8.0 的尾数是 1.00 0 ‾ 2 1.00\underline{0}_2 1.0002(偶数)。
- 因此,我们选择向偶数 8.0 8.0 8.0 舍入。
- 最终结果:
6.5 + 1.25 = 8.0 6.5 + 1.25 = \textbf{8.0} 6.5+1.25=8.0