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