命名空间
变体
操作

std::numeric_limits

来自 cppreference.cn
< cpp‎ | types
 
 
 
类型支持
基本类型
定宽整数类型 (C++11)
定宽浮点类型 (C++23)
(C++11)    
(C++17)
数值极限
numeric_limits
C 数值极限接口
运行时类型信息
 
 
定义于头文件 <limits>
template< class T > class numeric_limits;

std::numeric_limits 类模板提供查询算术类型(例如, int 类型的最大可能值为 std::numeric_limits<int>::max())各种属性的标准化方式。

该信息通过 std::numeric_limits 模板的特化提供。标准库为所有算术类型提供特化(此处仅列出 cv 非限定的算术类型的特化)

定义于头文件 <limits>
template<> class numeric_limits<bool>;
template<> class numeric_limits<char>;
template<> class numeric_limits<signed char>;
template<> class numeric_limits<unsigned char>;
template<> class numeric_limits<wchar_t>;
template<> class numeric_limits<char8_t>;
(C++20 起)
template<> class numeric_limits<char16_t>;
(C++11 起)
template<> class numeric_limits<char32_t>;
(C++11 起)
template<> class numeric_limits<short>;
template<> class numeric_limits<unsigned short>;
template<> class numeric_limits<int>;
template<> class numeric_limits<unsigned int>;
template<> class numeric_limits<long>;
template<> class numeric_limits<unsigned long>;
template<> class numeric_limits<long long>;
(C++11 起)
template<> class numeric_limits<unsigned long long>;
(C++11 起)
template<> class numeric_limits<float>;
template<> class numeric_limits<double>;
template<> class numeric_limits<long double>;

std::numeric_limits 在 cv 限定类型 cv T 上的特化,其每个成员的值等于其在非限定类型 T 上的特化的对应成员的值。例如 std::numeric_limits<int>::digits 等于 std::numeric_limits<const int>::digits

算术类型的别名(例如 std::size_tstd::streamsize)也可以用 std::numeric_limits 类型特征进行检查。

非算术的标准类型,例如 std::complex<T>std::nullptr_t,没有特化。

如果实现定义了任何整数类(integer-class)类型,那么也必须为它们提供 std::numeric_limits 的特化。

(C++20 起)

实现可能为实现特定的类型提供 std::numeric_limits 的特化:例如 GCC 提供 std::numeric_limits<__int128>。非标准库可能为库提供的类型添加特化,例如 OpenEXR 为一种 16 位浮点类型提供 std::numeric_limits<half>

目录

[编辑] 模板形参

T - 要获取数值属性的类型

[编辑] 成员常量

确定 std::numeric_limits 是否对该类型特化
(公开静态成员常量) [编辑]
[静态]
确定有符号类型
(公开静态成员常量) [编辑]
[静态]
确定整数类型
(公开静态成员常量) [编辑]
[静态]
确定精确类型
(公开静态成员常量) [编辑]
确定可以表示特殊值“正无穷”的浮点类型
(公开静态成员常量) [编辑]
确定可以表示特殊值“安静的非数”(quiet not-a-number,NaN)的浮点类型
(公开静态成员常量) [编辑]
确定可以表示特殊值“发信的非数”(signaling not-a-number,NaN)的浮点类型
(公开静态成员常量) [编辑]
[静态]
确定浮点类型所用的非正规化样式
(公开静态成员常量) [编辑]
确定将精度损失检测为非正规化损失而非不精确结果的浮点类型
(公开静态成员常量) [编辑]
[静态]
确定该类型所用的舍入样式
(公开静态成员常量) [编辑]
[静态]
确定 IEC 559/IEEE 754 浮点类型
(公开静态成员常量) [编辑]
[静态]
确定表示有限值集合的类型
(公开静态成员常量) [编辑]
[静态]
确定用模算术处理溢出的类型
(公开静态成员常量) [编辑]
[静态]
能无变化表示的 radix 数字位数
(公开静态成员常量) [编辑]
[静态]
能无变化表示的十进制数字位数
(公开静态成员常量) [编辑]
[静态] (C++11)
区别此类型所有值所需的十进制数字位数
(公开静态成员常量) [编辑]
[静态]
给定类型的表示所用的基或整数底
(公开静态成员常量) [编辑]
比最小负数基幂大一,该基幂是有效的正规化浮点值
(公开静态成员常量) [编辑]
作为有效的正规化浮点值的最小负 10 的幂
(公开静态成员常量) [编辑]
比最大整数基幂大一,该基幂是有效的有限浮点值
(公开静态成员常量) [编辑]
作为有效的有限浮点值的最大整数 10 的幂
(公开静态成员常量) [编辑]
[静态]
确定能导致算术运算陷入的类型
(公开静态成员常量) [编辑]
确定舍入前检测微小的浮点类型
(公开静态成员常量) [编辑]

