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。对于四精度,它类似,但更复杂,因为您需要担心字节顺序,因为没有 128 位整数类型可以轻松放入您的代码中。您要检查的常数不同,但可以从 IEEE 754 规范中推导出来。

于 2011-12-23T15:32:25.537 回答