Каков рекомендуемый обходной путь, если numeric_limits<double>::has_infinity имеет значение false?

StackOverflow https://stackoverflow.com/questions/447520

Вопрос

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

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

Это было полезно?

Решение 3

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

Другие советы

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

infinity - infinity = NaN

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

NaN != NaN

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

Поэтому:

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top