【发布时间】:2021-09-29 00:28:00
【问题描述】:
给定一个通用整数类型IntType,很容易确定基数为10 的std::to_chars 运算所需的缓冲区类型:
std::array<char, std::numeric_limits<IntType>::digits10 + 1 + std::is_signed<IntType>::value> buf;
由于std::to_chars 不以 NUL 结尾,并且只添加数字(以及可能的前面 '-',如果有符号),这应该适用于所有内置整数类型。 + 1 是必需的,因为 digits10 for integral types 返回以 10 为底的对数的底数,而不是上限。
这就引出了一个问题:使用每个std::chars_format 值,给定一个通用FloatType 进行无损失转换(写入所有十进制数字)的浮点std::to_chars 调用的最小缓冲区大小是多少?
【问题讨论】:
-
@Jarod42 - 不幸的是,这不适用于定点表示法,也不包括由于用科学计数法编写的指数而可以添加的字符数。
-
那么可能是
std::numeric_limits::max_digits10+10。不会错过一些额外的字节。 -
您只需要足够的位数来保证类型的精度。
to_char不能比传递给它的类型更精确。 -
@NicolBolas - 因为具有正指数的固定符号数字没有无关紧要或不相关的数字,这与您使用负指数的示例不同。
max_digits10使用像 1e38 这样的大值的定点符号将失败。
标签: c++ formatting c++17 number-formatting