命名空间
变体
操作

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>;
(since C++20)
template<> class numeric_limits<char16_t>;
(since C++11)
template<> class numeric_limits<char32_t>;
(since 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>;
(since C++11)
template<> class numeric_limits<unsigned long long>;
(since C++11)
template<> class numeric_limits<float>;
template<> class numeric_limits<double>;
template<> class numeric_limits<long double>;

在 cv 限定类型 cv Tstd::numeric_limits 的每个成员的值等于在非限定类型 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,没有特化。

如果实现定义了任何类整数类型,则还必须为它们提供 std::numeric_limits 的特化。

(since C++20)

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

目录

[编辑] 模板形参

T - 要检索数值属性的类型

[编辑] 成员常量

标识 std::numeric_limits 特化的类型
(公共静态成员常量) [编辑]
[静态]
标识有符号类型
(公共静态成员常量) [编辑]
[静态]
标识整数类型
(公共静态成员常量) [编辑]
[静态]
标识精确类型
(公共静态成员常量) [编辑]
标识可以表示特殊值“正无穷大”的浮点类型
(公共静态成员常量) [编辑]
标识可以表示特殊值“安静非数值”(NaN)的浮点类型
(公共静态成员常量) [编辑]
标识可以表示特殊值“信令非数值”(NaN)的浮点类型
(公共静态成员常量) [编辑]
[静态]
标识浮点类型使用的反常值化风格
(公共静态成员常量) [编辑]
标识将精度损失检测为反常值化损失而不是不精确结果的浮点类型
(公共静态成员常量) [编辑]
[静态]
标识类型使用的舍入风格
(公共静态成员常量) [编辑]
[静态]
标识 IEC 559/IEEE 754 浮点类型
(公共静态成员常量) [编辑]
[静态]
标识表示有限值集的类型
(公共静态成员常量) [编辑]
[静态]
标识使用模运算处理溢出的类型
(公共静态成员常量) [编辑]
[静态]
可以无更改表示的 radix 位数
(公共静态成员常量) [编辑]
[静态]
可以无更改表示的十进制位数
(公共静态成员常量) [编辑]
[静态] (C++11)
区分此类型的所有值所需的十进制位数
(公共静态成员常量) [编辑]
[静态]
给定类型的表示形式使用的基数或整数基
(公共静态成员常量) [编辑]
比作为有效归一化浮点值的基数的最小负幂大一
(公共静态成员常量) [编辑]
作为有效归一化浮点值的十的最小负幂
(公共静态成员常量) [编辑]
比作为有效有限浮点值的基数的最大整数幂大一
(公共静态成员常量) [编辑]
作为有效有限浮点值的 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++ 标准。

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

[编辑] 参见