Гарантии о бесконечности C ++ ()

0

Поскольку <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 верхнюю границу или нет.

  • 2
    В чистой теории, если компилятор не определяет numeric_limits<double>::is_iec559() как true, компилятор может все еще возвращать true для numeric_limits<double>::has_infinity() но предоставлять странную семантику (например, для < , это будет фальсифицировать последние два). Есть ли у вас причина не тестировать IEEE 754 с плавающей точкой, что подразумевало бы наличие бесконечности и разумной семантики для операций с плавающей точкой одновременно?
  • 0
    @PascalCuoq: хорошо сказано. Можно добавить static_assert(is_iec559()) и иметь гораздо больше уверенности в предположениях, подобных ОП.
Показать ещё 1 комментарий
Теги:
floating-point
standards
infinity

1 ответ

2
Лучший ответ

В 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, который обеспечивает положительную бесконечность больше, чем все, кроме самого себя.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню