実世界の浮動小数点バグ

浮動小数点精度の問題が原因で発生した有名な実世界のバグを探索:パトリオットミサイルの失敗、バンクーバー証券取引所、アリアン5号など。

Practical

Decimal Value

0.1

Float32 Hex

0x3DCCCCCD

Float64 Hex

0x3FB999999999999A

詳細な説明

コンピューティングの歴史を通じて、浮動小数点精度の問題は壮大な失敗を引き起こしてきました。これらの実世界の例は、IEEE 754の理解が単なる学問的なものではなく、実際に生死に関わる結果をもたらすことを示しています。

1. パトリオットミサイルの失敗(1991年)

湾岸戦争中、パトリオットミサイル防衛システムは飛来するスカッドミサイルの迎撃に失敗し、28人が死亡しました。原因:システムは24ビット固定小数点レジスタで0.1秒間隔をカウントして時間を追跡していました。

バイナリでの0.1の値は0.00011001100110011...(繰り返し)です。24ビットの切り捨ては1ティックあたり約0.000000095秒の誤差を導入しました。100時間の連続運転後、これは0.34秒に蓄積され、トラッキングゲートが600メートル以上ずれ、システムは空の間違った領域を探していました。

2. バンクーバー証券取引所(1982年)

バンクーバー証券取引所の指数は1000.000で初期化され、各取引後に小数点以下3桁に切り捨て(丸めではなく)て再計算されました。各切り捨てで少量の値が失われました。22ヶ月の運用後、指数は正しい値の約1098.892ではなく524.811を表示していました。取引所は再キャリブレーションが必要でした。

3. アリアン5号の爆発(1996年)

アリアン5号ロケットは発射37秒後に爆発しました。原因:64ビット浮動小数点の速度値が16ビット符号付き整数に変換されました。値が32,767(16ビット符号付き整数の最大値)を超え、オーバーフロー例外が発生しました。バックアップシステムにも同じバグがありました。結果のエラーデータが操舵コマンドとして解釈され、ロケットがコースを外れました。

4. Excel 2007のバグ

Excel 2007は、浮動小数点から文字列への変換のバグにより、65,535の特定の計算値を100,000として表示しました。値は内部的には正しく格納されていましたが、誤ってレンダリングされました。

5. Sleipner Aプラットフォーム(1991年)

Sleipner Aコンクリート海上プラットフォームはバラスト試験中に沈没し、7億ドルの損失を引き起こしました。原因:有限要素解析プログラムがトライセル壁のモデリングで不十分なメッシュ解像度を使用していました。浮動小数点計算の近似誤差により、重要な構造要素のせん断応力が47%過小評価されました。

教訓:

  1. 小さな誤差を補正せずに長期間蓄積してはならない(Kahan総和)
  2. ドメインに適切な精度を使用する — 通貨は10進数または整数セントを使用
  3. 異なる数値型やサイズ間の変換を検証する
  4. 浮動小数点値が型の限界に近づく境界条件をテストする
  5. 安全性が重要なアプリケーションでは区間演算を使用して誤差の限界を追跡する

ユースケース

これらのケーススタディは、ソフトウェアエンジニアリング教育、安全性が重要なシステム開発、浮動小数点の認識を議論する技術面接、および本番コードで数値精度を真剣に受け止めるようチームを動機付けるために価値があります。

試してみる — IEEE 754 Inspector

フルツールを開く