Cpp Standard Library 简明教程
C++ Library - <limits>
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;
};