Hom*_*mam 51 c# floating-point divide-by-zero
为什么C#允许:
1.0 / 0 // Infinity
Run Code Online (Sandbox Code Playgroud)
并且不允许:
1 / 0 // Division by constant zero [Compile time error]
Run Code Online (Sandbox Code Playgroud)
在数学上,积分和浮点数除以零之间是否有任何差异?
在IEEE标准浮点运算(IEEE 754)是浮点计算的最广泛使用的标准,其次是许多硬件和软件实现,包括C#编译器.
这意味着C#中的浮点变量可以包含表示奇异生物的位模式,例如PositiveInfinity,NegativeInfinity和Not-a-Number(缩写为NaN).根据IEEE 754算术规则,任何这些非有限浮点值都可以由某些操作生成.例如,无效的浮点运算(例如将零除零)会导致NaN.
在您的具体示例中,您可以看到C#(与VB不同)重载/运算符表示整数或浮点除法,具体取决于所涉及数字的数字类型.
在第一个示例中,编译器看到1.0,因此使用浮点除法并将结果放入浮点变量中.该变量包含无穷大的表示.
在第二个示例中,编译器看到1,因此使用整数除法并将结果放入整数变量.因为C#中的整数类型使用二进制补码系统进行表示,并且不使用任何特殊位模式来表示无穷大(或NaN),编译器会给出错误.
还有其他有趣的浮点微妙之处.值得一读的是Eric Lippert关于这个主题的博客文章.