分配char缓冲区以保存float的文本表示

时间:2013-10-25 18:41:57

标签: c++ c c++11

C ++ 11具有to_string功能。在引擎盖下,它使用vsnprintf将值写入char缓冲区。然后,这用于初始化返回的字符串。由于vsnprintf需要使用缓冲区的大小,因此计算并传入它。

对于确切类型,使用sizeof计算大小。例如,对于unsigned long,计算结果为4 * sizeof(unsigned long)

但对于浮点类型,它的计算方式不同。在这种情况下,所需缓冲区的大小是使用

在内部计算的
__gnu_cxx::__numeric_traits<float>::__max_exponent10 + 20

我认为这只是一种内部库的写作方式

std::numeric_limits<float>::max_exponent10 + 20

我的问题是,为什么大小是以这种方式计算的?为什么他们不能只使用sizeof运算符。

1 个答案:

答案 0 :(得分:0)

要计算积分类型的最长可表示值,可以使用sizeof,如下例所示:

在32位系统中unsigned long的最大值需要10个数字加上负号符号-\0的一个字节,它至少需要{{} 1}}字节。所以,我认为下面的表达是一个很好的估计:

12

对于4 * sizeof(unsigned long) // = 16 值,这不是真的。在这里,float很有用:

  

std :: numeric_limits :: max_exponent10的值是最大的   正数n使得10n是可表示的有限值   浮点类型T。