Почему numeric_limits <int>:: max()> numeric_limits <int>:: infinity()?

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

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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

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

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

печатает

int has infinity: false