std:: numeric_limits
|
Определено в заголовочном файле
<limits>
|
||
|
template
<
class
T
>
class
numeric_limits
;
|
||
Класс-шаблон
std::numeric_limits
предоставляет стандартизированный способ запроса различных свойств арифметических типов (например, наибольшее возможное значение для типа
int
это
std
::
numeric_limits
<
int
>
::
max
(
)
).
Эта информация предоставляется через специализации шаблона
std::numeric_limits
.
Стандартная библиотека
предоставляет специализации для всех арифметических типов (приведены только специализации для cv-неквалифицированных арифметических типов):
|
Определено в заголовочном файле
<limits>
|
||
|
template
<>
class
numeric_limits
<
bool
>
;
|
||
|
template
<>
class
numeric_limits
<
char
>
;
|
||
|
template
<>
class
numeric_limits
<
signed
char
>
;
|
||
|
template
<>
class
numeric_limits
<
unsigned
char
>
;
|
||
|
template
<>
class
numeric_limits
<
wchar_t
>
;
|
||
|
template
<>
class
numeric_limits
<
char8_t
>
;
|
(начиная с C++20) | |
|
template
<>
class
numeric_limits
<
char16_t
>
;
|
(начиная с C++11) | |
|
template
<>
class
numeric_limits
<
char32_t
>
;
|
(начиная с C++11) | |
|
template
<>
class
numeric_limits
<
short
>
;
|
||
|
template
<>
class
numeric_limits
<
unsigned
short
>
;
|
||
|
template
<>
class
numeric_limits
<
int
>
;
|
||
|
template
<>
class
numeric_limits
<
unsigned
int
>
;
|
||
|
template
<>
class
numeric_limits
<
long
>
;
|
||
|
template
<>
class
numeric_limits
<
unsigned
long
>
;
|
||
|
template
<>
class
numeric_limits
<
long
long
>
;
|
(начиная с C++11) | |
|
template
<>
class
numeric_limits
<
unsigned
long
long
>
;
|
(начиная с C++11) | |
|
template
<>
class
numeric_limits
<
float
>
;
|
||
|
template
<>
class
numeric_limits
<
double
>
;
|
||
|
template
<>
class
numeric_limits
<
long
double
>
;
|
||
Значение каждого члена специализации
std::numeric_limits
для cv-квалифицированного типа
cv
T
равно значению соответствующего члена специализации для неквалифицированного типа
T
. Например,
std
::
numeric_limits
<
int
>
::
digits
равно
std
::
numeric_limits
<
const
int
>
::
digits
.
Псевдонимы арифметических типов (такие как
std::size_t
или
std::streamsize
) также могут быть исследованы с помощью
std::numeric_limits
type traits.
Неарифметические стандартные типы, такие как std:: complex < T > или std::nullptr_t , не имеют специализаций.
|
Если реализация определяет какие-либо
integer-class types
, специализации
|
(since C++20) |
Реализации могут предоставлять специализации
std::numeric_limits
для специфичных для реализации типов: например, GCC предоставляет
std::numeric_limits<__int128>
. Нестандартные библиотеки могут
добавлять специализации
для предоставляемых библиотекой типов, например,
OpenEXR
предоставляет
std::numeric_limits<half>
для 16-битного типа с плавающей запятой.
Содержание |
Параметры шаблона
| T | - | тип, для которого извлекаются числовые свойства |
Константы-члены
|
[static]
|
идентифицирует типы, для которых
std::numeric_limits
специализирован
(публичная статическая константа-член) |
|
[static]
|
идентифицирует знаковые типы
(публичная статическая константа-член) |
|
[static]
|
идентифицирует целочисленные типы
(публичная статическая константа-член) |
|
[static]
|
идентифицирует точные типы
(публичная статическая константа-член) |
|
[static]
|
идентифицирует типы с плавающей запятой, которые могут представлять специальное значение "положительная бесконечность"
(public static member constant) |
|
[static]
|
идентифицирует типы с плавающей запятой, которые могут представлять специальное значение "тихий не-число" (NaN)
(публичная статическая константа-член) |
|
[static]
|
идентифицирует типы с плавающей запятой, которые могут представлять специальное значение "сигнализирующий не-число" (NaN)
(публичная статическая константа-член) |
|
[static]
|
идентифицирует стиль денормализации, используемый типом с плавающей запятой
(публичная статическая константа-член) |
|
[static]
|
идентифицирует типы с плавающей запятой, которые обнаруживают потерю точности как потерю денормализации, а не как неточный результат
(public static member constant) |
|
[static]
|
идентифицирует стиль округления, используемый типом
(публичная статическая константа-член) |
|
[static]
|
идентифицирует типы с плавающей запятой IEC 559/IEEE 754
(public static member constant) |
|
[static]
|
идентифицирует типы, которые представляют конечное множество значений
(публичная статическая константа-член) |
|
[static]
|
идентифицирует типы, которые обрабатывают переполнения с помощью модульной арифметики
(public static member constant) |
|
[static]
|
количество
radix
цифр, которые могут быть представлены без изменения
(публичная статическая константа-член) |
|
[static]
|
количество десятичных цифр, которые могут быть представлены без изменения
(публичная статическая константа-член) |
|
[static]
(C++11)
|
количество десятичных цифр, необходимое для различения всех значений данного типа
(публичная статическая константа-член) |
|
[static]
|
основание системы счисления, используемое для представления данного типа
(публичная статическая константа-член) |
|
[static]
|
на единицу больше наименьшей отрицательной степени основания системы счисления, которая является допустимым нормализованным значением с плавающей запятой
(публичная статическая константа-член) |
|
[static]
|
наименьшая отрицательная степень десяти, которая является допустимым нормализованным значением с плавающей точкой
(публичная статическая константа-член) |
|
[static]
|
на единицу больше наибольшей целой степени основания системы счисления, которая является допустимым конечным значением с плавающей точкой
(публичная статическая константа-член) |
|
[static]
|
наибольшая целочисленная степень 10, которая является допустимым конечным значением с плавающей точкой
(публичная статическая константа-член) |
|
[static]
|
идентифицирует типы, которые могут вызывать прерывание арифметических операций
(public static member constant) |
|
[static]
|
идентифицирует типы с плавающей точкой, которые обнаруживают потерю точности до округления
(публичная статическая константа-член) |
Функции-члены
|
[static]
|
возвращает наименьшее конечное значение для заданного не-вещественного типа или наименьшее положительное нормализованное значение для заданного вещественного типа
(public static member function) |
|
[static]
(C++11)
|
возвращает наименьшее конечное значение для заданного типа, т.е. наиболее отрицательное значение для знаковых типов,
0
для беззнаковых типов
(public static member function) |
|
[static]
|
возвращает наибольшее конечное значение для заданного типа
(public static member function) |
|
[static]
|
возвращает разницу между
1.0
и следующим представимым значением для заданного вещественного типа
(public static member function) |
|
[static]
|
возвращает максимальную ошибку округления для заданного вещественного типа
(public static member function) |
|
[static]
|
возвращает значение положительной бесконечности для заданного вещественного типа
(public static member function) |
|
[static]
|
возвращает тихий NaN для заданного вещественного типа
(public static member function) |
|
[static]
|
возвращает сигнальный NaN для заданного вещественного типа
(public static member function) |
|
[static]
|
возвращает наименьшее положительное денормализованное значение для заданного вещественного типа
(public static member function) |
Вспомогательные классы
|
указывает режимы округления чисел с плавающей точкой
(enum) |
|
|
указывает режимы денормализации чисел с плавающей точкой
(enum) |
Связь с макроконстантами библиотеки C
Специализация
std::numeric_limits<T>
где
T
является
|
Члены | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
min()
|
lowest()
(C++11) |
max()
|
radix
|
||||||||
| bool | false | false | true | 2 | |||||||
| char | CHAR_MIN | CHAR_MIN | CHAR_MAX | 2 | |||||||
| signed char | SCHAR_MIN | SCHAR_MIN | SCHAR_MAX | 2 | |||||||
| unsigned char | 0 | 0 | UCHAR_MAX | 2 | |||||||
| wchar_t | WCHAR_MIN | WCHAR_MIN | WCHAR_MAX | 2 | |||||||
| char8_t | 0 | 0 | UCHAR_MAX | 2 | |||||||
| char16_t | 0 | 0 | UINT_LEAST16_MAX | 2 | |||||||
| char32_t | 0 | 0 | UINT_LEAST32_MAX | 2 | |||||||
| short | SHRT_MIN | SHRT_MIN | SHRT_MAX | 2 | |||||||
| signed short | |||||||||||
| unsigned short | 0 | 0 | USHRT_MAX | 2 | |||||||
| int | INT_MIN | INT_MIN | INT_MAX | 2 | |||||||
| signed int | |||||||||||
| unsigned int | 0 | 0 | UINT_MAX | 2 | |||||||
| long | LONG_MIN | LONG_MIN | LONG_MAX | 2 | |||||||
| signed long | |||||||||||
| unsigned long | 0 | 0 | ULONG_MAX | 2 | |||||||
| long long | LLONG_MIN | LLONG_MIN | LLONG_MAX | 2 | |||||||
| signed long long | |||||||||||
| unsigned long long | 0 | 0 | ULLONG_MAX | 2 | |||||||
Специализация
std::numeric_limits<T>
где
T
это
|
Члены | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
denorm_min()
|
min()
|
lowest()
(C++11) |
max()
|
epsilon()
|
digits
|
digits10
|
|||||
| float | FLT_TRUE_MIN | FLT_MIN | - FLT_MAX | FLT_MAX | FLT_EPSILON | FLT_MANT_DIG | FLT_DIG | ||||
| double | DBL_TRUE_MIN | DBL_MIN | - DBL_MAX | DBL_MAX | DBL_EPSILON | DBL_MANT_DIG | DBL_DIG | ||||
| long double | LDBL_TRUE_MIN | LDBL_MIN | - LDBL_MAX | LDBL_MAX | LDBL_EPSILON | LDBL_MANT_DIG | LDBL_DIG | ||||
Специализация
std::numeric_limits<T>
где
T
это
|
Члены (продолжение) | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
min_exponent
|
min_exponent10
|
max_exponent
|
max_exponent10
|
radix
|
|||||||
| float | FLT_MIN_EXP | FLT_MIN_10_EXP | FLT_MAX_EXP | FLT_MAX_10_EXP | FLT_RADIX | ||||||
| double | DBL_MIN_EXP | DBL_MIN_10_EXP | DBL_MAX_EXP | DBL_MAX_10_EXP | FLT_RADIX | ||||||
| long double | LDBL_MIN_EXP | LDBL_MIN_10_EXP | LDBL_MAX_EXP | LDBL_MAX_10_EXP | FLT_RADIX | ||||||
Пример
#include <iostream> #include <limits> int main() { std::cout << "type\t│ lowest()\t│ min()\t\t│ max()\n" << "bool\t│ " << std::numeric_limits<bool>::lowest() << "\t\t│ " << std::numeric_limits<bool>::min() << "\t\t│ " << std::numeric_limits<bool>::max() << '\n' << "uchar\t│ " << +std::numeric_limits<unsigned char>::lowest() << "\t\t│ " << +std::numeric_limits<unsigned char>::min() << "\t\t│ " << +std::numeric_limits<unsigned char>::max() << '\n' << "int\t│ " << std::numeric_limits<int>::lowest() << "\t│ " << std::numeric_limits<int>::min() << "\t│ " << std::numeric_limits<int>::max() << '\n' << "float\t│ " << std::numeric_limits<float>::lowest() << "\t│ " << std::numeric_limits<float>::min() << "\t│ " << std::numeric_limits<float>::max() << '\n' << "double\t│ " << std::numeric_limits<double>::lowest() << "\t│ " << std::numeric_limits<double>::min() << "\t│ " << std::numeric_limits<double>::max() << '\n'; }
Возможный вывод:
type │ lowest() │ min() │ max() bool │ 0 │ 0 │ 1 uchar │ 0 │ 0 │ 255 int │ -2147483648 │ -2147483648 │ 2147483647 float │ -3.40282e+38 │ 1.17549e-38 │ 3.40282e+38 double │ -1.79769e+308 │ 2.22507e-308 │ 1.79769e+308
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены задним числом к ранее опубликованным стандартам C++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 201 | C++98 | specializations for all fundamental types need to be provided | excluded non-arithmetic types |
| LWG 559 | C++98 |
it was unclear whether the
std::numeric_limits
specialization for a cv-qualified type behaves as the same as the corresponding specialization for the cv-unqualified type |
they have the
same behavior |