std::numeric_limits<T>::digits10
来自 cppreference.cn
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) |