(float) または (double) を使用すると、クラッシュの 0 による除算が防止されるのはなぜですか?
必ずしもそうではありません。浮動小数点に関しては、標準は驚くほどスペアです。現在、ほとんどのシステムは IEEE 浮動小数点標準を使用しており、ゼロ除算のデフォルト アクションは、クラッシュではなく ±infinity を返すことです。適切な浮動小数点例外を有効にすることでクラッシュさせることができます。
注意: 浮動小数点例外モデルと C++ 例外モデルに共通しているのは、「例外」という言葉だけです。私が作業しているすべてのマシンで、浮動小数点例外は C++ 例外をスローしません。
また、0による除算を防ぐ方法についての素晴らしいアイデアはありますか?
簡単な答え: やらないでください。
これは、「ドクター、ドクター、これをすると痛い!」の1つです。状況の種類。だからやらないで!
除数がゼロでないことを確認してください。
ユーザー入力である除数に対して健全性チェックを行います。健全性のために、常にユーザー入力をフィルタリングしてください。数が数百万になるはずのときにユーザー入力値がゼロであると、オーバーフロー以外のあらゆる種類の混乱が発生します。中間値の健全性チェックを行います。
浮動小数点例外を有効にします。
エラー (そしてこれらはほとんどの場合エラーです) がチェックされずに通過することを許可するデフォルトの動作を作成することは、標準化委員会の大きな間違いでした。デフォルトを使用すると、これらの無限大と非数は、最終的にすべてを Inf または NaN に変換します。
デフォルトでは、1.0/0.0 や 0.0/0.0 などの発生を許可するオプションを使用して、トラック内の浮動小数点エラーを停止する必要がありました。そうではないため、これらのトラップを有効にする必要があります。そうすることで、多くの場合、問題の原因をすぐに見つけることができます。
カスタム除算、カスタム乗算、カスタム平方根、カスタム正弦などの関数を記述します。
残念ながら、これは多くの安全性が重要なソフトウェア システムが取らなければならないルートです。王道の痛みです。オプション #1 は希望的観測にすぎないため、使用できません。システムがクラッシュすることは許されないため、オプション #3 は使用できません。オプション #2 はまだ良いアイデアですが、常にうまくいくとは限りません。なぜなら、悪いデータには常に忍び込む方法があるからです。これはマーフィーの法則です。
ところで、問題はゼロ除算よりも少し悪いです。10 200 /10 -200もオーバーフローします。