Основываясь на приведенной выше информации, можно увидеть, что различные типы чисел могут быть дифференцированы на основе информации, хранящейся в<std::numeric_limits
>. Это дополнение к классу признаковnumber_category, предоставленному этой библиотекой.
Для целого типа Т выполняются все следующие условия:
std::numeric_limits<T>::is_specialized == true
std::numeric_limits<T>::is_integer == true
std::numeric_limits<T>::is_exact == true
std::numeric_limits<T>::min_exponent == 0
std::numeric_limits<T>::max_exponent == 0
std::numeric_limits<T>::min_exponent10 == 0
std::numeric_limits<T>::max_exponent10 == 0
Кроме того, типподписан, если:
std::numeric_limits<T>::is_signed == true
Если тип имеет произвольную точность, то:
std::numeric_limits<T>::is_bounded == false
В противном случае тип ограничен и возвращает ненулевое значение от:
std::numeric_limits<T>::max()
и имеет:
std::numeric_limits<T>::is_modulo == true
если тип реализует арифметику модуля по переполнению.
Рациональные типы подобны целым числам, за исключением того, что:
std::numeric_limits<T>::is_integer == false
По-видимому, нет никакого способа отличить их от рациональных типов, если они не устанавливают:
std::numeric_limits<T>::is_exact == false
Это связано с тем, что эти типы по существу являются рациональным типом с фиксированным знаменателем.
Для типа Т с плавающей точкой выполняются все следующие условия:
std::numeric_limits<T>::is_specialized == true
std::numeric_limits<T>::is_integer == false
std::numeric_limits<T>::is_exact == false
std::numeric_limits<T>::min_exponent != 0
std::numeric_limits<T>::max_exponent != 0
std::numeric_limits<T>::min_exponent10 != 0
std::numeric_limits<T>::max_exponent10 != 0
Кроме того, типподписан, если:
std::numeric_limits<T>::is_signed == true
И тип может быть десятичным или двоичным в зависимости от значения:
std::numeric_limits<T>::radix
Как правило, не существует типов с произвольной точностью плавающей точки, и поэтому:
std::numeric_limits<T>::is_bounded == false
Точные типы плавающих точек представляют собой поле, состоящее из произвольного целого числа точности, масштабируемого экспонентом. Такие типы не имеют оператора деления и являются такими же, как типы с плавающей запятой, за исключением:
std::numeric_limits<T>::is_exact == true
По историческим причинам комплексные числа не специализируются<std::numeric_limits
>, вместо этого необходимо осмотреть<std::numeric_limits<T::value_type>
>.