为什么 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]
在数学上,整数和浮点数除以零有什么区别吗?
根据微软的说法,“浮点算术溢出或除以零永远不会引发异常,因为浮点类型基于 IEEE 754,因此具有表示无穷大和 NaN(非数字)的规定。”
更多关于这个here。
从数学上讲,没有区别。然而,对于计算机,只有标准IEEE-754 浮点规范具有表示 ±∞ 的特殊值。整数只能容纳...整数:-)
IEEE 浮点算术标准(IEEE 754) 是最广泛使用的浮点计算标准,随后是许多硬件和软件实现,包括 C# 编译器。
这意味着 C# 中的浮点变量可以包含表示奇怪生物的位模式,例如 PositiveInfinity、NegativeInfinity 和 Not-a-Number(缩写为 NaN)。根据 IEEE 754 算术规则,这些非有限浮点值中的任何一个都可以通过某些操作生成。例如,无效的浮点运算(如零除以零)会导致 NaN。
在您的具体示例中,您可以看到 C#(与 VB 不同)重载 / 运算符以表示整数或浮点除法,具体取决于所涉及数字的数字类型。
在第一个示例中,编译器看到 1.0,因此使用浮点除法并将结果放入浮点变量中。该变量包含无穷大的表示。
在第二个示例中,编译器看到 1,因此使用整数除法并将结果放入整数变量中。因为 C# 中的整数类型使用二进制补码系统来表示,并且不使用任何特殊的位模式来表示无穷大(或 NaN),所以编译器会报错。
还有其他有趣的浮点微妙之处。值得一读Eric Lippert 关于该主题的博客文章。
浮点除法由 IEEE754 管理,它规定除以零应该是无穷大。整数除法没有这样的标准,所以他们只是遵循数学的标准规则。