Поскольку <cmath>
исходит из стандарта C, но <limits>
является родным C++, при условии, что numeric_limits<double>::has_infinity()
является истинным (edit: а также что numeric_limits<double>::is_iec559()
истинно), гарантирует ли стандарт C++ (98/11/14) везде, что всегда верно? Ссылки на MSDN и cplusplus.com, похоже, не предлагают никаких полезных объяснений.
isinf(numeric_limits<double>::infinity())
x < numeric_limits<double>::infinity()
учитывая, что isfinite(x)
истинно!( numeric_limits<double>::infinity()<numeric_limits<double>::infinity() )
Я задаю этот вопрос, потому что хочу написать функцию формы f(double x, double upper_bound)
, где тело функции будет веткиться в зависимости от того, нарушает ли x
верхнюю границу или нет.
В infinity()
в стандарте C++ 11 мало шансов. Просто это представление положительной бесконечности.
isinf()
принадлежит в C++ до <cmath>
который обертывает библиотеку c math, а C11 говорит: макрос isinf возвращает ненулевое значение тогда и только тогда, когда его аргумент имеет бесконечное значение. Следовательно, вы можете вывести из этого определения, что isinf(numeric_limits<double>::infinity())
должно быть предоставлено.
В самом стандарте формальная гарантия не указана, поскольку каждый конечный x должен быть более мягким, чем бесконечность. Однако, если numeric_limits<double>::is_iec559
истинно, вы можете основывать свое предположение на стандарте iec 559 aka Ieee 754, который обеспечивает положительную бесконечность больше, чем все, кроме самого себя.
numeric_limits<double>::is_iec559()
как true, компилятор может все еще возвращать true дляnumeric_limits<double>::has_infinity()
но предоставлять странную семантику (например, для<
, это будет фальсифицировать последние два). Есть ли у вас причина не тестировать IEEE 754 с плавающей точкой, что подразумевало бы наличие бесконечности и разумной семантики для операций с плавающей точкой одновременно?static_assert(is_iec559())
и иметь гораздо больше уверенности в предположениях, подобных ОП.