2014-09-06 7 views
0

С <cmath> берет свое начало от стандарта C, но <limits> является родным C++, при условии, что numeric_limits<double>::has_infinity() истинно (редактирования: и что numeric_limits<double>::is_iec559() верно), делает C++ (98/11/14) стандартные гарантии в любом месте, где всегда верно следующее: Ссылки на MSDN и cplusplus.com, похоже, не предлагают никаких полезных объяснений.Гарантии о бесконечности C++()

  • 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 :: is_iec559()' так же верно, компилятор все еще может вернуться верно для 'numeric_limits :: has_infinity()', но обеспечивают странные семантики (например, для ' <', что фальсифицирует последние два). У вас есть причина не тестировать плавающие точки IEEE 754, что подразумевало бы наличие бесконечности и разумной семантики для операций с плавающей запятой одновременно? –

+0

@PascalCuoq: хорошо сказано. Можно добавить 'static_assert (is_iec559())' и получить гораздо больше уверенности в предположениях, подобных OP. –

+0

@PascalCuoq Спасибо. Скажем, 'is_iec559()' истинно. Меня беспокоит совместимость между библиотеками C и C++. – user740006

ответ

2

В стандарте C++ 11 мало что можно найти на infinity(). Просто, что это представление положительное infinity.

isinf() принадлежит C++ к <cmath>, который оборачивает С математической библиотеки, и C11 говорит: isinf макрос возвращает ненулевое значение, если и только если ее аргумент имеет бесконечное значение. Следовательно, вы можете вывести из этого определения, что isinf(numeric_limits<double>::infinity()) должно быть предоставлено.

Никакой официальной гарантии не предоставляется в самом стандарте, поскольку каждый конечный x должен быть более малым, чем бесконечность. Однако, если верно numeric_limits<double>::is_iec559, то вы можете основывать свое предположение на стандарте iec 559 aka Ieee 754, который ensures положительная бесконечность больше все, кроме себя.

 Смежные вопросы

  • Нет связанных вопросов^_^