0

我一直在玩一些数学,我注意到当你除以零时,而不是抛出DivideByZeroException浮点数和双精度数被分配了值Infinitity为什么会这样?

    [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

    }
4

1 回答 1

4

浮点处理器当然可以在除以零时产生异常。该功能可以通过对控制寄存器进行编程来打开或关闭。这有着非常丰富的巨大痛苦历史,当您混合和匹配具有对该配置的不同假设的库时,它的扩展性非常差。非常难以处理,我们自己的遗留代码库有很多地方可以在库调用后重置 FPU。

普遍的结论是它无法处理,唯一合理的选择是禁用例外。大多数现代运行时支持库都遵循此规则。

CLR 也不例外,它将 FPU 配置为不生成异常并允许处理器生成无穷大。也包含在 CLI 标准和 C# 语言标准中。如有必要,您需要使用 Double.IsInfinity() 来抛出您自己的异常。

于 2013-11-27T23:35:05.717 回答