次のコードとコメントを考慮してください。
Console.WriteLine(1 / 0); // will not compile, error: Division by constant zero
int i = 0;
Console.WriteLine(1 / i); // compiles, runs, throws: DivideByZeroException
double d = 0;
Console.WriteLine(1 / d); // compiles, runs, results in: Infinity
コンパイラがゼロ定数による除算と実行時の DivideByZeroException を積極的にチェックしていることは理解できますが、
ゼロ除算で double を使用すると、例外がスローされるのではなく、無限大が返されるのはなぜですか? これは仕様によるものですか、それともバグですか?
念のため、これを VB.NET でも実行すると、「より一貫した」結果が得られました。
dim d as double = 0.0
Console.WriteLine(1 / d) ' compiles, runs, results in: Infinity
dim i as Integer = 0
Console.WriteLine(1 / i) ' compiles, runs, results in: Infinity
Console.WriteLine(1 / 0) ' compiles, runs, results in: Infinity
編集:
kekekela のフィードバックに基づいて、次のように実行した結果、無限になりました。
Console.WriteLine(1 / .0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001);
このテストはアイデアを裏付けているようであり、文字通りの2倍0.0
は実際には非常に小さな部分であり、無限になります...