std::numeric_limits<T>::digits10
static const int digits10; |
(C++11まで) | |
| static constexpr int digits10; |
(C++11以降) | |
std::numeric_limits<T>::digits10 の値は、型Tで変更なく表現できる10進数の桁数です。つまり、この桁数を持つ任意の十進数の数値を型Tの値に変換し、それを再び十進数形式に戻しても、丸めやオーバーフローによる変更が生じないことを意味します。基数radixの型の場合、それは digits() の値(浮動小数点型の場合は digits - 1)に log10(radix) を掛けた値を切り捨てたものです。
[edit] 標準特殊化
T
|
std::numeric_limits<T>::digits10 の値 |
| /* 非特殊化 */ | 0 |
| bool | 0 |
| char | std::numeric_limits<char>::digits * std::log10(2) |
| signed char | std::numeric_limits<signed char>::digits * std::log10(2) |
| unsigned char | std::numeric_limits<unsigned char>::digits * std::log10(2) |
| wchar_t | std::numeric_limits<wchar_t>::digits * std::log10(2) |
| char8_t (C++20 以降) | std::numeric_limits<char8_t>::digits * std::log10(2) |
| char16_t (C++11 以降) | std::numeric_limits<char16_t>::digits * std::log10(2) |
| char32_t (C++11 以降) | std::numeric_limits<char32_t>::digits * std::log10(2) |
| short | std::numeric_limits<short>::digits * std::log10(2) |
| unsigned short | std::numeric_limits<unsigned short>::digits * std::log10(2) |
| int | std::numeric_limits<int>::digits * std::log10(2) |
| unsigned int | std::numeric_limits<unsigned int>::digits * std::log10(2) |
| long | std::numeric_limits<long>::digits * std::log10(2) |
| unsigned long | std::numeric_limits<unsigned long>::digits * std::log10(2) |
| long long (C++11 以降) | std::numeric_limits<long long>::digits * std::log10(2) |
| unsigned long long (C++11 以降) | std::numeric_limits<unsigned long long>::digits * std::log10(2) |
| float | FLT_DIG (IEEE float の場合 6) |
| double | DBL_DIG (IEEE double の場合 15) |
| long double | LDBL_DIG (80ビットIntel long double の場合 18、IEEE倍精度の場合 33) |
[edit] 例
8ビットの二進数型は、任意の2桁の10進数を正確に表現できますが、3桁の10進数(256〜999)は表現できません。8ビット型に対するdigits10の値は2です(8 * std::log10(2) は2.41)
標準の32ビットIEEE 754浮動小数点型は、24ビットの小数部(表記上は23ビット、1ビットは暗黙)を持ち、これは7桁の10進数を表現できることを示唆しているかもしれません(24 * std::log10(2) は7.22)。しかし、相対丸め誤差は一様ではなく、7桁の10進数を持つ一部の浮動小数点値は、32ビットfloatへの変換とそれからの逆変換で無事に通過しません。最小の正の例は 8.589973e9 で、往復変換後に 8.589974e9 となります。これらの丸め誤差は、表現における1ビットを超えることはありません。digits10は (24 - 1) * std::log10(2) として計算され、これは6.92です。これを切り捨てると値は6になります。
同様に、16桁の文字列 9007199254740993 は、テキスト→double→テキストの往復変換に成功せず、 9007199254740992 となります。64ビットIEEE 754型doubleは、15桁の10進数に対してのみこの往復変換を保証します。
[edit] 関連項目
| [static] (C++11) |
この型のすべての値を区別するために必要な10進数の桁数 (public static member constant) |
| [static] |
与えられた型の表現で使用される基数または整数の底 (public static member constant) |
| [static] |
変更なしで表現できる radix の桁数(public static member constant) |
| [static] |
有効な正規化された浮動小数点数値である基数の最小の負のべき乗に1を加えたもの (public static member constant) |
| [static] |
有効な有限の浮動小数点数値である基数の最大の整数べき乗に1を加えたもの (public static member constant) |