gpt4 book ai didi

c++ - sprintf(buf, "%.20g", x)//buf应该多大?

转载 作者:太空狗 更新时间:2023-10-29 20:01:18 26 4
gpt4 key购买 nike

我正在将 double 值转换为字符串,如下所示:

std::string conv(double x) {
char buf[30];
sprintf(buf, "%.20g", x);
return buf;
}

我已将缓冲区大小硬编码为 30,但我不确定这是否足以应对所有情况。

  • 如何找出所需的最大缓冲区大小?
  • 从 32 位切换到 64 位时精度是否变高(因此需要增加缓冲区)?

PS:出于性能原因,我不能使用 ostringstreamboost::lexical_cast(参见 this)

最佳答案

I have hardcoded the buffer size to 30, but am not sure if this is large enough for all cases.

是的。 %.20g 指定尾数为 20 位。小数点加 1。 1 个代表(可能的)符号,5 个代表“e+308”或“e-308”,最坏情况的指数。和 1 用于终止 null。

20 + 1 + 1 + 5 + 1 = 28。

Does the precision get higher (and therefore buffer needs to increase) when switching from 32bit to 64?

没有。

double 在两种架构中的大小相同。如果您将变量声明为 long double,那么指数“e+4092”中可能还有 1 个数字,它仍然适合 30 个字符的缓冲区。但仅在 X86 上,并且仅在较旧的处理器上。

long double 是一种过时的 80 位形式的浮点值,它是 486 FPU 的 native 格式。该 FPU 体系结构的扩展性不佳,并且因为支持 SSE 样式指令而被丢弃,其中最大可能的浮点值是 64 位 double 值。

只要您将打印输出中的尾数限制在 20 位,30 个字符的缓冲区就足够了,这是一个很长的说法。

关于c++ - sprintf(buf, "%.20g", x)//buf应该多大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1934071/

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