Каков рекомендуемый обходной путь, если numeric_limits<double>::has_infinity имеет значение false?
Вопрос
Мне нужно проверить двойное значение бесконечности в приложении 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
NaN
s — единственные значения, для которых это верно.
Поэтому:
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 (). Р>
Однако вам следует быть осторожнее с его использованием. Я полагаю, что при переполнении вам придется вручную определять переполнение и явно устанавливать максимальный результат в случае обнаружения переполнения.