捨入誤差

维基百科,自由的百科全书
跳转至: 导航搜索

舍入误差英语round-off error),是指运算得到的近似值精确值之间的差异。比如当用有限位数的浮点数来表示实数的时候(理论上存在无限位数的浮点数)就会产生舍入误差。舍入误差是量化误差的一种形式。 如果在一系列运算中的一步或者几步产生了舍入误差,在某些情况下,误差会随着运算次数增加而积累得很大,最终得出没有意义的运算结果。

表示误差[编辑]

把一个浮点数在计算机中表示,可能会引起误差,这样的误差叫做表示误差。例如:

数学表达式 精确值 近似值 误差
1/7 0.142 857OEIS中的数列A020806 0.142 857 0.000 000 142 857
ln 2 0.693 147 180 559 945 309 41...  (OEIS中的数列A002162 0.693 147 0.000 000 180 559 945 309 41...
log10 2 0.301 029 995 663 981 195 21...  (OEIS中的数列A007524 0.3010 0.000 029 995 663 981 195 21...
 2  1.259 921 049 894 873 164 76...  (OEIS中的数列A002580 1.25992 0.000 001 049 894 873 164 76...
 2  1.414 213 562 373 095 048 80...  (OEIS中的数列A002193 1.41421 0.000 003 562 373 095 048 80...
e 2.718 281 828 459 045 235 36...  (OEIS中的数列A001113 2.718 281 828 459 045   0.000 000 000 000 000 235 36...
π 3.141 592 653 589 793 238 46...  (OEIS中的数列A000796 3.141 592 653 589 793 0.000 000 000 000 000 238 46...

增加数字位数可以减少可能会产生的舍入误差,但是位数是有限的,在表示无限浮点数时仍然会产生误差。在用常规方法表示浮点数的情况下,这种误差是不可避免的,但是可以通过设置警戒位来减小。

多步舍入会增加舍入误差,例如数字9.945309在输入时被舍入到小数点后两位 (9.95),显示时再舍入到小数点后一位 (10.0),舍入误差是0.054691。如果原来的数只经过一步舍入到小数点后一位 (9.9),舍入误差仅为0.045309。

IEEE二进制浮点数算术标准中定义了以下几种舍入规则:

  • 朝0方向舍入: 即截尾,直接将需要精确的位数以后的数位舍去。
0.142857 ≈ 0.142 (将小数点后第3位以后的数位全部舍去)
  • 舍入到最接近: 即四舍五入,结果可能会变大或变小。
0.142857 ≈ 0.143 (因小数点后第4位8\ge5,所以小数点后第3位加1)
0.142857 ≈ 0.14 (因小数点后第4位2 < 5 \!\ ,所以直接舍去)
  • 朝-∞方向舍入: 总是向数轴的左方向舍入。
  • 朝+∞方向舍入: 总是向数轴的右方向舍入。

举例[编辑]

  • 1990年2月25日,海湾战争期间,在沙特阿拉伯宰赫兰爱国者导弹防御系统因浮点数舍入错误而失效,该系统的计算机精度仅有24位,存在0.0001%的计时误差,所以有效时间阙值是20个小时。当系统运行100个小时以后,已经积累了0.3422秒的误差。这个错误导致导弹系统不断地自我循环,而不能正确地瞄准目标。结果未能拦截一枚伊拉克飞毛腿导弹,飞毛腿导弹在军营中爆炸,造成28名美国陆军死亡。[1] [2]
  • 1996年6月4日,在亚利安五号运载火箭发射后37秒,偏离预定轨道而炸毁。原因是软件系统试图将64位浮点数转换为16位浮点数,造成溢出错误。[1]
  • 温哥华证券交易所曾开发了一项股票指数. 当其在1982年推出时,指数的值是1000.000。在后来的重新计算时多次运用舍入到小数点后三位的操作。22个月以后,指数的值是524.881,然而事实上应该是1009.811。[1]

参考文献[编辑]

  1. ^ 1.0 1.1 1.2 Roundoff Error. Wolfram. 
  2. ^ Liam McBrien; Craig McNulty. The Patriot Missile Disaster – What Went Wrong? (pdf). Dr Mark Dunlop, University of Strathclyde. 

外部链接[编辑]

参见[编辑]