Namespaces
Variants

std::numeric_limits<T>::digits10

来自 zh.cppreference.net
 
 
 
 
 
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) 并向下取整的结果。

标准特化

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

示例

一个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 数字位数
(公开静态成员常量)
基数的最小负幂加一,该幂是有效的规范化浮点值
(公开静态成员常量)
基数的最大整数幂加一,该幂是有效的有限浮点值
(公开静态成员常量)