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

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

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

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);