С <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
нарушает верхнюю границу или нет.
В чистой теории, если компилятор не определяет 'numeric_limits :: is_iec559()' так же верно, компилятор все еще может вернуться верно для 'numeric_limits :: has_infinity()', но обеспечивают странные семантики (например, для ' <', что фальсифицирует последние два). У вас есть причина не тестировать плавающие точки IEEE 754, что подразумевало бы наличие бесконечности и разумной семантики для операций с плавающей запятой одновременно? –
@PascalCuoq: хорошо сказано. Можно добавить 'static_assert (is_iec559())' и получить гораздо больше уверенности в предположениях, подобных OP. –
@PascalCuoq Спасибо. Скажем, 'is_iec559()' истинно. Меня беспокоит совместимость между библиотеками C и C++. – user740006