std::numeric_limits
來自 cppreference.com
定義於標頭檔案 <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_t 或 std::streamsize)也可以用 std::numeric_limits
型別特徵進行檢查。
非算術的標準型別,例如 std::complex<T> 或 std::nullptr_t,沒有特化。
如果實現定義了任何整數類(integer-class)型別,那麼也必須為它們提供 |
(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 非限定型別的特化相同 |
它們具有 相同的行為 |