繁体   English   中英

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

[英]Why does C# allow dividing a non-zero number by zero in floating-point type?

为什么 C# 允许:

1.0 / 0 // Infinity

并且不允许:

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

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

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

更多关于这个here

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM