什么可以在NaN情况下返回to_string()

时间:2014-02-27 16:21:10

标签: c++ visual-c++ c++11

我使用VS 2012,我遇到了非常恼人的行为(有时候我的浮动是NaN):

auto dbgHelp = std::to_string(myFloat);

dbgHelp最终包含 5008 字符(你不能发明这些东西) 其中大多数是0, 它最终得到: 0#INF00

这是一个错误或标准允许像这样的白痴返回值吗?

修复是微不足道的,因为我可以用三元运算符和isnan()进行适当的操作。 但是我想知道这个标准是否具体......

1 个答案:

答案 0 :(得分:5)

std::to_string重载在[string.conversions] / 7中指定:

string to_string(int val);
string to_string(unsigned val);
string to_string(long val);
string to_string(unsigned long val);
string to_string(long long val);
string to_string(unsigned long long val);
string to_string(float val);
string to_string(double val);
string to_string(long double val);
     

7 返回:每个函数返回一个string对象,其中包含将通过调用{{1}生成的参数值的字符表示形式格式说明符为sprintf(buf, fmt, val)"%d""%u""%ld""%lu""%lld""%llu",{{ 1}}或"%f",其中"%f"指定足够大小的内部字符缓冲区。

"%Lf"详见C99(实际上是N1256)7.19.6.6/2:

  

buf函数等效于sprintf,但输出被写入   数组(由参数sprintf指定)而不是流。写入空字符   在写的字符的末尾;它不计入返回值的一部分。如果   复制发生在重叠的对象之间,行为未定义。

跳转到fprintf的7.19.6.1,格式标志在第8段中描述。具体来说,对于s格式:

  

表示浮点数的fprintf参数将转换为   样式 [ - ] ddd.ddd 中的十进制表示法,其中的位数   小数点字符等于精度规格。如果   缺少精度,它被视为6;如果精度为零且#flag为   未指定,不显示小数点字符。如果是小数点   出现字符,至少出现一个数字。该值四舍五入为   适当的位数。

     

表示无穷大的f参数在其中一种样式中转换   doubledouble - 哪种样式是实现定义的。一个   表示NaN的double参数在其中一个样式中转换   [-]inf[-]infinity n-char-sequence [-]nan - 哪种风格,以及   任何 n-char-sequence ,都是实现定义的。 [-]nan(转换说明符   生成)FINF而不是INFINITYNANinf,   分别

总而言之,当infinity为正无穷大时,nan应该返回float foo