web-dev-qa-db-ja.com

C#では、浮動小数点型でゼロ以外の数値をゼロで除算できるのはなぜですか?

C#が許可する理由:

1.0 / 0 // Infinity

そして、許可しません:

1 / 0 // Division by constant zero [Compile time error]

数学的には、ゼロで除算するときに整数と浮動小数点数に違いはありますか?

52
Homam

マイクロソフトによれば、「浮動小数点演算のオーバーフローまたはゼロによる除算は例外をスローしません。浮動小数点型はIEEE 754に基づいているため、無限大とNaN(非数)を表すための規定があるためです。」

これについての詳細 ここ

48
SethO

数学的には違いはありません。ただし、コンピューターでは、標準的な IEEE-754浮動小数点仕様 のみが±∞を表すための特別な値を持っています。整数が保持できるのは...整数:-)

13
Cameron

浮動小数点演算のIEEE標準 (IEEE 754)は、浮動小数点計算で最も広く使用されている標準であり、C#コンパイラを含む多くのハードウェアおよびソフトウェアの実装がそれに続きます。

つまり、C#の浮動小数点変数には、PositiveInfinity、NegativeInfinity、Not-a-Number(省略形はNaN)などの奇妙な生き物を表すビットパターンを含めることができます。 IEEE 754算術規則では、これらの非有限浮動小数点値のいずれかを特定の演算で生成できます。たとえば、ゼロをゼロで除算するなどの無効な浮動小数点演算は、NaNになります。

特定の例では、C#(VBとは異なります)が/演算子をオーバーロードして、関係する数値の数値型に応じて整数または浮動小数点の除算を意味することがわかります。

最初の例では、コンパイラーは1.0を認識しているため、浮動小数点除算を使用し、結果を浮動小数点変数に入れます。その変数には、無限の表現が含まれています。

2番目の例では、コンパイラーは1を参照するため、整数除算を使用し、結果を整数変数に入れます。 C#の整数型は2の補数システムを使用して表現し、特別なビットパターンを使用して無限大(またはNaN)を表現しないため、コンパイラーはエラーを出します。

他にも 興味深い浮動小数点の微妙さ があります。そしてそれは読む価値があります Eric Lippertのブログエントリ 件名について。

8
RoadWarrior

浮動小数点除算はIEEE754によって管理されています。IEEE754は、ゼロによる除算は無限大であることを指定しています。整数除算にはそのような標準はありません。そのため、それらは単に標準の数学の規則に従っています。

7
recursive