《计算机组成与体系结构(原书第4版)》 —2.5.3 浮点误差
2.5.3 浮点误差
当使用铅笔和纸来解决三角问题或计算投资的利息时,我们知道这是在实数系统中进行的计算。我们还知道这个系统是无限的,因为对于任何一对实数,总是可以找到一个更小的实数和另一个更大的实数。
与我们想象中的数学不同,计算机是带有有限存储空间的有限系统。当我们让计算机执行浮点运算时,我们是在有限的整数系统中对实数的无限系统建模。事实上,我们所得到的是实数系统的近似值。使用的位越多,这个近似值越精确。但是,无论使用多少位,总会有一些误差。
浮点误差可能是明显的、微小的或不易察觉的。明显的误差(如数字上溢或下溢)会导致程序崩溃。微小的误差可能导致失去控制的错误结果,但这种误差在导致真正的问题之前往往很难检测出。例如,在我们的简单模型中,可以在-.111111112×216到+.111111112×216范围内表示规格化数字。显然,我们不能存储2-19或2128,因为它们明显不适合。我们不能准确地存储128.5,这确实不是很明显,因为这个数在规定的范围内。将128.5转换为二进制数10000000.1,它是9位宽。我们的有效数只能保存8位。通常,低阶位被丢弃或舍入到下一位。然而,无论我们如何处理它,都在系统中引入了一个误差。
可以用误差的绝对值与数的真实值之比计算表示中的相对误差。使用128.5的例子,我们发现:
如果我们不小心,这样的误差可以通过漫长的计算过程进行传播,从而导致严重的精度损失。表2-3说明了当使用14位简单模型执行16.24迭代地乘以0.91时误差的传播情况。把这些数转换到8位二进制,我们看到从一开始就有严重的误差。
正如你所看到的,在6次迭代中,乘积中的误差增加了两倍多。连续迭代将产生100%的误差,因为乘积最终会变为零。虽然这个14位模型很小,以至于夸大了误差,但所有浮点系统的运算方式都是一样的。不管这个系统有多大,在有限系统中表示实数时总会有一定程度的误差。即使最小的误差也可能产生灾难性的结果,特别是当计算机用于控制物理事件时,例如在军事和医疗应用中。对计算机科学家的挑战是在性能和经济允许的范围内找到用于控制此类误差的有效算法。
表2-3 在一个14位浮点数中误差的传播乘数被乘数14位乘积实际的乘积误差10000.001
- 点赞
- 收藏
- 关注作者
评论(0)