std::numeric_limits<T>::digits10
来自 cppreference.com
< cpp | types | numeric limits
static const int digits10; |
(直到 C++11) | |
static constexpr int digits10; |
(自 C++11 起) | |
的值 std::numeric_limits<T>::digits10 是类型 T
在不改变的情况下可以表示的以 10 为底的数字的数量,也就是说,任何具有这么多有效小数位的数字都可以转换为类型 T
的值,然后转换回十进制形式,而不会因舍入或溢出而改变。对于以 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 (自 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 (6 对于 IEEE float) |
double | DBL_DIG (15 对于 IEEE double) |
long double | LDBL_DIG (18 对于 80 位 Intel long double; 33 对于 IEEE 四倍精度) |
[编辑] 例子
一个 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 位 float 并返回后无法保留:最小的正数示例是 8.589973e9,它在往返后变为 8.589974e9。这些舍入误差不能超过表示中的一个比特,digits10
的计算值为 (24 - 1) * std::log10(2),也就是 6.92。舍入结果为 6。
同样地,16 位字符串 9007199254740993 也无法在文本->double->文本往返中保留,它变为 9007199254740992:64 位 IEEE 754 类型 double 仅保证对 15 位小数的这种往返。
[编辑] 另请参阅
[static] (C++11) |
区分此类型所有值的必要十进制数字数 (公共静态成员常量) |
[static] |
给定类型表示所使用的基数或整数基数 (公共静态成员常量) |
[static] |
可以不改变地表示的 radix 数字数量(公共静态成员常量) |
[static] |
基数的最小负次幂加 1,它是一个有效的标准化浮点数 (公共静态成员常量) |
[static] |
基数的最大整数次幂加 1,它是一个有效的有限浮点数 (公共静态成员常量) |