C#で許可される理由:
1.0 / 0 // Infinity
そして許可しません:
1 / 0 // Division by constant zero [Compile time error]
数学的には、ゼロ除算で整数と浮動小数点数の間に違いはありますか?
C#で許可される理由:
1.0 / 0 // Infinity
そして許可しません:
1 / 0 // Division by constant zero [Compile time error]
数学的には、ゼロ除算で整数と浮動小数点数の間に違いはありますか?
Microsoftによると、「浮動小数点型はIEEE 754に基づいており、無限大とNaN(数値ではない)を表すための規定があるため、浮動小数点演算のオーバーフローまたはゼロ除算が例外をスローすることはありません。」
これについて詳しくは、こちらをご覧ください。
数学的には違いはありません。ただし、コンピュータでは、標準のIEEE-754浮動小数点仕様のみが±∞を表すための特別な値を持っています。整数は保持できるのは...整数:-)
浮動小数点演算のIEEE標準(IEEE 754)は、浮動小数点計算で最も広く使用されている標準であり、C#コンパイラを含む多くのハードウェアおよびソフトウェアの実装がこれに続きます。
これは、C#の浮動小数点変数に、PositiveInfinity、NegativeInfinity、Not-a-Number(NaNと略記)などの奇妙な生き物を表すビットパターンを含めることができることを意味します。IEEE 754算術規則では、これらの非有限浮動小数点値はいずれも特定の操作によって生成できます。たとえば、ゼロをゼロで除算するなどの無効な浮動小数点演算は、NaNになります。
特定の例では、C#(VBとは異なり)が/演算子をオーバーロードして、関係する数値の数値タイプに応じて、整数または浮動小数点の除算を意味することがわかります。
最初の例では、コンパイラは1.0を認識しているため、浮動小数点除算を使用して、結果を浮動小数点変数に入れます。その変数には、無限大の表現が含まれています。
2番目の例では、コンパイラーは1を認識しているため、整数除算を使用して、結果を整数変数に入れます。C#の整数型は、表現に2の補数システムを使用し、無限大(またはNaN)を表現するために特別なビットパターンを使用しないため、コンパイラーはエラーを出します。
他にも興味深い浮動小数点の微妙な点があります。そして、このテーマに関するEricLippertのブログエントリを読む価値があります。
浮動小数点除算はIEEE754によって管理されており、ゼロによる除算は無限大である必要があると指定されています。整数除算にはそのような標準がないので、それらは単に数学の標準規則に従っていました。