访问量: 164 次浏览
电子计算器是很精准的运算工具,从来不会出错——至少我们都这么认为。 但事实上,电子计算器常常发生错误,只是我们没有注意到罢了。 举例来说,拿出一个袖珍计算器(有“平方”及“平方根”按键那种), 然后依下列指示操作:一、先按数字10;二、然后按 “平方根”键; 三、再按“平方”键。正如我们所预期的,屏幕上出现答案“10”, 因为10的平方根的平方当然还是10,至此一切顺利。 现在再试试这个例子:一、先按数字10;二、然后按“平方根”键25次; 三、 再按“平方”键25次。依我们的预期,这次的结果应该还是10, 但屏幕上显现的却是9.9923974之类的数字。幸而通常没有人会在乎0.07%这么微小的误差。 现在重复前面的实验,但分别按33次“平方 根”与“平方”键, 结果得到的却是类似5.573 243 6的数字,与真正的答案(当然是10)相去甚远。
每一台数字计算器或多或少都会有这种情况,发生的原因是一个数字可以有无限多位小数。 以+为例,用小数形式来表示,小数点后面就会跟着无限多个3。 但有个很大的问题是,计算器只能储存有限量的数字, 计算机的一般规则是截去15位后的数字, 因此在真正的数字与显现或储存的数字之间存在非常微小的差异。
通常我们可以忍受些许误差,因为日常生活中小数点后二、三位的数字并不难应付。 但尽管如此,有时舍人误差仍可能导致灾难,例如1991年2月25日海湾战争期间, 位于沙特阿拉伯达兰的美国爱国者飞弹连因为拦截一枚伊拉克发射的飞毛腿飞弹失败, 让该飞弹击中了美国部队营房,造成28名士兵丧生。 这桩悲剧事件的起因正是时间换算失误, 在把以1秒为单位的时间换算为计算机储存用的二进制数时准确度不足。 更明确地说,经历的时间是先经过系统内部时钟以&秒为单位测量后, 再换算为二进制数储存,然后得出的结果必须再乘以10,才能产生秒数。 这个计算流程是用24位处理的,而&这个二进制中的无穷小数, 在被截去24位后的数字以后,会导致微小误差, 这个舍位误差再乘上以丄秒为单位的庞大数,就造成了致命的后果。
1992年4月5日,德国大选日的傍晚, 石勒苏益格一荷尔斯泰因州的德国绿党人士个个兴高采烈, 因为距离绿党进入州议会的5%门坎只剩毫发之差。 午夜过后不久,冷酷的现实敲醒了他们,选举的最后结果公布了, 绿党沮丧地发现他们只得到了4.97%的选票。 整天计算选举结果的程序本来仅列到小数点后一位数字, 而上述计算结果在四舍五入后是5.0%。这套特殊程序已经沿用了好几年, 没有人想过在这个关键时刻却关掉了四舍五入的功能(如果不称之为程序错误的话)。 总之,那次绿党未在议会中占有一席之地。
1996年6月4日,无人驾驶的火箭亚利安娜五号从法属圭亚那的古鲁岛发射升空, 但在40秒后就爆炸了。火箭偏离了飞行航道, 必须由地面控制中心引爆,软件的错误使得制导系统误判了一个四舍五入的数字。
1982年,温哥华股市引进一个新指数,并将起始值设在1000点。 不到两年时间,尽管股票的平均市值上涨了约10%, 但这个指数几乎降了一半。这个差异同样由舍入误差导致, 这个系统计算指数时,股价加权平均数在小数点后保留的位数太少了。
然而,有一次在一个特别的情况下,舍入误差却造就了重要的发现。 1960年代的某一天,麻省理工学院的气象学家洛伦茨正忙着观察计算机上的气象模拟。 他在忙了一阵子后想稍事休息,于是停止了执行程序, 草草记下了中间结果。喝完咖啡后,洛伦茨回到桌前, 把刚刚记下来的结果重新输 入计算机,继续执行模拟。 但后来计算机上出现的气象预测,却与他依据先前模拟结果所做的预测大不相同,这让他吃了一惊。
思考了一段时间后,洛伦茨才了解发生了什么事。到咖啡店之前, 他抄下了在计算机屏幕上看到的数字,那些数字都是3位小数, 但计算机中储存的数字却是8位小数。洛伦茨发现, 他的计算机程序后来使用的数字是四舍五入后的数字, 由于气象模拟涉及几项非线性的运算,这么快就出现误差并不令人意外。 非线性表达式(如平方或平方根)就是有这种恼人的性质,一下子就会把最细微的错误放大好几倍。
洛伦茨的发现奠定了所谓混沌理论的基础,现在混沌理论已经是众所皆知的概念了。 这项理论后来衍生出了声名大噪的蝴蝶效应。 蝴蝶效应一般是指蝴蝶翅膀的动作可能导致地球另一端的一场飓风。 蝴蝶拍动翅膀在空气里引起的小小涡流,代表的只是小数点后第30位数字的变动; 然而,气象的非线性特性却能将这个细 微的空气振动扩大十亿倍,逐步增强为飓风。
我们可以用比较乐观的方式来看待这件事, 因为另一只蝴蝶同样也可以拍拍美丽的翅膀,就此阻止一场飓风的发生。 这种反向蝴蝶效应的数学模型,已经被应用于心脏病学。 在恰好的时刻做轻微的电击,可以修正混乱的心跳,预防心脏病发作。