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) |