我使用VS 2012,我遇到了非常恼人的行为(有时候我的浮动是NaN):
auto dbgHelp = std::to_string(myFloat);
dbgHelp
最终包含 5008 字符(你不能发明这些东西)
其中大多数是0,
它最终得到:
0#INF00
这是一个错误或标准允许像这样的白痴返回值吗?
修复是微不足道的,因为我可以用三元运算符和isnan()
进行适当的操作。
但是我想知道这个标准是否具体......
答案 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
参数在其中一种样式中转换double
或double
- 哪种样式是实现定义的。一个 表示NaN的double参数在其中一个样式中转换[-]inf
或[-]infinity
n-char-sequence[-]nan
- 哪种风格,以及 任何 n-char-sequence ,都是实现定义的。[-]nan(
转换说明符 生成)
,F
或INF
而不是INFINITY
,NAN
或inf
, 分别
总而言之,当infinity
为正无穷大时,nan
应该返回float foo
。