std::numeric_limits<T>::digits10
staticconstint digits10; | (C++11未満) | |
staticconstexprint 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) |
signedchar | std::numeric_limits<signedchar>::digits*std::log10(2) |
unsignedchar | std::numeric_limits<unsignedchar>::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) |
unsignedshort | std::numeric_limits<unsignedshort>::digits*std::log10(2) |
int | std::numeric_limits<int>::digits*std::log10(2) |
unsignedint | std::numeric_limits<unsignedint>::digits*std::log10(2) |
long | std::numeric_limits<long>::digits*std::log10(2) |
unsignedlong | std::numeric_limits<unsignedlong>::digits*std::log10(2) |
longlong | std::numeric_limits<longlong>::digits*std::log10(2) |
unsignedlonglong | std::numeric_limits<unsignedlonglong>::digits*std::log10(2) |
float | FLT_DIG/* IEEE float の場合は 6 */ |
double | DBL_DIG/* IEEE double の場合は 15 */ |
longdouble | 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大きい数 (パブリック静的メンバ定数) |