Почему numeric_limits & lt; int & gt; :: max () & gt; numeric_limits & л; INT & GT; :: бесконечности ()?

я читал Установка int в бесконечность в C ++. Я понимаю, что когда нужно истинное бесконечность, нужно использовать numeric_limits<float>::infinity(); Я предполагаю, что обоснование этого заключается в том, что обычно целочисленные типы не имеют значений, предназначенных для представления особых состояний, таких как NaN, Inf, и т.д., как это делают поплавки IEEE 754 (опять же, C ++ не требует ни int & float используются оставлены для реализации); но тем не менее это вводит в заблуждение, что max > infinity для данного типа. Я пытаюсь понять обоснование этого вызова в стандарте. Если имея infinity не имеет смысла для типа, то не должен ли он быть запрещен вместо того, чтобы иметь флаг, который будет проверен на предмет его валидности?

24

Решение

Функция numeric_limits<T>::infinity() имеет смысл для тех, T для которого numeric_limits<T>::has_infinity возвращается true,

В случае T=int, это возвращает false, Так что сравнение не имеет смысла, потому что numeric_limits<int>::infinity() не возвращает ни одного значимым значение для сравнения.

31

Другие решения

Если вы читаете, например, эта ссылка вы увидите таблицу, в которой бесконечность равна нулю для целочисленных типов. Это потому, что целочисленные типы в C ++ не могут быть по определению бесконечными.

6

Предположим, наоборот, стандарт сделал зарезервировать некоторую ценность, чтобы представлять безграничность, и что numeric_limits<int>::infinity() > numeric_limits<int>::max(), Это означает, что будет какое-то значение int который больше чем max()то есть некоторое представимое значение int больше наибольшего представимого значения int.

Ясно, что каким бы образом ни указывал Стандарт, некоторое естественное понимание нарушается. Или inifinity() <= max()или существует такой х, что int(x) > max(), Стандарт должен выбрать, какое правило природы нарушать.

Я считаю, что они выбрали мудро.

4

numeric_limits<int>::infinity() возвращает представление положительной бесконечности, если доступно.

В случае целых чисел положительная бесконечность не существует:

cout << "int has infinity: " << numeric_limits<int>::has_infinity << endl;

печать

int has infinity: false
0
По вопросам рекламы [email protected]