请考虑以下代码和注释:
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,但是:
为什么在被零除中使用双精度返回 Infinity 而不是抛出异常?这是设计使然还是错误?
只是为了好玩,我也在 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);
这个测试似乎证实了这个想法,实际上双倍的0.0
实际上是一个非常非常小的分数,这将导致无穷大......