为啥 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(浮点除以零)。识别矩形,但不会设置场景

为啥我会收到“浮点异常(核心转储)”?

浮点除以零的行为

为什么整数除以零1/0会给出错误,但浮点1 / 0.0会返回“Inf”?

在 C# 中将对象数组转换为浮点数组 [关闭]