为啥 C# 允许在浮点类型中将非零数除以零?
Posted
技术标签:
【中文标题】为啥 C# 允许在浮点类型中将非零数除以零?【英文标题】:Why does C# allow dividing a non-zero number by zero in floating-point type?为什么 C# 允许在浮点类型中将非零数除以零? 【发布时间】:2011-05-14 19:41:06 【问题描述】:为什么 C# 允许:
1.0 / 0 // Infinity
并且不允许:
1 / 0 // Division by constant zero [Compile time error]
在数学上,整数和浮点数除以零有什么区别吗?
【问题讨论】:
+1 好问题。除了其他答案之外,这就是为什么我们只有float/double.Is(Positive/Nagative)Infinity
而没有 int.IsInfinity
方法。
【参考方案1】:
根据 Microsoft 的说法,“浮点算术溢出或除以零永远不会引发异常,因为浮点类型基于 IEEE 754,因此具有表示无穷大和 NaN(非数字)的规定。”
更多关于here。
【讨论】:
【参考方案2】:在数学上,没有区别。然而,对于计算机,只有标准 IEEE-754 floating-point specification 具有表示 ±∞ 的特殊值。整数只能容纳...整数:-)
【讨论】:
… 可数整数:P【参考方案3】:IEEE Standard for Floating-Point Arithmetic (IEEE 754) 是最广泛使用的浮点计算标准,紧随其后的是许多硬件和软件实现,包括 C# 编译器。
这意味着 C# 中的浮点变量可以包含表示奇怪生物的位模式,例如 PositiveInfinity、NegativeInfinity 和 Not-a-Number(缩写为 NaN)。根据 IEEE 754 算术规则,这些非有限浮点值中的任何一个都可以通过某些操作生成。例如,无效的浮点运算(如零除以零)会导致 NaN。
在您的具体示例中,您可以看到 C#(与 VB 不同)重载 / 运算符以表示整数或浮点除法,具体取决于所涉及数字的数字类型。
在第一个示例中,编译器看到 1.0,因此使用浮点除法并将结果放入浮点变量中。该变量包含无穷大的表示。
在第二个示例中,编译器看到 1,因此使用整数除法并将结果放入整数变量中。因为 C# 中的整数类型使用二进制补码系统来表示,并且没有使用任何特殊的位模式来表示无穷大(或 NaN),所以编译器会报错。
还有其他interesting floating-point subtleties。值得一读 Eric Lippert's blog entry 关于这个主题。
【讨论】:
【参考方案4】:浮点除法由 IEEE754 管理,它规定除以零应该是无穷大。整数除法没有这样的标准,所以他们只是遵循数学的标准规则。
【讨论】:
以上是关于为啥 C# 允许在浮点类型中将非零数除以零?的主要内容,如果未能解决你的问题,请参考以下文章
无法将图像加载到 QGraphicsView(浮点除以零)。识别矩形,但不会设置场景