命名空间
变体
操作

std::numeric_limits<T>::digits10

来自 cppreference.com
 
 
实用程序库
语言支持
类型支持 (基本类型,RTTI)
库功能测试宏 (C++20)
动态内存管理
程序实用程序
协程支持 (C++20)
可变参数函数
调试支持
(C++26)
三方比较
(C++20)
(C++20)(C++20)(C++20)
(C++20)(C++20)(C++20)
通用实用程序
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (在 C++20 中已弃用)
整数比较函数
(C++20)(C++20)(C++20)   
(C++20)
交换类型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
通用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
基本字符串转换
(C++17)
(C++17)

 
 
 
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 数字数量
(公共静态成员常量) [编辑]
基数的最小负次幂加 1,它是一个有效的标准化浮点数
(公共静态成员常量) [编辑]
基数的最大整数次幂加 1,它是一个有效的有限浮点数
(公共静态成员常量) [编辑]