C++ 库 - <限制>


介绍

它是一种数字限制类型,提供有关库编译的特定平台中算术类型(整型或浮点型)属性的信息。

宣言

以下是 std::numeric_limits 的声明。

template <class T> numeric_limits; 

C++11

template <class T> numeric_limits; 

参数

T - 它是一种类。

例子

在下面的 std::numeric_limits 示例中。

#include <limits>
#include <iostream>

int main() {
   std::cout << "type\tlowest type\thighest type\n";
   std::cout << "int\t"
      << std::numeric_limits<int>::lowest() << '\t'
      << std::numeric_limits<int>::max() << '\n';
   std::cout << "float\t"
      << std::numeric_limits<float>::lowest() << '\t'
      << std::numeric_limits<float>::max() << '\n';
   std::cout << "double\t"
      << std::numeric_limits<double>::lowest() << '\t'
      << std::numeric_limits<double>::max() << '\n';
}

示例输出应该是这样的 -

type	lowest type	highest type
int	-2147483648	2147483647
float	-3.40282e+38	3.40282e+38
double	-1.79769e+308	1.79769e+308

模板实例化

C++98 的基本算术类型应该是这样的 -

基本算术类型
整数类型 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

C++11 的基本算术类型应该是这样的 -

基本算术类型
整数类型 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

会员

成员 类型 财产
is_specialized bool true适用于所有人(即那些数字限制是专门的)。以及false所有其他类型。
分钟() 时间

它是最小有限值。

对于具有非标准化的浮点类型(可变数量的指数位):最小正标准化值。

相当于CHAR_MIN,SCHAR_MIN,SHRT_MIN,INT_MIN,LONG_MIN,LLONG_MIN,FLT_MIN,BL_MIN,LDBL_MIN0,取决于类型。

最大限度() 时间

它是最大有限值。

相当于字符最大值,SCHAR_MAX,UCHAR_MAX,SHRT_MAX,USHRT_MAX,INT_MAX,UINT_MAX,长_最大,ULONG_MAX,LLONG_MAX,ULLONG_MAX,UINT_LEAST16_MAX,UINT_LEAST32_MAX,最大FLT,最大DBL_MAX或者LDBL_MAX,取决于类型。

最低() 时间

它是最小有限值。(自 C++11 起)

对于整数类型:与分钟()

对于浮点类型:取决于实现;一般来说,负数最大限度()

数字 整数

它适用于整数类型:表示形式中非符号位(基数)的数量

对于浮点类型:尾数中的位数(以基数为基数)(相当于FLT_MANT_DIG,DBL_MANT_DIG或者LDBL_MANT_DIG)。

数字10 int

它是可以不改变地表示的数字位数(以十进制为基数)。

相当于FLT_DIG,DBL_DIG或者LDBL_DIG对于浮动类型。

最大位数10 int 它是一些数字(以十进制为基础),需要确保不同的值始终能够区分。
有符号 bool true如果类型有符号。
是整数 bool true如果类型是整数。
是_精确的 bool true如果类型使用精确的表示。
基数 int

它适用于整数类型:表示的基数。

对于浮点类型:表示形式的指数的基数(相当于FLT_RADIX)。

厄普西隆() 时间

它是一个机器 epsilon(1 和可表示的大于 1 的最小值之间的差)。

相当于FLT_EPSILON,DBL_EPSILON或者LDBL_EPSILON对于浮动类型。

round_error() 时间 它测量最大舍入误差。
最小指数 int

它是最小负整数值,基数提高后可(min_exponent-1)生成标准化浮点数。

相当于FLT_MIN_EXP,DBL_MIN_EXP或者LDBL_MIN_EXP对于浮动类型。

最小指数10 int

它是一个最小负整数值,10 的该次方可以生成标准化浮点数。

相当于FLT_MIN_10_EXP,DBL_MIN_10_EXP或者LDBL_MIN_10_EXP对于浮动类型。

最大指数 int

它是一个最大整数值,基数提高后可(max_exponent-1)生成可表示的有限浮点数。

相当于FLT_MAX_EXP,DBL_MAX_EXP或者LDBL_MAX_EXP对于浮动类型。

最大指数10 int

它是一个最大整数值,10 的该次幂会生成一个标准化的有限浮点数。

相当于FLT_MAX_10_EXP,DBL_MAX_10_EXP或者LDBL_MAX_10_EXP对于浮动类型。

有无穷大 bool true如果该类型具有正无穷大的表示。
有_安静_NaN bool true如果该类型具有安静(非信号)“Not-a-Number”的表示。
has_signaling_NaN bool true如果该类型具有信令“Not-a-Number”的表示。
有分值 浮动分值样式

它是非规格化值(具有可变数量的指数位的表示)。类型可以具有以下任何枚举值 -

denorm_absent,如果它不允许非规范化值。

denorm_present,如果它允许非规范化值。

denorm_不确定,如果在编译时不确定。

有分值损失 bool true如果准确性损失被检测为非规范化损失,而不是不精确的结果。
无穷() 时间 它代表正无穷大(如果可用)。
安静的_NaN() 时间 它代表安静(非信令)“Not-a-Number”(如果可用)。
signalling_NaN() 时间 它代表信号“Not-a-Number”(如果可用)。
denorm_min() 时间

最小正非规格化值。

它适用于不允许非规范化值的类型:与 相同min()

is_iec559 bool

true如果类型符合 IEC-559 / IEEE-754 标准。

IEC-559 类型始终具有有无穷大,有_安静_NaNhas_signaling_NaN设置为true;和无穷,安静的_NaN信令_NaN返回一些非零值。

有界 bool true如果该类型表示的值集是有限的。
是模 bool true如果类型是模数。如果可以将两个正数相加并得到返回到第三个较小的数的结果,则该类型是模数类型。
陷阱 bool true是否为该类型实现了陷阱。
之前的微小性 bool true如果在舍入之前检测到微小。
圆形样式 浮动圆形样式

这是一种圆角风格。类型可以具有以下任何枚举值 -

向零舍入,如果它向零舍入。

舍入到最近的,如果四舍五入到最接近的可表示值。

向无穷大舍入,如果四舍五入到无穷大。

向负无穷大舍入,如果它向负无穷大舍入。

轮不确定,如果舍入样式在编译时无法确定。

对于上述所有非基本算术类型的类型,使用默认模板定义 -

C++98

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;
};

C++11

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;
};