命名空間
變體
動作

std::numeric_limits

出自 cppreference.com
< cpp‎ | types
 
 
 
型別支援
基礎型別
固定寬度整數型別 (C++11)
固定寬度浮點數型別 (C++23)
(C++11)    
(C++17)
數值極限
numeric_limits
C 數值極限介面
執行時期型別資訊 (RTTI)
 
 
定義於標頭 <limits>
template< class T > class numeric_limits;

std::numeric_limits 類別範本提供了一種標準化的方式,用來查詢算術型別的各種屬性(例如:型別 int 可表示的最大值為 std::numeric_limits<int>::max())。

此資訊透過 std::numeric_limits 範本的特製化(specializations)提供。標準程式庫為所有算術型別提供了特製化(此處僅列出 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>;

對於 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)不具有特製化。

若實作定義了任何類整數型別 (integer-class types),也必須為其提供 std::numeric_limits 的特製化。

(自 C++20 起)

實作可能會為特定於實作的型別提供 std::numeric_limits 特製化:例如 GCC 提供了 std::numeric_limits<__int128>。非標準程式庫亦可新增特製化,例如 OpenEXR 針對 16 位元浮點型別提供了 std::numeric_limits<half>

目錄

[編輯] 範本參數

T - 用於檢索數值屬性的型別

[編輯] 成員常數

識別已特製化 std::numeric_limits 的型別
(公開靜態成員常數)
[靜態]
識別帶號 (signed) 型別
(公開靜態成員常數)
[靜態]
識別整數型別
(公開靜態成員常數)
[靜態]
識別精確型別
(公開靜態成員常數)
識別可表示特殊值「正無窮大」的浮點型別
(公開靜態成員常數)
識別可表示特殊值「靜默非數」(quiet NaN) 的浮點型別
(公開靜態成員常數)
識別可表示特殊值「信號非數」(signaling NaN) 的浮點型別
(公開靜態成員常數)
[靜態]
識別該浮點型別所使用的去標準化 (denormalization) 風格
(公開靜態成員常數)
識別將精度損失檢測為去標準化損失,而非不精確結果的浮點型別
(公開靜態成員常數)
[靜態]
識別該型別所使用的捨入 (rounding) 風格
(公開靜態成員常數)
[靜態]
識別 IEC 559/IEEE 754 浮點型別
(公開靜態成員常數)
[靜態]
識別表示有限值集合的型別
(公開靜態成員常數)
[靜態]
識別使用模數算術處理溢出的型別
(公開靜態成員常數)
[靜態]
可以無損表示的 radix 位數
(公開靜態成員常數)
[靜態]
可以無損表示的十進位位數
(公開靜態成員常數)
[靜態] (C++11)
區分該型別所有值所需的十進位位數
(公開靜態成員常數)
[靜態]
該型別表示法所使用的基數 (radix) 或整數底數
(公開靜態成員常數)
最小有效歸一化浮點值的基數負冪次再加一
(公開靜態成員常數)
為有效歸一化浮點值的最小十進位負冪次
(公開靜態成員常數)
最大有限浮點值的基數正冪次再加一
(公開靜態成員常數)
為有效有限浮點值的最大十進位正冪次
(公開靜態成員常數)
[靜態]
識別可能導致算術運算觸發陷阱 (trap) 的型別
(公開靜態成員常數)
識別在捨入前檢測微小值 (tinyness) 的浮點型別
(公開靜態成員常數)

[編輯] 成員函式

[靜態]
回傳給定非浮點型別的最小有限值,或給定浮點型別的最小正歸一化值
(公開靜態成員函式)
[靜態] (C++11)
回傳給定型別的最低有限值,即帶號型別的最負值,無符號型別的 0
(公開靜態成員函式)
[靜態]
回傳給定型別的最大有限值
(公開靜態成員函式)
[靜態]
回傳 1.0 與給定浮點型別下一個可表示值之間的差
(公開靜態成員函式)
[靜態]
回傳給定浮點型別的最大捨入誤差
(公開靜態成員函式)
[靜態]
回傳給定浮點型別的正無窮大值
(公開靜態成員函式)
[靜態]
回傳給定浮點型別的靜默 NaN 值
(公開靜態成員函式)
回傳給定浮點型別的信號 NaN 值
(公開靜態成員函式)
[靜態]
回傳給定浮點型別的最小正非標準化 (subnormal) 值
(公開靜態成員函式)

[編輯] 輔助類別

指示浮點數捨入模式
(列舉)
指示浮點數非標準化模式
(列舉)

[編輯] 與 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-未修飾型別的特製化行為相同
它們具有
相同的行為

[編輯] 參見

English Deutsch 日本語 中文(简体) 中文(繁體)