如何检查无限(1.#INF)和无限(1.#IND)数字?

时间:2011-12-23 15:03:54

标签: c++ class templates infinite indefinite

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?
        }

        // ...
};

我的代码中有一个数学运算,有时会在模板变量中返回无限且不确定的结果。我想抓住这些无限期的结果。我该怎么做?

2 个答案:

答案 0 :(得分: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;

这很有效。

答案 1 :(得分:1)

如果您知道您的代码是在使用IEEE表示的处理器上运行的,那么您可以检查位模式是否与无穷大相匹配,这在指数字段中都是“1”。也就是说,您可以按位 - 和0x7ff0000000000000的数字,并检查它是否等于该数字。如果是,则可以检查较低有效位是0还是不为零。 0表示无穷大,而0表示NaN。您需要进行64位类型的转换才能进行比较。

这一切都假定您正在使用双精度浮点数,并且您可以执行此操作可以转换为64位整数类型。如果你不能转换为64位,你需要担心字符串问题。对于单精度浮点数,它类似,但是转换为32位整数,并使用常量0x7f800000。对于四倍精度,它是相似的,但更复杂,因为你需要担心字节序,因为没有128位整数类型,很容易放入你的代码。您检查的常数是不同的,但可以从IEEE 754规范中推断出来。