【问题标题】: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 方法。

标签: c# floating-point divide-by-zero


【解决方案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 管理,它规定除以零应该是无穷大。整数除法没有这样的标准,所以他们只是遵循数学的标准规则。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-31
        • 1970-01-01
        • 2017-08-13
        相关资源
        最近更新 更多