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

Hom*_*mam 51 c# floating-point divide-by-zero

为什么C#允许:

1.0 / 0 // Infinity
Run Code Online (Sandbox Code Playgroud)

并且不允许:

1 / 0 // Division by constant zero [Compile time error]
Run Code Online (Sandbox Code Playgroud)

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

Set*_*thO 48

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

更多关于这里.


Cam*_*ron 13

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

  • …可数整数 :P (2认同)

Roa*_*ior 8

IEEE标准浮点运算(IEEE 754)是浮点计算的最广泛使用的标准,其次是许多硬件和软件实现,包括C#编译器.

这意味着C#中的浮点变量可以包含表示奇异生物的位模式,例如PositiveInfinity,NegativeInfinity和Not-a-Number(缩写为NaN).根据IEEE 754算术规则,任何这些非有限浮点值都可以由某些操作生成.例如,无效的浮点运算(例如将零除零)会导致NaN.

在您的具体示例中,您可以看到C#(与VB不同)重载/运算符表示整数或浮点除法,具体取决于所涉及数字的数字类型.

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

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

还有其他有趣的浮点微妙之处.值得一读的是Eric Lippert关于这个主题的博客文章.


rec*_*ive 7

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