类模板
<limits>

std::numeric_limits

template <class T> numeric_limits;
数字限制类型
为编译此库的特定平台上的所有*算术类型*(整数类型或浮点类型)提供有关属性的信息。

这个类模板为每个*基本算术类型*进行了特化,其成员描述了类型T的属性。这个模板不应对任何其他类型进行特化。

模板参数

T
一个类型。
如果这是一个*基本算术类型*,那么该类的成员将描述它的属性。

sub_match for string literals (class)

基本算术类型
整数类型bool
char
wchar_t
signed char
short int
int
long int
unsigned char
unsigned short int
unsigned int
unsigned long int
浮点类型float
double
long double
对于任何其他类型,将使用其默认定义。
基本算术类型
整数类型bool
char
char16_t
char32_t
wchar_t
signed char
short int
int
long int
long long int
unsigned char
unsigned short int
unsigned int
unsigned long int
unsigned long long int
浮点类型float
double
long double
此模板还为所有这些类型的const和/或volatile限定版本进行了特化,其值与无限定的特化相同。

对于任何其他类型,将使用其默认定义。

生成类型T的成员是成员函数,而特定类型的成员是静态成员常量。

成员

成员类型属性
is_specializedbool对于所有*算术类型*(即numeric_limits特化的类型)为true
对于所有其他类型为false
min()T最小有限值。
对于具有反规格化(指数位数可变)的浮点类型:最小正规格化值。
取决于类型,等同于CHAR_MINSCHAR_MINSHRT_MININT_MINLONG_MINLLONG_MINFLT_MINDBL_MINLDBL_MIN0
max()T最大有限值。
取决于类型,等同于CHAR_MAXSCHAR_MAXUCHAR_MAXSHRT_MAXUSHRT_MAXINT_MAXUINT_MAXLONG_MAXULONG_MAXLLONG_MAXULLONG_MAXUINT_LEAST16_MAXUINT_LEAST32_MAXFLT_MAXDBL_MAXLDBL_MAX
lowest()T最小有限值。(自C++11起)
对于整数类型:与min()相同。
对于浮点类型:实现定义;通常是max()的负值。
digitsint对于整数类型:表示中非符号位的数量(radix进制数字)。
对于浮点类型:尾数中的数字数量(radix进制);等同于FLT_MANT_DIGDBL_MANT_DIGLDBL_MANT_DIG)。
digits10int能够不改变地表示的(十进制)数字数量。
对于浮点类型,等同于FLT_DIGDBL_DIGLDBL_DIG
max_digits10int为了确保不同值总是能被区分而需要的(十进制)数字数量。
is_signedbool如果类型是有符号的,则为true
is_integerbool如果类型是整数,则为true
is_exactbool如果类型使用精确表示,则为true
radixint对于整数类型:表示的基数。
对于浮点类型:表示中指数的基数(等同于FLT_RADIX)。
epsilon()T机器epsilon(1与大于1的最小可表示值之间的差)。
对于浮点类型,等同于FLT_EPSILONDBL_EPSILONLDBL_EPSILON
round_error()T最大舍入误差的度量。
min_exponentint最小负整数值,使得radix(min_exponent-1)次方生成一个规格化的浮点数。
对于浮点类型,等同于FLT_MIN_EXPDBL_MIN_EXPLDBL_MIN_EXP
min_exponent10int最小负整数值,使得10的该次方生成一个规格化的浮点数。
对于浮点类型,等同于FLT_MIN_10_EXPDBL_MIN_10_EXPLDBL_MIN_10_EXP
max_exponentint最大整数值,使得radix(max_exponent-1)次方生成一个可表示的有限浮点数。
对于浮点类型,等同于FLT_MAX_EXPDBL_MAX_EXPLDBL_MAX_EXP
max_exponent10int最大整数值,使得10的该次方生成一个规格化的有限浮点数。
对于浮点类型,等同于FLT_MAX_10_EXPDBL_MAX_10_EXPLDBL_MAX_10_EXP
has_infinitybool如果类型有正无穷大的表示,则为true
has_quiet_NaNbool如果类型有安静(非信号)“非数字”(NaN)的表示,则为true
has_signaling_NaNbool如果类型有信号“非数字”(NaN)的表示,则为true
has_denormfloat_denorm_style反规格化值(指数位数可变的表示)。一个类型可能具有以下任一枚举值:
denorm_absent,如果它不允许反规格化值。
denorm_present,如果它允许反规格化值。
denorm_indeterminate,如果编译时无法确定。
has_denorm_lossbool如果*精度损失*被检测为反规格化损失,而不是不精确的结果,则为true
infinity()T如果可用,则为*正无穷大*的表示。
quiet_NaN()T如果可用,则为*安静*(非信号)*“非数字”*(NaN)的表示。
signaling_NaN()T如果可用,则为*信号“非数字”*(NaN)的表示。
denorm_min()T最小正反规格化值。
对于不允许反规格化值的类型:与min()相同。
is_iec559bool如果类型符合IEC-559 / IEEE-754标准,则为true
IEC-559类型总是具有has_infinityhas_quiet_NaNhas_signaling_NaN设置为true;并且infinityquiet_NaNsignaling_NaN返回非零值。
is_boundedbool如果类型表示的值集是有限的,则为true
is_modulobool如果类型是模运算的,则为true。如果两个正数相加后结果会回绕成一个更小的第三个数,则该类型为*模运算*类型。
trapsbool如果为该类型实现了陷阱(trapping),则为true
tinyness_beforebool如果在舍入之前检测到微小值(tinyness),则为true
round_stylefloat_round_style舍入风格。一个类型可能具有以下任一枚举值:
round_toward_zero,如果它向零舍入。
round_to_nearest,如果它舍入到最近的可表示值。
round_toward_infinity,如果它向无穷大舍入。
round_toward_neg_infinity,如果它向负无穷大舍入。
round_indeterminate,如果舍入风格在编译时无法确定。

