Cpp Standard Library 简明教程

C++ Library - <limits>

Introduction

它是一个数值限制类型,它提供有关特定平台上算术类型(整数或浮点数)的属性的信息,该平台是该库进行编译的。

Declaration

以下是 std::numeric_limits 的声明。

template <class T> numeric_limits;

C++11

template <class T> numeric_limits;

Parameters

T − 它是一个类类型。

Example

在 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

Template instantiations

C++98 的基本算术类型应如下所示:

fundamental arithmetic types

integral types

bool

char

wchar_t

signed char

short int

int

long int

unsigned char

unsigned short int

unsigned int

unsigned long int

floating point types

float

double

long double

C++11 的基本算术类型应如下所示:

fundamental arithmetic types

integral types

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

floating point types

float

double

long double

Members

member

type

property

is_specialized

bool

它对所有类型都是真的(即 numeric_limits 是专门化的那些类型)。并且对所有其他类型都是假的。

min()

T

它是一个最小终值。对于具有非规格化的浮点类型(可变指数位数):最小正规格化值。等同于 CHAR_MIN、SCHAR_MIN、SHRT_MIN、INT_MIN、LONG_MIN、LLONG_MIN、FLT_MIN、BL_MIN、LDBL_MIN 或 0,取决于类型。

max()

T

它是一个最大终值。等同于 CHAR_MAX、SCHAR_MAX、UCHAR_MAX、SHRT_MAX、USHRT_MAX、INT_MAX、UINT_MAX、LONG_MAX、ULONG_MAX、LLONG_MAX、ULLONG_MAX、UINT_LEAST16_MAX、UINT_LEAST32_MAX、FLT_MAX、DBL_MAX 或 LDBL_MAX,取决于类型。

lowest()

T

它是一个最小终值。(自 C++11 以来)对于整数类型:与 min() 相同。对于浮点类型:依赖于实现;通常,是 max() 的负数。

digits

int

它适用于整数类型:表示中的非符号位数(基数数字)。对于浮点类型:尾数中的数字数目(基于基数)(等同于 FLT_MANT_DIG、DBL_MANT_DIG 或 LDBL_MANT_DIG)。

digits10

int

它是在不改变的情况下可以表示的数字数目(以十进制为基数)。对于浮点类型,等同于 FLT_DIG、DBL_DIG 或 LDBL_DIG。

max_digits10

int

它是一组数字(十进制基),用于确保不同的值始终有所区别。

is_signed

bool

如果类型已签名,则为 true。

is_integer

bool

如果类型是整数,则为 true。

is_exact

bool

如果类型使用精确表示,则为 true。

radix

int

对于整数类型:表示的基数。对于浮点类型:表示的指数基数(等效于 FLT_RADIX)。

epsilon()

T

它是一个机器精度(1 与大于 1 的最小可表示值之间的差)。对于浮点类型,等效于 FLT_EPSILON、DBL_EPSILON 或 LDBL_EPSILON。

round_error()

T

它衡量最大舍入误差。

min_exponent

int

它是最小负整数,使得基数提高到 (min_exponent-1) 会生成一个规范化的浮点数。对于浮点类型,等效于 FLT_MIN_EXP、DBL_MIN_EXP 或 LDBL_MIN_EXP。

min_exponent10

int

它是最小负整数,使得 10 的该次幂会生成一个规范化的浮点数。对于浮点类型,等效于 FLT_MIN_10_EXP、DBL_MIN_10_EXP 或 LDBL_MIN_10_EXP。

max_exponent

int

它是一个最大整数,使得基数提高到 (max_exponent-1) 会生成一个可表示的有限浮点数。对于浮点类型,等效于 FLT_MAX_EXP、DBL_MAX_EXP 或 LDBL_MAX_EXP。

max_exponent10

int

它是一个最大整数,使得 10 的该次幂会生成一个规范化的有限浮点数。对于浮点类型,等效于 FLT_MAX_10_EXP、DBL_MAX_10_EXP 或 LDBL_MAX_10_EXP。

has_infinity

bool

如果类型具有正无穷大表示,则为 true。

has_quiet_NaN

bool

如果类型具有一个静止的(非报警)“非数字”表示,则为 true。

has_signaling_NaN

bool

如果类型具有一个报警的“非数字”表示,则为 true。

has_denorm

float_denorm_style

它是不规范值(具有可变数量指数位的表示)。如果一个类型不允许不规范值,则它可以具有任何下列枚举值 -denorm_absent;如果它允许不规范值,则为 denorm_present;如果在编译时不确定,则为 denorm_indeterminate。

has_denorm_loss

bool

如果精度丢失被检测为不规范损失,而不是不精确结果,则为 true。

infinity()

T

如果可用,它表示正无穷大。

quiet_NaN()

T

如果可用,它表示静止的(非报警)“非数字”。

signaling_NaN()

T

如果可用,它表示报警的“非数字”。

denorm_min()

T

它是最小的正非规格化的值。对于不允许非规格化值的类型:与 min() 相同。

is_iec559

bool

如果类型符合 IEC-559/IEEE-754 标准,则为 true。IEC-559 类型始终将 has_infinity、has_quiet_NaN 和 has_signaling_NaN 设置为 true;并且 infinity、quiet_NaN 和 signaling_NaN 返回一些非零值。

is_bounded

bool

如果类型表示的值集是有限的,则为 true。

is_modulo

bool

如果该类型是模的,则为 true。如果能够相加两个正数,并且结果归约为一个较小的第三个数字,则该类型是模的。

traps

bool

如果为该类型实现了陷阱,则为 true。

tinyness_before

bool

如果在舍入之前检测到极小值,则为 true。

round_style

float_round_style

它是一种舍入样式。如果类型朝零舍入,则该类型可能具有以下任何枚举值 − 向零舍入、向最接近的可表示值舍入、向无穷大舍入、向负无穷大舍入、舍入不定,如果舍入样式在编译时不可确定。

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

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