я читал Установка int в бесконечность в C ++. Я понимаю, что когда нужно истинное бесконечность, нужно использовать numeric_limits<float>::infinity()
; Я предполагаю, что обоснование этого заключается в том, что обычно целочисленные типы не имеют значений, предназначенных для представления особых состояний, таких как NaN, Inf, и т.д., как это делают поплавки IEEE 754 (опять же, C ++ не требует ни int
& float
используются оставлены для реализации); но тем не менее это вводит в заблуждение, что max > infinity
для данного типа. Я пытаюсь понять обоснование этого вызова в стандарте. Если имея infinity
не имеет смысла для типа, то не должен ли он быть запрещен вместо того, чтобы иметь флаг, который будет проверен на предмет его валидности?
Функция numeric_limits<T>::infinity()
имеет смысл для тех, T
для которого numeric_limits<T>::has_infinity
возвращается true
,
В случае T=int
, это возвращает false
, Так что сравнение не имеет смысла, потому что numeric_limits<int>::infinity()
не возвращает ни одного значимым значение для сравнения.
Если вы читаете, например, эта ссылка вы увидите таблицу, в которой бесконечность равна нулю для целочисленных типов. Это потому, что целочисленные типы в C ++ не могут быть по определению бесконечными.
Предположим, наоборот, стандарт сделал зарезервировать некоторую ценность, чтобы представлять безграничность, и что numeric_limits<int>::infinity() > numeric_limits<int>::max()
, Это означает, что будет какое-то значение int
который больше чем max()
то есть некоторое представимое значение int
больше наибольшего представимого значения int.
Ясно, что каким бы образом ни указывал Стандарт, некоторое естественное понимание нарушается. Или inifinity() <= max()
или существует такой х, что int(x) > max()
, Стандарт должен выбрать, какое правило природы нарушать.
Я считаю, что они выбрали мудро.
numeric_limits<int>::infinity()
возвращает представление положительной бесконечности, если доступно.
В случае целых чисел положительная бесконечность не существует:
cout << "int has infinity: " << numeric_limits<int>::has_infinity << endl;
печать
int has infinity: false