查看strtod
的文档:
Linux的:
无穷大是“INF”或“INFINITY”,无视案例。
OS X:
如果字符串部分跟随可选加号 或减号以“INFINITY”开头......就是这样 被解释为无穷大
我正在使用stringstream
将string
转换为double
,并且(错误地)认为strtod
正在幕后使用。 clang ++ 3.4和g ++ 4.8都不会将“INFINITY”转换为inf
。只有clang ++似乎将“INF”转换为inf
。
我是否对stringstream
operator>>
的操作做了太多考虑?或者我可能无法检查重要的错误情况?我的测试代码低于(g++ -std=c++11 -Wall -Wextra inf.cpp -o inf
)。
#include <cmath>
#include <cstdlib>
#include <iomanip>
#include <iostream>
#include <sstream>
void
doTest(
const std::string &str)
{
double val1 = std::strtod(str.c_str(), nullptr);
std::cout << str << " - std::isinf from strtod: " << std::boolalpha <<
std::isinf(val1) << '\n';
std::stringstream sstream(str);
double val2;
sstream >> val2;
std::cout << str << " - std::isinf from stringstream: " <<
std::boolalpha << std::isinf(val2) << '\n';
std::cout << val1 << " vs " << val2 << '\n';
std::cout << std::endl;
}
int
main()
{
doTest("INFINITY");
doTest("+INF");
return (0);
}
clang ++ 3.4(OS X 10.9.2):
INFINITY - std::isinf from strtod: true
INFINITY - std::isinf from stringstream: false
inf vs 0
+INF - std::isinf from strtod: true
+INF - std::isinf from stringstream: true
inf vs inf
g ++ 4.8:
INFINITY - std::isinf from strtod: true
INFINITY - std::isinf from stringstream: false
inf vs 0
+INF - std::isinf from strtod: true
+INF - std::isinf from stringstream: false
inf vs 0
答案 0 :(得分:2)
我完成了标准,并且应该根据C函数strtod
定义流运算符,但只能在过滤第2阶段可能变为非数字或无穷大的任何内容之后。
遵循文件记录:
27.7.2.2.2算术提取器
与插入器的情况一样,这些提取器依赖于语言环境的num_get&lt;&gt; (22.4.2.1)对象 执行解析输入流数据。这些提取器表现为格式化的输入函数(如 在27.7.2.2.1中描述。构造sentry对象后,转换就像执行一样 以下代码片段:
typedef num_get< charT,istreambuf_iterator<charT,traits> > numget;
iostate err = iostate::goodbit;
use_facet< numget >(loc).get(*this, 0, *this, err, val);
setstate(err);
22.4.2.1.2 num_get虚函数
第2阶段:如果
in==end
,则第2阶段终止。否则,从in和局部变量中获取charT 被初始化,好像是
char_type ct = *in;
char c = src[find(atoms, atoms + sizeof(src) - 1, ct) - atoms];
if (ct == use_facet<numpunct<charT> >(loc).decimal_point())
c = ’.’;
bool discard = ct == use_facet<numpunct<charT> >(loc).thousands_sep()
&& use_facet<numpunct<charT> >(loc).grouping().length() != 0
其中src和atoms的值定义如下:
static const char src[] = "0123456789abcdefxABCDEFX+-";
char_type atoms[sizeof(src)];
use_facet<ctype<charT> >(loc).widen(src, src + sizeof(src), atoms);
表示loc的这个值。