浮動小数点数の悲劇

"Roundoff Error and the Patriot Missile" を読んだ。以下要約。

場面: 1991年2月25日 湾岸戦争 アメリカvsイラク

結果: イラクスカッドミサイルがアメリカ陸軍兵舎に向け放たれた。 アメリカのパトリオットミサイルは迎撃に失敗、28人の兵士が死亡。

原因: パトリオットミサイルのシステムは、内部クロックとして0.1秒ごとにインクリメントするカウンタ を採用していた。0.1を2進数の浮動小数点数で表すと循環小数になり、どこかで数を丸める必要がある(実際は仮数部を23bitで保持していた)。 システム起動から100時間後には、丸めから生じる誤差は、実時間と比べおよそ0.34秒になった。 迎撃システムの性質上、長時間連続して可動させた上でも、正確な計算が求められるのだろう。0.34秒という誤差は致命的だった。 実際の直接的な原因は、システム内のタイマーを正確なものに置き換えたとき、 一部、誤差が存在するタイマーがそのまま残ってしまったことだったようだ。