字符串流应该解析" INFINITY"作为一个无限的价值?

时间:2014-04-29 19:56:33

标签: c++ floating-point infinity

查看strtod的文档:

Linux的:

  

无穷大是“INF”或“INFINITY”,无视案例。

OS X:

  

如果字符串部分跟随可选加号   或减号以“INFINITY”开头......就是这样   被解释为无穷大

我正在使用stringstreamstring转换为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

1 个答案:

答案 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的这个值。