Cの数値の限界に関するインターフェース
From cppreference.com
こちらも参照: std::numeric_limits インターフェース。
目次 |
[編集] 整数型の制限
コア言語の整数型の制限 | |
| ヘッダー
<climits> で定義 | |
| CHAR_BIT |
バイトのビット幅 (マクロ定数) |
| MB_LEN_MAX |
マルチバイト文字の最大バイト数 (マクロ定数) |
| CHAR_MIN |
char の最小値 (マクロ定数) |
| CHAR_MAX |
char の最大値 (マクロ定数) |
| SCHAR_MINSHRT_MININT_MINLONG_MINLLONG_MIN (C++11) |
signed char、short、int、long、および long long のそれぞれの最小値 (マクロ定数) |
| SCHAR_MAXSHRT_MAXINT_MAXLONG_MAXLLONG_MAX (C++11) |
signed char、short、int、long、および long long のそれぞれの最大値 (マクロ定数) |
| UCHAR_MAXUSHRT_MAXUINT_MAXULONG_MAXULLONG_MAX (C++11) |
unsigned char、unsigned short、unsigned int、 unsigned long、および unsigned long long のそれぞれの最大値 (マクロ定数) |
| ヘッダ
<cwchar> で定義 | |
| ヘッダー
<cstdint> で定義 | |
| WCHAR_MIN (C++11) |
wchar_t の最小値 (マクロ定数) |
| WCHAR_MAX (C++11) |
wchar_t の最大値 (マクロ定数) |
ライブラリ型エイリアスの制限 | |
| ヘッダー
<cstdint> で定義 | |
| PTRDIFF_MIN (C++11) |
std::ptrdiff_t の最小値 (マクロ定数) |
| PTRDIFF_MAX (C++11) |
std::ptrdiff_t の最大値 (マクロ定数) |
| SIZE_MAX (C++11) |
std::size_t の最大値 (マクロ定数) |
| SIG_ATOMIC_MIN (C++11) |
std::sig_atomic_t の最小値 (マクロ定数) |
| SIG_ATOMIC_MAX (C++11) |
std::sig_atomic_t の最大値 (マクロ定数) |
| WINT_MIN (C++11) |
std::wint_t の最小値(マクロ定数) |
| WINT_MAX (C++11) |
std::wint_t の最大値(マクロ定数) |
[編集] 注釈
CHAR_BIT と MB_LEN_MAX 以外のこれらの定数の型は、それらが記述する型のオブジェクトに適用される整数拡張の結果と一致することが要求される。CHAR_MAX は int または unsigned int 型である場合があるが、char 型であることはない。同様に、USHRT_MAX は符号なし型であるとは限らず、その型は int である場合がある。
フリースタンディング実装では、std::sig_atomic_t および/または std::wint_t typedef 名が欠落している場合があり、その場合、SIG_ATOMIC_* および/または WINT_* マクロは対応して存在しない。
[編集] 例
このコードを実行
#include <climits> #include <cstdint> #include <iomanip> #include <iostream> int main() { constexpr int w = 14; std::cout << std::left; # define COUT(x) std::cout << std::setw(w) << #x << " = " << x << '\n' COUT( CHAR_BIT ); COUT( MB_LEN_MAX ); COUT( CHAR_MIN ); COUT( CHAR_MAX ); COUT( SCHAR_MIN ); COUT( SHRT_MIN ); COUT( INT_MIN ); COUT( LONG_MIN ); COUT( LLONG_MIN ); COUT( SCHAR_MAX ); COUT( SHRT_MAX ); COUT( INT_MAX ); COUT( LONG_MAX ); COUT( LLONG_MAX ); COUT( UCHAR_MAX ); COUT( USHRT_MAX ); COUT( UINT_MAX ); COUT( ULONG_MAX ); COUT( ULLONG_MAX ); COUT( PTRDIFF_MIN ); COUT( PTRDIFF_MAX ); COUT( SIZE_MAX ); COUT( SIG_ATOMIC_MIN ); COUT( SIG_ATOMIC_MAX ); COUT( WCHAR_MIN ); COUT( WCHAR_MAX ); COUT( WINT_MIN ); COUT( WINT_MAX ); }
実行結果の例
CHAR_BIT = 8 MB_LEN_MAX = 16 CHAR_MIN = -128 CHAR_MAX = 127 SCHAR_MIN = -128 SHRT_MIN = -32768 INT_MIN = -2147483648 LONG_MIN = -9223372036854775808 LLONG_MIN = -9223372036854775808 SCHAR_MAX = 127 SHRT_MAX = 32767 INT_MAX = 2147483647 LONG_MAX = 9223372036854775807 LLONG_MAX = 9223372036854775807 UCHAR_MAX = 255 USHRT_MAX = 65535 UINT_MAX = 4294967295 ULONG_MAX = 18446744073709551615 ULLONG_MAX = 18446744073709551615 PTRDIFF_MIN = -9223372036854775808 PTRDIFF_MAX = 9223372036854775807 SIZE_MAX = 18446744073709551615 SIG_ATOMIC_MIN = -2147483648 SIG_ATOMIC_MAX = 2147483647 WCHAR_MIN = -2147483648 WCHAR_MAX = 2147483647 WINT_MIN = 0 WINT_MAX = 4294967295
[編集] 浮動小数点型の制限
| ヘッダー
<cfloat> で定義 | |
| FLT_RADIX |
3つの浮動小数点型すべての表現で使用される基数(整数基数) (マクロ定数) |
| DECIMAL_DIG (C++11) |
long double から少なくとも DECIMAL_DIG 桁の10進数への変換、および再び long double への変換が恒等変換であること: これは long double をシリアライズ/デシリアライズするために必要な10進精度である (std::numeric_limits::max_digits10 も参照) (マクロ定数) |
| FLT_DECIMAL_DIGDBL_DECIMAL_DIGLDBL_DECIMAL_DIG (C++17) |
float/double/long double から少なくとも FLT_DECIMAL_DIG/DBL_DECIMAL_DIG/LDBL_DECIMAL_DIG 桁の10進数への変換、および再び戻す変換が恒等変換であること: これは浮動小数点値をシリアライズ/デシリアライズするために必要な10進精度である (std::numeric_limits::max_digits10 も参照)。それぞれ少なくとも 6、10、および 10、または IEEE float の場合は 9、IEEE double の場合は 17 と定義されている。 (マクロ定数) |
| FLT_MINDBL_MINLDBL_MIN |
float、double、および long double のそれぞれの最小正規化正値 (マクロ定数) |
| FLT_TRUE_MINDBL_TRUE_MINLDBL_TRUE_MIN (C++17) |
float、double、および long double のそれぞれの最小正値 (マクロ定数) |
| FLT_MAXDBL_MAXLDBL_MAX |
float、double、および long double のそれぞれの最大有限値 (マクロ定数) |
| FLT_EPSILONDBL_EPSILONLDBL_EPSILON |
1.0 と float、double、および long double のそれぞれの次に表現可能な値との差 (マクロ定数) |
| FLT_DIGDBL_DIGLDBL_DIG |
丸めまたはオーバーフローによる変更なしに、テキスト → float/double/long double → テキスト の往復で保持されることが保証される10進桁数 (std::numeric_limits::digits10 を参照) (マクロ定数) |
| FLT_MANT_DIGDBL_MANT_DIGLDBL_MANT_DIG |
float、double、および long double のそれぞれの精度を失わずに表現できる基数 FLT_RADIX の桁数 (マクロ定数) |
| FLT_MIN_EXPDBL_MIN_EXPLDBL_MIN_EXP |
FLT_RADIX をその整数より1小さいべき乗で表現すると正規化された float、double、および long double となるような最小の負の整数 (マクロ定数) |
| FLT_MIN_10_EXPDBL_MIN_10_EXPLDBL_MIN_10_EXP |
10 をそのべき乗で表現すると正規化された float、double、および long double となるような最小の負の整数 (マクロ定数) |
| FLT_MAX_EXPDBL_MAX_EXPLDBL_MAX_EXP |
FLT_RADIX をその整数より1小さいべき乗で表現すると表現可能な有限の float、double、および long double となるような最大の正の整数 (マクロ定数) |
| FLT_MAX_10_EXPDBL_MAX_10_EXPLDBL_MAX_10_EXP |
10 をそのべき乗で表現すると表現可能な有限の float、double、および long double となるような最大の正の整数 (マクロ定数) |
| 浮動小数点演算のデフォルトの丸めモード (マクロ定数) | |
| (C++11) |
すべての算術演算がどの精度で行われるかを指定します (マクロ定数) |
| FLT_HAS_SUBNORMDBL_HAS_SUBNORMLDBL_HAS_SUBNORM (C++17) |
その型が非正規 (denormal) 数をサポートするかどうかを指定します -1 – 不確定、 0 – なし、 1 – あり (マクロ定数) |
[編集] 例
このコードを実行
#include <cfloat> #include <iomanip> #include <iostream> int main() { int w = 16; std::cout << std::left; // std::cout << std::setprecision(53); # define COUT(x) std::cout << std::setw(w) << #x << " = " << x << '\n' COUT( FLT_RADIX ); COUT( DECIMAL_DIG ); COUT( FLT_DECIMAL_DIG ); COUT( DBL_DECIMAL_DIG ); COUT( LDBL_DECIMAL_DIG ); COUT( FLT_MIN ); COUT( DBL_MIN ); COUT( LDBL_MIN ); COUT( FLT_TRUE_MIN ); COUT( DBL_TRUE_MIN ); COUT( LDBL_TRUE_MIN ); COUT( FLT_MAX ); COUT( DBL_MAX ); COUT( LDBL_MAX ); COUT( FLT_EPSILON ); COUT( DBL_EPSILON ); COUT( LDBL_EPSILON ); COUT( FLT_DIG ); COUT( DBL_DIG ); COUT( LDBL_DIG ); COUT( FLT_MANT_DIG ); COUT( DBL_MANT_DIG ); COUT( LDBL_MANT_DIG ); COUT( FLT_MIN_EXP ); COUT( DBL_MIN_EXP ); COUT( LDBL_MIN_EXP ); COUT( FLT_MIN_10_EXP ); COUT( DBL_MIN_10_EXP ); COUT( LDBL_MIN_10_EXP ); COUT( FLT_MAX_EXP ); COUT( DBL_MAX_EXP ); COUT( LDBL_MAX_EXP ); COUT( FLT_MAX_10_EXP ); COUT( DBL_MAX_10_EXP ); COUT( LDBL_MAX_10_EXP ); COUT( FLT_ROUNDS ); COUT( FLT_EVAL_METHOD ); COUT( FLT_HAS_SUBNORM ); COUT( DBL_HAS_SUBNORM ); COUT( LDBL_HAS_SUBNORM ); }
実行結果の例
FLT_RADIX = 2 DECIMAL_DIG = 21 FLT_DECIMAL_DIG = 9 DBL_DECIMAL_DIG = 17 LDBL_DECIMAL_DIG = 21 FLT_MIN = 1.17549e-38 DBL_MIN = 2.22507e-308 LDBL_MIN = 3.3621e-4932 FLT_TRUE_MIN = 1.4013e-45 DBL_TRUE_MIN = 4.94066e-324 LDBL_TRUE_MIN = 3.6452e-4951 FLT_MAX = 3.40282e+38 DBL_MAX = 1.79769e+308 LDBL_MAX = 1.18973e+4932 FLT_EPSILON = 1.19209e-07 DBL_EPSILON = 2.22045e-16 LDBL_EPSILON = 1.0842e-19 FLT_DIG = 6 DBL_DIG = 15 LDBL_DIG = 18 FLT_MANT_DIG = 24 DBL_MANT_DIG = 53 LDBL_MANT_DIG = 64 FLT_MIN_EXP = -125 DBL_MIN_EXP = -1021 LDBL_MIN_EXP = -16381 FLT_MIN_10_EXP = -37 DBL_MIN_10_EXP = -307 LDBL_MIN_10_EXP = -4931 FLT_MAX_EXP = 128 DBL_MAX_EXP = 1024 LDBL_MAX_EXP = 16384 FLT_MAX_10_EXP = 38 DBL_MAX_10_EXP = 308 LDBL_MAX_10_EXP = 4932 FLT_ROUNDS = 1 FLT_EVAL_METHOD = 0 FLT_HAS_SUBNORM = 1 DBL_HAS_SUBNORM = 1 LDBL_HAS_SUBNORM = 1
[編集] 欠陥報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 416 | C++98 | <climits> のマクロの型が参照する型と一致することが保証されているかどうか不明確であった (C++ は C を参照し、C は「いいえ」と述べている) |
一致しないと明確化された 保証された |
[編集] 関連項目
| C ドキュメント (数値制限)
|