为什么C#允许:
1.0 / 0 // Infinity
并且不允许:
1 / 0 // Division by constant zero [Compile time error]
数学上,积分值和浮点数除以零后是否存在差异?
答案 0 :(得分:48)
根据微软的说法,“浮点运算溢出或除零从不抛出异常,因为浮点类型基于IEEE 754,因此有表示无穷大和NaN(非数字)的条款。” p>
有关此here的详情。
答案 1 :(得分:13)
数学上,没有区别。但是,对于计算机,只有标准IEEE-754 floating-point specification具有表示±∞的特殊值。整数只能保存...整数: - )
答案 2 :(得分: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。
答案 3 :(得分:7)
浮点除法由IEEE754覆盖,它指定除以零应该是无穷大。整数除法没有这样的标准,所以他们只是遵循标准的数学规则。