C++ 在NaN情况下,to_string()可以返回什么
我正在使用VS 2012,我遇到了非常恼人的行为(有时我的浮动是NaN):C++ 在NaN情况下,to_string()可以返回什么,c++,visual-c++,c++11,C++,Visual C++,C++11,我正在使用VS 2012,我遇到了非常恼人的行为(有时我的浮动是NaN): dbgHelp最终包含5008字符(你不能发明这种东西) 他们中的大多数人都是0, 结果是: 0.#INF00 那么这是一个bug还是标准允许像这样愚蠢的返回值 对我来说,用三元运算符和isnan() 但我想知道这个标准是否具体 在[string.conversions]/7中指定了std::to_string重载: 7返回:每个函数返回一个字符串对象,该对象包含其参数值的字符表示形式,该参数将通过调用sprintf(b
dbgHelp
最终包含5008字符(你不能发明这种东西)
他们中的大多数人都是0,
结果是:
0.#INF00
那么这是一个bug还是标准允许像这样愚蠢的返回值
对我来说,用三元运算符和isnan()
但我想知道这个标准是否具体 在[string.conversions]/7中指定了
std::to_string
重载:
7返回:每个函数返回一个字符串
对象,该对象包含其参数值的字符表示形式,该参数将通过调用sprintf(buf,fmt,val)
生成,格式说明符为“%d”
,“%u”
,“%ld”
,“%lu”
,“%lld”
,“%llu”
,“%f”
、“%f”
或“%Lf”
,其中buf
指定足够大小的内部字符缓冲区
sprintf
详见C99(实际为N256)7.19.6.6/2:
sprintf
函数等同于fprintf
,只是输出写入
数组(由参数s
指定)而不是流。写入空字符
在写的字的末尾;它不计算为返回值的一部分。如果
复制发生在重叠的对象之间,行为未定义
对于fprintf
,跳转到7.19.6.1,第8段中描述了格式标志。具体而言,对于f
格式:
表示浮点数的double
参数转换为
样式中的十进制表示法[−]ddd.ddd,其中后面的位数
小数点字符等于精度规格。如果
精度缺失,则取6;如果精度为零且#标志为
未指定,不显示小数点字符。如果
字符出现时,前面至少出现一位数字。该值四舍五入为
正确的位数
表示无穷大的double
参数转换为以下样式之一
[-]inf
或[-]infinity
-实现定义了哪种样式。A
表示NaN的双参数转换为以下样式之一
[-]nan
或[-]nan(
n-char-sequence)
-哪种样式以及
任何n-char序列都是实现定义的。F
转换说明符
生成INF
、INFINITY
或NAN
而不是INF
、INFINITY
或NAN
,
分别
总之,当
float foo
为正无穷大时,std::to_string(foo)
应返回std::string(“inf”)
float
没有NaN
的值。您的myFloat
的实际值是多少?您可以始终跟踪到to_string
,以更好地了解为什么它可能会像现在这样失败。MSVC源中充斥着宏重定向、TMP和dbg检查…:数据不是NaN,而是无穷大。你可能是在除以零。标准没有描述无穷大有多少个零,而
中的std::num_put()函数认为5000就足够了。这个bug已经存在了。它似乎与std::to_string()的早期草案有关,该草案之前被STL.强词描述为“讨厌”。
auto dbgHelp = std::to_string(myFloat);
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);