gpt4 book ai didi

c++ - std::to_chars() 最小浮点缓冲区大小

转载 作者:行者123 更新时间:2023-12-04 12:28:48 27 4
gpt4 key购买 nike

给定一个通用整数类型 IntType ,很容易确定 std::to_chars 所需的缓冲区类型对基数为 10 的数字的操作:

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::to_chars 的最小缓冲区大小是多少?给定一个通用的调用 FloatType使用 std::chars_format 中的每一个进行无损转换(写入所有十进制数字)值(value)观?

最佳答案

请注意,所需的最小缓冲区因所需的浮点格式而异。使用 max_digits10max_exponent10总是足以确定 base-10 输出所需的最小字符数,假设不希望输出比浮点类型包含的精度更高的精度。
这个问题不仅限于to_chars , 任何一个。 printf 中的 C 标准库函数family 将具有相同的行为,因此这在 C 中的权重与在 C++ 中的权重相同。

  • std::chars_format::scientific%e (printf specifier) :
    template<typename T>
    constexpr int log10ceil(T num) {
    return num < 10? 1: 1 + log10ceil(num / 10);
    }

    std::array<char, 4 +
    std::numeric_limits<FloatType>::max_digits10 +
    std::max(2, log10ceil(std::numeric_limits<FloatType>::max_exponent10))
    > buf;
    函数log10ceil允许 constexpr 评估可能的最大指数中有多少位数字。根据标准,指数中必须至少有 2 位数字,因此要针对最小指数宽度进行测试。写入时使用的精度不能大于max_digits10 - 1 .使用这个精确的精度将提供到字符串表示的无损转换。
    添加的 4 个字符容纳可能的符号、小数点和 "e+""e-"在输出中。
  • std::chars_format::fixed%f (printf specifier) :
    std::array<char, 2 + 
    std::numeric_limits<FloatType>::max_exponent10 +
    std::numeric_limits<FloatType>::max_digits10
    > buf;
    同样,使用的精度不能大于 max_digits10 - 1 .使用这个精确的精度将提供到字符串表示的无损转换。
    添加 2 个字符以适应输出中可能的符号和小数点。
  • std::chars_format::general%g (printf specifier) :
    对于 general在这种情况下,最小缓冲区始终与 scientific 相同案件。 然而 ,使用的精度不能大于 max_digits10 用于无损转换为字符串表示,而不是如上所述减去一个。

  • 请注意,在所有这些示例中,缓冲区是 正好最大字符串表示的大小。如果需要NUL-终止符或其他内容,则必须相应增加大小。

    关于c++ - std::to_chars() 最小浮点缓冲区大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68472720/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com