std::numeric_limits - cppreference.com

From cppreference.com

template<classT>classnumeric_limits;The std::numeric_limits class template provides a standardized way to query various properties of arithmetic types (e.g. the largest possible value for type int is std::numeric_limits<int>::max()).

This information is provided via specializations of the std::numeric_limits template. The

standard library

makes available specializations for all arithmetic types (only lists the specializations for cv-unqualified arithmetic types):

Defined in header

<limits>

template<>classnumeric_limits<bool>;template<>classnumeric_limits<char>;template<>classnumeric_limits<signedchar>;template<>classnumeric_limits<unsignedchar>;template<>classnumeric_limits<wchar_t>;template<>classnumeric_limits<char8_t>;(since C++20)template<>classnumeric_limits<char16_t>;(since C++11)template<>classnumeric_limits<char32_t>;(since C++11)template<>classnumeric_limits<short>;template<>classnumeric_limits<unsignedshort>;template<>classnumeric_limits<int>;template<>classnumeric_limits<unsignedint>;template<>classnumeric_limits<long>;template<>classnumeric_limits<unsignedlong>;template<>classnumeric_limits<longlong>;(since C++11)template<>classnumeric_limits<unsignedlonglong>;(since C++11)template<>classnumeric_limits<float>;template<>classnumeric_limits<double>;template<>classnumeric_limits<longdouble>;The value of each member of a specialization of std::numeric_limits on a cv-qualified type cvT is equal to the value of the corresponding member of the specialization on the unqualified type T. For example, std::numeric_limits<int>::digits is equal to std::numeric_limits<constint>::digits.

Aliases of arithmetic types (such as

std::size_t

or

std::streamsize

) may also be examined with the std::numeric_limits type traits.

Non-arithmetic standard types, such as std::complex<T> or

std::nullptr_t

, do not have specializations.

If the implementation defines any

integer-class types

, specializations of std::numeric_limits must also be provided for them.

(since C++20)Implementations may provide specializations of std::numeric_limits for implementation-specific types: e.g. GCC provides std::numeric_limits<__int128>. Non-standard libraries may

add specializations

for library-provided types, e.g.

OpenEXR

provides std::numeric_limits<half> for a 16-bit floating-point type.

Template parameters

T - a type to retrieve numeric properties for Member constants

is_specialized

[static]

identifies types for which

std::numeric_limits

is specialized
(public static member constant)

[edit]

is_signed

[static]

identifies signed types
(public static member constant)

[edit]

is_integer

[static]

identifies integer types
(public static member constant)

[edit]

is_exact

[static]

identifies exact types
(public static member constant)

[edit]

has_infinity

[static]

identifies floating-point types that can represent the special value “positive infinity”
(public static member constant)

[edit]

has_quiet_NaN

[static]

identifies floating-point types that can represent the special value “quiet not-a-number” (NaN)
(public static member constant)

[edit]

has_signaling_NaN

[static]

identifies floating-point types that can represent the special value “signaling not-a-number” (NaN)
(public static member constant)

[edit]

has_denorm

[static]

identifies the denormalization style used by the floating-point type
(public static member constant)

[edit]

has_denorm_loss

[static]

identifies the floating-point types that detect loss of precision as denormalization loss rather than inexact result
(public static member constant)

[edit]

round_style

[static]

identifies the rounding style used by the type
(public static member constant)

[edit]

is_iec559

[static]

identifies the IEC 559/IEEE 754 floating-point types
(public static member constant)

[edit]

is_bounded

[static]

identifies types that represent a finite set of values
(public static member constant)

[edit]

is_modulo

[static]

identifies types that handle overflows with modulo arithmetic
(public static member constant)

[edit]

digits

[static]

number of radix digits that can be represented without change
(public static member constant)

[edit]

digits10

[static]

number of decimal digits that can be represented without change
(public static member constant)

[edit]

max_digits10

[static](C++11)

number of decimal digits necessary to differentiate all values of this type
(public static member constant)

[edit]

radix

[static]

the radix or integer base used by the representation of the given type
(public static member constant)

