四捨五入が人の命に関わることもある コンピュータープログラムが生む小さな誤差

私たちは日常生活の中で無意識に四捨五入の計算を行っています。例えば、買い物をしているときに商品の値札に1980円と書いてあれば、大抵それを2000円として認識していることでしょう。私たちは普段、四捨五入によって生まれる小さな誤差を気に留めることはありませんが、金融や科学技術の世界では数字を丸めることが大きな問題を引き起こすこともあります。

”コンピューターコードは、たとえば、最も近いセントに丸めるround()コマンドや、余分な小数点以下を切り捨てるfloor()コマンドなどを含む、様々な方法でこの問題を処理できる。たとえば、145.459ドルの税引き後の給与計算は通常、145.46ドルに丸められる。”

コンピューターの計算と有効数字

コンピュータープログラムは計算を自動で行ってくれるので大変便利なものですが、計算を制限しないと無限に計算を続けていくことになります。例えば、17を23で割ったら0.73913043478260…と延々と数字が並んでいきます。従って、通常は数字を四捨五入したり切り捨てたりすることで必要な範囲の数字を取り出します。これは高校の理科で習う有効数字の考え方です。有効数字は学校で習ったときには考え方がなかなか身につかず苦労した人も多いでしょうが、工学の世界では無駄な計算を省くために欠かせない考え方なのです。コンピュータープログラムの中でも数字を丸めなければ無限に計算が続いて結果が出せなくなってしまうのです。

小さな誤差が人の命に関わることも

普段は意識することの少ない四捨五入や切り捨てですが、それによって起こる小さな誤差が大きな問題を引き起こすことがあります。

1991年のアメリカとイラクの湾岸戦争では、イラクのスカッドミサイルがアメリカの兵舎を攻撃し、多数の死傷者を出しました。このときアメリカは敵のミサイルを撃ち落とすことができるパトリオットミサイルを配備していましたが、スカッドミサイルを撃ち落とすことに失敗し大きな被害を受けました。問題は内部時計の計算で、ある係数を24ケタの2進数(つまり24ビット)に丸めていたことでした。小さな誤差が計算結果に影響し、発射タイミングが0.34秒遅れ、573メートルの誤差が発生したのです。

ミサイル発射失敗の原因は1970年代に開発された古いコンピューターシステムにあったとされる。

プログラムを書いたことがある人でも、値を格納している変数が何ビットの値として処理しているかを意識したことはあまりないのではないでしょうか。特に最近のプログラミング言語は変数のビット数を考えなくても良いことが多いです。万が一小さな誤差が問題を引き起こしたとして、長大なコードの中からその原因を探り当てる作業は悪夢のようにも思えます。しかし、それは最悪の場合、人の命に関わることもあるのです。