50億分の1の価値のある損害を引き起こした浮動小数点エラー

あなたが少しプログラミングをしたことがあるなら、あなたは用語に気をつけなければなりません:浮動小数点 最も無視され、潜在的に危険なエラーの1つは浮動小数点エラーです。

私はプログラマーが彼/彼女の人生の中で少なくとも一度は浮動小数点エラーを見たに違いない。 しかし、浮動小数点エラーはどの程度のダメージを与えることができますか? 浮動小数点バグのおかげで、10年以上かけて5億ドル以上の努力を失った欧州宇宙機関に依頼してください。

アリアン5の物語:

1996年6月4日に、アリアン5発射装置の旧飛行は失敗に終わった。 飛行シーケンスの開始から約40秒後に、高度約3700 mで、発射装置は飛行経路から外れ、解体して爆発しました。

Ariane 501の故障は、メインエンジンのイグニッションシーケンスの開始から37秒後(リフトオフから30秒後)の誘導および姿勢情報の完全な喪失が原因でした。 この情報の喪失は、慣性基準システムのソフトウェアの仕様上および設計上の誤りによるものです。

内部SRI *ソフトウェア例外は、64ビット浮動小数点から16ビット符号付き整数値へのデータ変換の実行中に発生しました。 変換された浮動小数点数は、16ビット符号付き整数で表すことができるものよりも大きい値を持っていました。

それで、正確に何が起こりましたか?

プラットフォームに対するロケットの水平方向の速度に関連する64ビットの浮動小数点数は、16ビットの符号付き整数に変換されました。 数値が32, 767より大きく、16ビット符号付き整数に格納可能な最大の整数であるため、変換に失敗しました。

このソフトウェアは、ロケットのモーターを導くプログラムによって使用されているメモリの領域にデバッグデータをダンプするシステム診断を引き起こしました。 同時に、残念ながら同じデータを持っていたバックアップコンピュータに制御が切り替えられました。

これは強い是正措置を必要としていると誤解され、ロケットのモーターはそれらの取り付けの限界まで回転しました。 災害が続いた。

コーディングはAdaで行われました。 最後の行はそれが悲劇を引き起こしました:

 L_M_BV_32:= TBD.T_ENTIER_32S((1.0 / C_M_LSB_BV)* G_M_INFO_DERIVE(T_ALG.E_BV)); L_M_BV_32> 32767の場合、P_M_DERIVE(T_ALG.E_BV):= 16#7FFF#。 L_M_BV_32 <-32768の場合、P_M_DERIVE(T_ALG.E_BV):= 16#8000#; そうでなければ、P_M_DERIVE(T_ALG.E_BV):= UC_16S_EN_16NS(TDB.T_ENTIER_16S(L_M_BV_32))。 もしも P_M_DERIVE(T_ALG.E_BH):= UC_16S_EN_16NS(TDB.T_ENTIER_16S((1.0 / C_M_LSB_BH)* G_M_INFO_DERIVE(T_ALG.E_BH))); 

参考文献:

あなたがこの高価な浮動小数点エラーケースについて読みたいならば、これらのリンクは役に立ちます。

//www.ima.umn.edu/~arnold/disasters/ariane.html //www.intel.com/standards/floatingpoint.pdf //www.theinquirer.net/inquirer/news/1047844/floating-point-bugs -explode //en.wikipedia.org/wiki/Cluster_(spacecraft)//www.ima.umn.edu/~arnold/disasters/ariane5rep.html //www.around.com/ariane.html

推奨されます

AptikとUbuntuのフレッシュインストール後にアプリとPPAを復元する
2019
新しくリリースされたLinux Kernel 4.20で活躍
2019
最近の通知AppIndicatorで通知の履歴を維持する
2019