std::numeric_limits<T>::digits10
來自 cppreference.com
static const int digits10; |
(C++11 前) | |
| static constexpr int digits10; |
(C++11 起) | |
std::numeric_limits<T>::digits10 的值是型別 T 可以不變地表示的十進位制位數,也就是說,任何具有此數量的有效十進位制數字的數字,都可以轉換為型別 T 的值,然後再轉換回十進位制形式,而不會因舍入或溢位而改變。對於基數radix型別,它是digits()的值(對於浮點型別,是digits - 1),乘以log10(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 (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) |
[編輯] 示例
一個8位二進位制型別可以精確地表示任何兩位十進位制數,但無法表示三位十進位制數256..999。8位型別的 digits10 值為 2 (8 * std::log10(2) 為 2.41)。
標準32位IEEE 754浮點型別有一個24位小數部分(寫入23位,一位隱含),這可能表明它可以表示7位小數(24 * std::log10(2) 為 7.22),但相對舍入誤差是非均勻的,有些具有7位小數的浮點值在轉換為32位浮點數並返回時無法保持不變:最小的正例是 8.589973e9,在往返轉換後變為 8.589974e9。這些舍入誤差不能超過表示中的一位,並且 digits10 計算為 (24 - 1) * std::log10(2),結果為 6.92。向下取整結果為 6。
同樣,16位數字字串 9007199254740993 在文字->雙精度->文字往返轉換後無法保持不變,變為 9007199254740992:64位IEEE 754雙精度型別僅保證15位十進位制數的往返轉換。
[編輯] 另請參閱
| [靜態] (C++11) |
區分此型別所有值所需的十進位制位數 (public static member constant) |
| [靜態] |
給定型別的表示所用的基或整數底 (public static member constant) |
| [靜態] |
能無變化表示的 radix 數字位數(public static member constant) |
| [靜態] |
比最小負數基冪大一,該基冪是有效的正規化浮點值 (public static member constant) |
| [靜態] |
比最大整數基冪大一,該基冪是有效的有限浮點值 (public static member constant) |