0

私はいくつかの数学で遊んでいて、DivideByZeroExceptionをスローする代わりに、 float と double に値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 を構成し、プロセッサが無限大を生成できるようにします。C# 言語標準だけでなく、CLI 標準にも組み込まれています。必要に応じて、Double.IsInfinity() を使用して独自の例外をスローする必要があります。

于 2013-11-27T23:35:05.717 に答える