[edit]

min_exponent

[static]

one more than the smallest negative power of the radix that is a valid normalized floating-point value
(public static member constant)

[edit]

min_exponent10

[static]

the smallest negative power of ten that is a valid normalized floating-point value
(public static member constant)

[edit]

max_exponent

[static]

one more than the largest integer power of the radix that is a valid finite floating-point value
(public static member constant)

[edit]

max_exponent10

[static]

the largest integer power of 10 that is a valid finite floating-point value
(public static member constant)

[edit]

traps

[static]

identifies types which can cause arithmetic operations to trap
(public static member constant)

[edit]

tinyness_before

[static]

identifies floating-point types that detect tinyness before rounding
(public static member constant)

[edit]

Member functions

min

[static]

returns the smallest finite value of the given non-floating-point type, or the smallest positive normal value of the given floating-point type
(public static member function)

[edit]

lowest

[static](C++11)

returns the lowest finite value of the given type, i.e. the most negative value for signed types, 0 for unsigned types
(public static member function)

[edit]

max

[static]

returns the largest finite value of the given type
(public static member function)

[edit]

epsilon

[static]

returns the difference between 1.0 and the next representable value of the given floating-point type
(public static member function)

[edit]

round_error

[static]

returns the maximum rounding error of the given floating-point type
(public static member function)

[edit]

infinity

[static]

returns the positive infinity value of the given floating-point type
(public static member function)

[edit]

quiet_NaN

[static]

returns a quiet NaN value of the given floating-point type
(public static member function)

[edit]

signaling_NaN

[static]

returns a signaling NaN value of the given floating-point type
(public static member function)

[edit]

denorm_min

[static]

returns the smallest positive subnormal value of the given floating-point type
(public static member function)

[edit]

Helper classes

Relationship with C library macro constants

Specialization
std::numeric_limits<T>
where T is Members min()lowest()
(C++11)max()radixboolfalsefalsetrue2char

CHAR_MIN

CHAR_MIN

CHAR_MAX

2signedchar

SCHAR_MIN

SCHAR_MIN

SCHAR_MAX

2unsignedchar00

UCHAR_MAX

2wchar_t

WCHAR_MIN

WCHAR_MIN

WCHAR_MAX

2char8_t00

UCHAR_MAX

2char16_t00

UINT_LEAST16_MAX

2char32_t00

UINT_LEAST32_MAX

2short

SHRT_MIN

SHRT_MIN

SHRT_MAX

2signedshortunsignedshort00

USHRT_MAX

2int

INT_MIN

INT_MIN

INT_MAX

2signedintunsignedint00

UINT_MAX

2long

LONG_MIN

LONG_MIN

LONG_MAX

2signedlongunsignedlong00

ULONG_MAX

2longlong

LLONG_MIN

LLONG_MIN

LLONG_MAX

2signedlonglongunsignedlonglong00

ULLONG_MAX

2Specialization
std::numeric_limits<T>
where T is Members denorm_min()min()lowest()
(C++11)max()epsilon()digitsdigits10float

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

longdouble

LDBL_TRUE_MIN

LDBL_MIN

-LDBL_MAX

LDBL_MAX

LDBL_EPSILON

LDBL_MANT_DIG

LDBL_DIG

Specialization
std::numeric_limits<T>
where T is Members (continue) min_exponentmin_exponent10max_exponentmax_exponent10radixfloat

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

longdouble

LDBL_MIN_EXP

LDBL_MIN_10_EXP

LDBL_MAX_EXP

LDBL_MAX_10_EXP

FLT_RADIX

Example

Run this code

#include<iostream>#include<limits>intmain(){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<unsignedchar>::lowest()<<"\t\t│ "<<+std::numeric_limits<unsignedchar>::min()<<"\t\t│ "<<+std::numeric_limits<unsignedchar>::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';}Possible output:

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 Defect reports

The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

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 See also

Fixed width integer types

Arithmetic types

C++ type system overview

Type support (basic types, RTTI, type traits)

C numeric limits interface