代码之家  ›  专栏  ›  技术社区  ›  Homam

为什么C允许在浮点类型中将非零数除以零?

  •  51
  • Homam  · 技术社区  · 14 年前

    为什么C允许:

    1.0 / 0 // Infinity
    

    不允许:

    1 / 0 // Division by constant zero [Compile time error]
    

    从数学上讲,整数和浮点数除以零有什么区别吗?

    4 回复  |  直到 13 年前
        1
  •  48
  •   Dan Jagnow Martin Suchanek    6 年前

    根据微软的说法,“浮点运算溢出或除以零永远不会引发异常,因为浮点类型基于IEEE 754,因此有表示无穷和NaN(不是数字)的规定。”

    更多信息 here .

        2
  •  13
  •   Cameron    14 年前

    从数学上讲,没有区别。然而,对于计算机,只有标准 IEEE-754 floating-point specification 具有表示±的特殊值。整数只能容纳。。。整数:-)

        3
  •  8
  •   HTTP 410    7 年前

    这个 IEEE Standard for Floating-Point Arithmetic (IEEE 754)是应用最广泛的浮点计算标准,随后是许多硬件和软件实现,包括C#编译器。

    这意味着C#中的浮点变量可以包含表示奇怪生物的位模式,例如正整数、负整数和非数字(缩写为NaN)。根据IEEE 754算法规则,这些非有限浮点值中的任何一个都可以通过某些操作生成。例如,无效的浮点运算(如将零除以零)将导致NaN。

    在您的特定示例中,您可以看到C 35;(与VB不同)根据所涉及数字的数字类型,重载/运算符以表示整数或浮点除法。

    在第一个示例中,编译器看到1.0,因此使用浮点除法并将结果放入浮点变量中。那个变量包含无穷大的表示。

    在第二个例子中,编译器看到1,因此使用整数除法并将结果放入一个整数变量中。因为C中的整数类型使用二的补码系统来表示,并且不使用任何特殊的位模式来表示无穷大(或NaN),所以编译器会给出一个错误。

    还有其他的 interesting floating-point subtleties . 值得一读 Eric Lippert's blog entry 关于这个问题。

        4
  •  7
  •   recursive    14 年前

    浮点除法由IEEE754控制,IEEE754指定除以零应为无穷大。整数除法没有这样的标准,所以它们只是遵循数学的标准规则。