std::numeric_limits<T>::digits10
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 的值 |
| /* non-specialized */ | 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 | <td
示例
一个8位二进制类型可以精确表示任意两位十进制数,但无法表示三位十进制数256..999。8位类型的
digits10
值为2(
8
*
std::
log10
(
2
)
的结果为2.41)
标准的32位IEEE 754浮点类型具有24位小数部分(23位显式表示,1位隐含位),这可能暗示其可表示7位十进制数(
24
*
std::
log10
(
2
)
等于7.22)。但由于相对舍入误差的非均匀性,部分具有7位十进制数字的浮点值在转换为32位float并返回时无法保持原值:最小的正例是
8.589973e9
,在往返转换后变为
8.589974e9
。这些舍入误差在表示中不会超过1比特,
digits10
的计算公式为
(
24
-
1
)
*
std::
log10
(
2
)
,即6.92。向下取整后得到值为6。
同样地,16位数字串 9007199254740993 无法在 文本->双精度->文本 的往返过程中保持原值,会变成 9007199254740992 :64位 IEEE 754 双精度类型仅能保证15位十进制数字的往返精度。
参见
|
[static]
(C++11)
|
区分此类型所有值所需的十进制位数
(公开静态成员常量) |
|
[static]
|
给定类型表示所使用的基数或整数基底
(公开静态成员常量) |
|
[static]
|
可无更改表示的
radix
数字位数
(公开静态成员常量) |
|
[static]
|
基数的最小负幂加一,该幂是有效的规范化浮点值
(公开静态成员常量) |
|
[static]
|
基数的最大整数幂加一,该幂是有效的有限浮点值
(公开静态成员常量) |