std::numeric_limits
| ヘッダ <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>;
|
で定義 | |
template<> class numeric_limits<char16_t>;
|
(C++20 以上) | |
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>;
|
||
(C++11 以上)std::numeric_limitscv 修飾された型 cv T に対する T の特殊化の各メンバの値は、非修飾型 std::numeric_limits<int>::digits に対する特殊化の対応するメンバの値と等しくなります。例えば、std::numeric_limits<const int>::digits は
と等しくなります。
算術型のエイリアス (std::size_t や std::streamsizestd::numeric_limits など) も
型特性で検査できます。
std::complex<T> や std::nullptr_t などの非算術標準型には特殊化がありません。
|
実装が 整数クラス型 (integer-class types) を定義する場合、それらに対しても |
(C++20 以上) |
実装は、実装固有の型に対して std::numeric_limits の特殊化を提供しても構いません (例: GCC は std::numeric_limits<__int128> を提供します)。非標準ライブラリは、ライブラリ提供の型に対して 特殊化を追加しても構いません (例: OpenEXR は 16 ビット浮動小数点型に対して std::numeric_limits<half> を提供します)。
テンプレートパラメータ
| T | - | 数値プロパティを取得するための型 |
メンバー定数
|
[static]
|
std::numeric_limits
が特殊化されている型を識別する
(公開静的メンバ定数) |
|
[static]
|
符号付き型を識別する
(公開静的メンバー定数) |
|
[static]
|
整数型を識別する
(公開静的メンバ定数) |
|
[static]
|
正確な型を識別する
(public static member constant) |
|
[static]
|
特殊値「正の無限大」を表現できる浮動小数点型を識別する
(公開静的メンバ定数) |
|
[static]
|
浮動小数点型が特殊値「quiet not-a-number」(NaN) を表現できるかどうかを識別する
(公開静的メンバ定数) |
|
[static]
|
浮動小数点型が特殊値「シグナリング非数」(NaN)を表現できるかどうかを識別する
(公開静的メンバ定数) |
|
[static]
|
浮動小数点型で使用される非正規化スタイルを識別する
(公開静的メンバ定数) |
|
[static]
|
精度損失を不正確な結果ではなく非正規化損失として検出する浮動小数点型を識別する
(public static member constant) |
|
[static]
|
型が使用する丸めスタイルを識別する
(公開静的メンバ定数) |
|
[static]
|
IEC 559/IEEE 754浮動小数点型を識別する
(公開静的メンバ定数) |
|
[static]
|
有限の値の集合を表す型を識別する
(public static member constant) |
|
[static]
|
剰余演算でオーバーフローを処理する型を識別する
(public static member constant) |
|
[static]
|
変更なく表現可能な
radix
進数の桁数
(公開静的メンバ定数) |
|
[static]
|
変更なく表現可能な10進桁数
(公開静的メンバ定数) |
|
[static]
(C++11)
|
この型のすべての値を区別するために必要な10進桁数
(public static member constant) |
|
[static]
|
指定された型の表現で使用される基数または整数ベース
(public static member constant) |
|
[static]
|
基数の最小の負のべき乗で、有効な正規化浮動小数点値であるものに1を加えた値
(公開静的メンバ定数) |
|
[static]
|
正規化浮動小数点値として有効な10の最小負のべき乗
(公開静的メンバ定数) |
|
[static]
|
基数の有効な有限浮動小数点値となる最大の整数乗より1大きい値
(公開静的メンバ定数) |
|
[static]
|
有限の浮動小数点値として有効な10の最大整数乗
(public static member constant) |
|
[static]
|
算術演算がトラップを引き起こす可能性のある型を識別する
(public static member constant) |
|
[static]
|
浮動小数点型が丸めの前にアンダーフローを検出するかどうかを識別する
(public static member constant) |
メンバー関数
|
[static]
|
指定された非浮動小数点型の最小有限値、または指定された浮動小数点型の最小正の正規値を返す
(public static member function) |
|
[static]
(C++11)
|
指定された型の最小有限値を返す(符号付き型では最も負の値、
0
符号なし型では0)
(public static member function) |
|
[static]
|
指定された型の最大有限値を返す
(public static member function) |
|
[static]
|
1.0
と指定された浮動小数点型の次に表現可能な値との差を返す
(public static member function) |
|
[static]
|
指定された浮動小数点型の最大丸め誤差を返す
(public static member function) |
|
[static]
|
指定された浮動小数点型の正の無限大値を返す
(public static member function) |
|
[static]
|
指定された浮動小数点型のquiet NaN値を返す
(public static member function) |
|
[static]
|
指定された浮動小数点型のsignaling NaN値を返す
(public static member function) |
|
[static]
|
指定された浮動小数点型の最小正の非正規化値を返す
(public static member function) |
ヘルパークラス
|
浮動小数点丸めモードを示す
(列挙型) |
|
|
浮動小数点非正規化モードを示す
(列挙型) |
Cライブラリマクロ定数との関係
特殊化
std::numeric_limits<T>
ただし
T
は
|
メンバ | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
min()
|
lowest()
(C++11) |
max()
|
radix
|
||||||||
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 | |||||||
| 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 |
cv修飾型に対する
std::numeric_limits
特殊化が、cv非修飾型に対する対応する特殊化と 同じ動作をするかどうかが不明確だった |
同じ動作を
する |