2
template <class T>
MyClass
{
    public:
        // ...

        void MyMethod(T dbNumber)
        {
            // ...

            T dbResult = do_some_operation_on_dbnumber(dbNumber);

            if (IsInfinite(dbResult))
            {
                // ...
            }
            else if (IsIndefinite(dbResult))
            {
                // ...
            }
            else
            {
                // ...
            }

            // ...
        }

        static bool IsInfinite(T dbNumber)
        {
            // How do I implement this?
        }

        static bool IsIndefinite(T dbNumber)
        {
            // How do I implement this?
        }

        // ...
};

私のコードには、テンプレート変数に無限および不定の結果を返すことがある数学演算があります。このような不確定な結果をキャッチしたいのです。それ、どうやったら出来るの?

4

2 に答える 2

6
   #include <limits>

   using namespace std;

   double d = 1.0 / 0.0;
   if (d == numeric_limits<double>::infinity( ))
        cout << "Its infinite, all right" << endl;
   else
        cout << "Not in my book" << endl;

これは機能します。

于 2011-12-23T21:43:37.960 に答える
1

コードが IEEE 表現を利用するプロセッサで実行されていることがわかっている場合は、ビット パターンが無限大 (指数フィールドがすべて「1」) のものと一致するかどうかを確認できます。つまり、ビットごとに 0x7ff0000000000000 の数値を計算し、その数値と等しいかどうかを確認できます。存在する場合は、下位ビットが 0 であるかどうかを確認できます。0 は無限大を示し、0 ではなく NaN を示します。比較を行うには、64 ビット型にキャストする必要があります。

これはすべて、倍精度浮動小数点数を使用していること、および 64 ビット整数型にキャストできることを前提としています。64 ビットにキャストできない場合は、エンディアンの問題を考慮する必要があります。32 ビット整数にキャストし、定数 0x7f800000 を使用しますが、単精度浮動小数点の場合も同様です。4 倍精度の場合も同様ですが、エンディアンを考慮する必要があるため、より複雑になります。コードに簡単に挿入できる 128 ビットの整数型がないためです。チェックしている定数は異なりますが、IEEE 754 仕様から推測できます。

于 2011-12-23T15:32:25.537 に答える