对于所有不是*基本算术类型*的类型,将使用默认的模板定义。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
template <class T> class numeric_limits {
public:
  static const bool is_specialized = false;
  static T min() throw();
  static T max() throw();
  static const int  digits = 0;
  static const int  digits10 = 0;
  static const bool is_signed = false;
  static const bool is_integer = false;
  static const bool is_exact = false;
  static const int radix = 0;
  static T epsilon() throw();
  static T round_error() throw();

  static const int  min_exponent = 0;
  static const int  min_exponent10 = 0;
  static const int  max_exponent = 0;
  static const int  max_exponent10 = 0;

  static const bool has_infinity = false;
  static const bool has_quiet_NaN = false;
  static const bool has_signaling_NaN = false;
  static const float_denorm_style has_denorm = denorm_absent;
  static const bool has_denorm_loss = false;
  static T infinity() throw();
  static T quiet_NaN() throw();
  static T signaling_NaN() throw();
  static T denorm_min() throw();

  static const bool is_iec559 = false;
  static const bool is_bounded = false;
  static const bool is_modulo = false;

  static const bool traps = false;
  static const bool tinyness_before = false;
  static const float_round_style round_style = round_toward_zero;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
template <class T> class numeric_limits {
public:
  static constexpr bool is_specialized = false;
  static constexpr T min() noexcept { return T(); }
  static constexpr T max() noexcept { return T(); }
  static constexpr T lowest() noexcept { return T(); }
  static constexpr int  digits = 0;
  static constexpr int  digits10 = 0;
  static constexpr bool is_signed = false;
  static constexpr bool is_integer = false;
  static constexpr bool is_exact = false;
  static constexpr int radix = 0;
  static constexpr T epsilon() noexcept { return T(); }
  static constexpr T round_error() noexcept { return T(); }

  static constexpr int  min_exponent = 0;
  static constexpr int  min_exponent10 = 0;
  static constexpr int  max_exponent = 0;
  static constexpr int  max_exponent10 = 0;

  static constexpr bool has_infinity = false;
  static constexpr bool has_quiet_NaN = false;
  static constexpr bool has_signaling_NaN = false;
  static constexpr float_denorm_style has_denorm = denorm_absent;
  static constexpr bool has_denorm_loss = false;
  static constexpr T infinity() noexcept { return T(); }
  static constexpr T quiet_NaN() noexcept { return T(); }
  static constexpr T signaling_NaN() noexcept { return T(); }
  static constexpr T denorm_min() noexcept { return T(); }

  static constexpr bool is_iec559 = false;
  static constexpr bool is_bounded = false;
  static constexpr bool is_modulo = false;

  static constexpr bool traps = false;
  static constexpr bool tinyness_before = false;
  static constexpr float_round_style round_style = round_toward_zero;
};

所有特化也应将这些值提供为*常量表达式*。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
// numeric_limits example
#include <iostream>     // std::cout
#include <limits>       // std::numeric_limits

int main () {
  std::cout << std::boolalpha;
  std::cout << "Minimum value for int: " << std::numeric_limits<int>::min() << '\n';
  std::cout << "Maximum value for int: " << std::numeric_limits<int>::max() << '\n';
  std::cout << "int is signed: " << std::numeric_limits<int>::is_signed << '\n';
  std::cout << "Non-sign bits in int: " << std::numeric_limits<int>::digits << '\n';
  std::cout << "int has infinity: " << std::numeric_limits<int>::has_infinity << '\n';
  return 0;
}

可能的输出

Minimum value for int: -2147483648
Maximum value for int: 2147483647
int is signed: true
Non-sign bits in int: 31
int has infinity: false


另见