我一直在玩一些数学,我注意到,不是抛出 DivideByZeroException 浮动和双打,而是分配值 Infinitity 除以零时em> 为什么会出现这种情况?
[TestMethod]
public void TestFloatDivideByZero()
{
double myDouble = 100.0;
var DbzDouble = 1000.0 / ((myDouble - myDouble) / myDouble);
// Infinity
float myFloat = 100.0f;
var DbzFloat = 1000.0 / ((myFloat - myFloat) / myFloat);
// Infinity
decimal myDecimal = 100M;
var DbzDecimal = 1000M / ((myDecimal - myDecimal) / myDecimal);
// DivideByZeroException
int myInt = 100;
var DbzInt = 1000 / ((myInt - myInt) / myInt);
// DivideByZeroException
}
答案 0 :(得分:4)
浮点处理器当然可以在除以零时生成异常。通过编程控制寄存器可以打开或关闭该功能。这有着非常丰富的巨大痛苦历史,当你混合和匹配有关该配置的不同假设的库时,它的扩展性非常差。非常难以处理,我们自己的遗留代码库有很多地方可以在库调用后重置FPU。
普遍的结论是它无法处理,唯一合理的选择是禁用例外。大多数现代运行时支持库都遵循此规则。
CLR也不例外,它将FPU配置为不生成异常并允许处理器生成无穷大。同时也体现在CLI标准以及C#语言标准中。如果有必要,你需要使用Double.IsInfinity()来抛出你自己的异常。