[编辑] 成员函数

[静态]
返回给定非浮点类型的最小有限值,或给定浮点类型的最小正规化值
(公开静态成员函数) [编辑]
[静态] (C++11)
返回给定类型的最低有限值,即有符号类型的最负值,无符号类型的 0
(公开静态成员函数) [编辑]
[静态]
返回给定类型的最大有限值
(公开静态成员函数) [编辑]
[静态]
返回 1.0 与给定浮点类型的下一个可表示值之间的差
(公开静态成员函数) [编辑]
[静态]
返回给定浮点类型的最大舍入误差
(公开静态成员函数) [编辑]
[静态]
返回给定浮点类型的正无穷大值
(公开静态成员函数) [编辑]
[静态]
返回给定浮点类型的安静 NaN 值
(公开静态成员函数) [编辑]
返回给定浮点类型的发信 NaN 值
(公开静态成员函数) [编辑]
[静态]
返回给定浮点类型的最小正非正规化值
(公开静态成员函数) [编辑]

[编辑] 辅助类

指示浮点舍入模式
(枚举) [编辑]
指示浮点非正规化模式
(枚举) [编辑]

[编辑] 与 C 库宏常量的关系

特化
std::numeric_limits<T>
其中 T
成员
min() lowest()
(C++11)
max() radix
bool false false true 2
char CHAR_MIN CHAR_MIN CHAR_MAX 2
signed char SCHAR_MIN SCHAR_MIN SCHAR_MAX 2
unsigned char 0 0 UCHAR_MAX 2
wchar_t WCHAR_MIN WCHAR_MIN WCHAR_MAX 2
char8_t 0 0 UCHAR_MAX 2
char16_t 0 0 UINT_LEAST16_MAX 2
char32_t 0 0 UINT_LEAST32_MAX 2
short SHRT_MIN SHRT_MIN SHRT_MAX 2
signed short
unsigned short 0 0 USHRT_MAX 2
int INT_MIN INT_MIN INT_MAX 2
signed int
unsigned int 0 0 UINT_MAX 2
long LONG_MIN LONG_MIN LONG_MAX 2
signed long
unsigned long 0 0 ULONG_MAX 2
long long LLONG_MIN LLONG_MIN LLONG_MAX 2
signed long long
unsigned long long 0 0 ULLONG_MAX 2
特化
std::numeric_limits<T>
其中 T
成员
denorm_min() min() lowest()
(C++11)
max() epsilon() digits digits10
float 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
long double LDBL_TRUE_MIN LDBL_MIN -LDBL_MAX LDBL_MAX LDBL_EPSILON LDBL_MANT_DIG LDBL_DIG
特化
std::numeric_limits<T>
其中 T
成员(续)
min_exponent min_exponent10 max_exponent max_exponent10 radix
float 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
long double LDBL_MIN_EXP LDBL_MIN_10_EXP LDBL_MAX_EXP LDBL_MAX_10_EXP FLT_RADIX

[编辑] 示例

#include <iostream>
#include <limits>
 
int main() 
{
    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<unsigned char>::lowest() << "\t\t│ "
              << +std::numeric_limits<unsigned char>::min() << "\t\t│ "
              << +std::numeric_limits<unsigned char>::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';
}

可能的输出

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

[编辑] 缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 发布时的行为 正确的行为
LWG 201 C++98 需要为所有基础类型提供特化 排除了非算术类型
LWG 559 C++98 不清楚 cv 限定类型的 std::numeric_limits
特化的行为是否与对应的
cv 非限定类型的特化相同
它们具有
相同的行为

[编辑] 参阅