Как проверить бесконечные (1. # INF) и неопределенные (1. # IND) числа? - PullRequest
2 голосов
/ 23 декабря 2011
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 ]

6 голосов
/ 24 декабря 2011
   #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 голос
/ 23 декабря 2011

Если вы знаете, что ваш код выполняется на процессоре, использующем представление IEEE, вы можете проверить, соответствует ли битовый шаблон бесконечности, которая равна всем «1» в поле экспоненты. Иными словами, вы можете поразрядно - и число с 0x7ff0000000000000, и проверить, равно ли оно этому числу. Если это так, вы можете проверить, равны ли младшие биты нулю или нет. 0 обозначает бесконечность, а не 0 обозначает NaN. Вам нужно выполнить приведение к 64-битному типу для сравнения.

Все это предполагает, что вы используете числа с плавающей запятой двойной точности, и что вы можете сделать, может привести к 64-битному целочисленному типу. Если вы не можете привести к 64-битному режиму, вам нужно беспокоиться о проблемах с порядком байтов. Это похоже на операции с плавающей запятой одинарной точности, хотя вы приводите 32-битное целое число и используете константу 0x7f800000. Для четверной точности это похоже, но сложнее, потому что вам нужно беспокоиться о порядке байтов, потому что нет 128-битного целочисленного типа, который легко вставить в ваш код. Константа, по которой вы проверяете, отличается, но может быть выведена из спецификации IEEE 754.

...