Какой обходной путь рекомендуется использовать, если numeric_limits <double>:: has_infinity равно false - PullRequest
1 голос
/ 15 января 2009

Мне нужно проверить двойное значение бесконечности в приложении C ++ в Linux. На большинстве платформ это работает по сравнению с std::numeric_limits<double>::infinity(). Однако на некоторых старых платформах (например, RedHat 9 с gcc 3.2.2) это недоступно, и std::numeric_limits<double>::has_infinity там ложно.

Какой обходной путь вы бы порекомендовали для этих платформ?

Ответы [ 3 ]

3 голосов
/ 15 января 2009

Если вы используете арифметику IEEE 754, как вы почти наверняка, бесконечность - это четко определенные значения и определенные результаты для всех арифметических операций. В частности,

infinity - infinity = NaN

Положительные и отрицательные значения бесконечности и NaN значения являются единственными значениями, для которых это верно. NaN - это специальные значения "не числа", используемые для указания ошибок функций в домене, например, sqrt(-1). Кроме того:

NaN != NaN

NaN s - единственные значения, для которых это верно.

Таким образом:

bool is_infinite(double x) {
    double y = x - x;
    return x == x && y != y;
}

вернет истину тогда и только тогда, когда x будет положительной или отрицательной бесконечностью. Добавьте тест для x > 0, если вы хотите проверять только положительную бесконечность.

1 голос
/ 19 января 2009

Хорошо, теперь я прибегнул к использованию макросов INFINITY и NAN на этой конкретной машине - похоже, работает нормально. Они родом из math.h.

1 голос
/ 15 января 2009

В большинстве случаев std :: numeric_limits :: max () может быть допустимой заменой std :: numeric_limits :: infinity ().

Однако вам следует быть осторожнее с его использованием. Я полагаю, что при переполнении вам придется вручную определять переполнение и явно устанавливать максимальный результат в случае обнаружения переполнения.

...