浮動小数点は、本質的に、制限された精度で実数をモデル化しています。ビットパターンの数は有限ですが、実数は無限(連続!)です。もちろん、それは最善を尽くし、与えられた正確な入力に最も近い表現可能な実数を返します。小さすぎて直接表現できない回答は、代わりにゼロで表されます。ゼロ除算は実数の誤差です。ただし、浮動小数点では、これらの非常に小さい回答からゼロが発生する可能性があるため、x / 0.0(正のxの場合)を「正の無限大」または「大きすぎて表現できない」と見なすと便利です。これは、x=0.0の場合は役に立ちません。
私たちが言える最善のことは、ゼロをゼロで割ることは、実際には「ゼロと区別できない小さなものを、ゼロと区別できない小さなもので割ること」であるということです。これに対する答えは何ですか?まあ、0/0の正確なケースに対する答えはなく、それを不正確に扱う良い方法はありません。それは相対的な大きさに依存するので、プロセッサは基本的に肩をすくめて、「数値ではない」を返すことで「すべての精度を失った-あなたに与えた結果は誤解を招くだろう」と言います。
対照的に、ゼロによる整数除算を行う場合、除数は実際には正確にゼロを意味するだけです。一貫した意味を与える方法はありません。そのため、コードが答えを求めたとき、それは実際には不正なことをしています。
(2番目のケースでは整数除算ですが、Cの昇格規則のため、最初のケースではありません。0は整数リテラルと見なすことができ、両側が整数であるため、除算は整数除算です。最初のケースでは、がx
2倍であると、配当が2倍に昇格します。をで置き換えると0
、0.0
タイプに関係なく、浮動小数点除算になりx
ます。)