std::numeric_limits<T>::digits10
static const int digits10; |
(C++11未満) | |
static constexpr int digits10 |
(C++11以上) | |
std::numeric_limits<T>::digits10 の値は、変化させずに T
型で表現可能な10進数の桁数です。 つまり、この数の有意な10進数の桁を持つ任意の数値は、丸めやオーバーフローによって変化することなく、 T
型の値に変換し、10進数の形式に戻すことができます。 radix 進数の型に対しては、これは digits (浮動小数点型に対しては digits-1) を log
10(radix) 倍して切り捨てた値です。
[編集] 標準の特殊化
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 | std::numeric_limits<char8_t>::digits * std::log10(2) |
char16_t | std::numeric_limits<char16_t>::digits * std::log10(2) |
char32_t | 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 | std::numeric_limits<long long>::digits * std::log10(2) |
unsigned long long | 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 */ |
[編集] 例
8ビットの2進数型はあらゆる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ビット浮動小数点への変換と戻りを生き延びることができません。 最も小さな正の例は 8.589973e9 であり、往復後は 8.589974e9 になります。 これらの丸め誤差は表現内の1ビットを超えることはなく、 digits10
は (24-1) * std::log10(2) = 6.92 として計算できます。 切り捨てると値 6 が結果となります。
同様に、16桁の文字列 9007199254740993 はテキスト→double→テキストの往復を生き延びることはできず、 9007199254740992 になります。 64ビット IEEE 754 の型 double は15桁の10進数に対してのみこの往復を保証します。
[編集] 関連項目
[静的] |
指定された型を表現するために使用される基数 (パブリック静的メンバ定数) |
[静的] |
変化させずに表現可能な radix 進数の桁数 (パブリック静的メンバ定数) |
[静的] |
有効な正規化浮動小数点値を構成する radix を底とした最も小さな負の指数より1大きい数 (パブリック静的メンバ定数) |
[静的] |
有効な有限の浮動小数点値を構成する radix を底とした最も大きな指数より1大きい数 (パブリック静的メンバ定数) |