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

问题描述 投票:51回答:4

为什么C#允许:

1.0 / 0 // Infinity

并且不允许:

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

在数学上,积分和浮点数除以零之间是否有任何差异?

c# floating-point divide-by-zero
4个回答
48
投票

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

更多关于这个here


13
投票

在数学上,没有区别。但是,对于计算机,只有标准的IEEE-754 floating-point specification具有表示±∞的特殊值。整数只能持有...整数:-)


8
投票

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


7
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.