2.4.4 舍入

2.4.4 舍入

因为表示方法限制了浮点数的范围和精度,所以浮点运算只能近似地表示实数运算。因此,对于值 x,我们一般想用一种系统的方法,能够找到“最接近的”匹配值 x',它可以用期望的浮点形式表示出来。这就是舍入(rounding)运算的任务。一个关键问题是在两个可能值的中间确定舍入方向。例如,如果我有 1.50 美元,想把它舍入到最接近的美元数,应该是 1 美元还是 2 美元呢?

一种可选择的方法是维持实际数字的下界和上界。例如,我们可以确定可表示的值 x- 和 x+,使得 x 的值位于它们之间:x- ≤ x ≤ x+。IEEE 浮点格式定义了 4 种不同的舍入方式。默认的方法是找到最接近的匹配,而其他 3 种可用于计算上界和下界。

图 2-37 举例说明了 4 种舍入方式,将一个金额数舍入到最接近的整数美元数。向偶数舍入(round-to-even),也被称为向最接近的值舍入(round-to-nearest),是默认的方式,试图找到一个最接近的匹配值。因此,它将 1.40 美元舍入成 1 美元,而将 1.60 美元舍入成 2 美元,因为它们是最接近的整数美元值。唯一的设计决策是确定两个可能结果中间数值的舍入效果。向偶数舍入方式采用的方法是:它将数字向上或者向下舍入,使得结果的最低有效数字是偶数。因此,这种方法将 1.5 美元和 2.5 美元都舍入成 2 美元。

方式 1.40 1.60 1.50 2.50 -1.50
向偶数舍入 1 2 2 2 -2
向零舍入 1 1 1 2 -1
向下舍入 1 1 1 2 -2
向上舍入 2 2 2 3 -1

图 2-37 以美元舍入为例说明舍入方式(第一种方法是舍入到一个最接近的值,而其他三种方法向上或向下限定结果,单位为美元)

其他 3 种方式产生实际值的确界(guaranteed bound)。这些方法在一些数字应用中是很有用的。向零舍入方式把正数向下舍入,把负数向上舍入,得到值 x̂,使得 |x̂| ≤ |x|。向下舍入方式把正数和负数都向下舍入,得到值 x-,使得 x- ≤ x。向上舍入方式把正数和负数都向上舍入,得到值 x+,满足 x ≤ x+

向偶数舍入初看上去好像是个相当随意的目标,为什么偏向取偶数呢?为什么不始终把位于两个可表示的值中间的值都向上舍入呢?使用这种方法的一个问题就是很容易假想到这样的情景:这种方法舍入一组数值,会在计算这些值的平均数中引入统计偏差。我们采用这种方式舍入得到的一组数的平均值将比这些数本身的平均值略高一些。相反,如果我们总是把两个可表示值中间的数字向下舍入,那么舍入后的一组数的平均值将比这些数本身的平均值略低一些。向偶数舍入在大多数现实情况中避免了这种统计偏差。在 50% 的时间里,它将向上舍入,而在 50% 的时间里,它将向下舍入。

在我们不想舍入到整数时,也可以使用向偶数舍入。我们只是简单地考虑最低有效数字是奇数还是偶数。例如,假设我们想将十进制数舍入到最接近的百分位。不管用哪种舍入方式,我们都将把 1.2349999 舍入到 1.23,而将 1.2350001 舍入到 1.24,因为它们不是在 1.23 和 1.24 的正中间。另一方面,我们将把两个数 1.2350000 和 1.2450000 都舍入到 1.24,因为 4 是偶数。

相似地,向偶数舍入法能够运用在二进制小数上。我们将最低有效位的值 0 认为是偶数,值 1 认为是奇数。一般来说,只有对形如 XX...X.YY...Y100... 的二进制位模式的数,这种舍入方式才有效,其中 X 和 Y 表示任意位值,最右边的 Y 是要被舍入的位置。只有这种位模式表示在两个可能的结果正中间的值。

例如,考虑舍入值到最近的四分之一的问题(也就是二进制小数点右边 2 位)。我们将 10.000112(2 3/32)向下舍入到 10.002(2),10.001102(2 3/16)向上舍入到 10.012(2 1/4),因为这些值不是两个可能值的正中间值。我们将 10.111002(2 7/8)向上舍入成 11.002(3),而 10.101002(2 5/8)向下舍入成 10.102(2 1/2),因为这些值是两个可能值的中间值,并且我们倾向于使最低有效位为零。

练习题 2.50 根据舍入到偶数规则,说明如何将下列二进制小数值舍入到最接近的二分之一(二进制小数点右边 1 位)。对每种情况,给出舍入前后的数字值。

A. 10.0102

B. 10.0112

C. 10.1102

D. 11.0012

练习题 2.51 在练习题 2.46 中我们看到,爱国者导弹软件将 0.1 近似表示为 x = 0.000110011001100110011002。假设使用 IEEE 舍入到偶数方式来确定 0.1 的二进制小数点右边 23 位的近似表示 x'。

A. x' 的二进制表示是什么?

B. x' - 0.1 的十进制表示的近似值是什么?

C. 运行 100 小时后,计算时钟值会有多少偏差?

D. 该程序对飞毛腿导弹位置的预测会有多少偏差?

练习题 2.52 考虑下列基于 IEEE 浮点格式的 7 位浮点表示。两个格式都没有符号位,它们只能表示非负的数字。

  1. 格式 A:有 k = 3 个阶码位。阶码的偏置值是 3。有 n = 4 个小数位。

  2. 格式 B:有 k = 4 个阶码位。阶码的偏置值是 7。有 n = 3 个小数位。

下面给出了一些格式 A 表示的位模式,你的任务是将它们转换成格式 B 中最接近的值。如果需要,请使用舍入到偶数的舍入原则。另外,给出由格式 A 和格式 B 表示的位模式对应的数字的值。给出整数(例如 17)或者小数(例如 17/64)。

格式 A 位 格式 A 值 格式 B 位 格式 B 值
011 0000 1 0111 000 1
101 1110
010 1001
110 1111
000 0001