NoS*_*tAl 3 c++ visual-c++ c++11
我使用VS 2012,我遇到了非常恼人的行为(有时我的浮动是NaN):
auto dbgHelp = std::to_string(myFloat);
Run Code Online (Sandbox Code Playgroud)
dbgHelp最终包含5008个字符(你不能发明这些东西)大部分都是0,它最终得到:0.#INF00
那么这个bug或标准是否允许像这样的白痴返回值?
修复是微不足道的,因为我可以用三元运算符来制作正确的thig,isnan()
但我想知道标准是否具体对此...
的std::to_string过载值被在[string.conversions]/7指定的:
Run Code Online (Sandbox Code Playgroud)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保持,将通过调用来产生其自变量的值的字符表示对象sprintf(buf, fmt, val)与一个格式说明"%d","%u","%ld","%lu","%lld","%llu","%f","%f",或"%Lf",分别,其中buf指定足够大小的内部字符缓冲区.
sprintf 在C99(实际上是N1256)7.19.6.6/2中有详细说明:
该
sprintf函数等效于fprintf,除了输出被写入数组(由参数指定s)而不是流.在写入的字符末尾写入空字符; 它不计入返回值的一部分.如果在重叠的对象之间进行复制,则行为未定义.
跳到7.19.6.1 for fprintf,格式标志在第8段中描述.具体来说,对于f格式:
甲
double表示浮点数参数被转换为十进制表示在样式[ - ] ddd.ddd,其中的小数点字符后的数字位数等于指定的精度.如果缺少精度,则取6; 如果精度为零且未指定#flag,则不显示小数点字符.如果出现小数点字符,则在其前面至少出现一个数字.该值四舍五入到适当的位数.
double表示无穷大的参数在其中一个样式中转换[-]inf或[-]infinity- 哪个样式是实现定义的.表示NaN的双参数在其中一个样式[-]nan或[-]nan(n-char-sequence中转换)- 哪个样式和任何n-char序列的含义是实现定义的.的F转换指定产生INF,INFINITY或NAN代替的inf,infinity或nan分别.
把它们放在一起,什么时候float foo是正无穷大,std::to_string(foo)应该回归std::string("inf").
| 归档时间: |
|
| 查看次数: |
648 次 |
| 最近记录: |