http://llvm.org/bugs/show_bug.cgi?id=19611

            Bug ID: 19611
           Summary: stringstream operator>>(double&) does not correctly
                    convert "INFINITY" to an infinite value
           Product: libc++
           Version: 3.4
          Hardware: Macintosh
                OS: MacOS X
            Status: NEW
          Severity: normal
          Priority: P
         Component: All Bugs
          Assignee: [email protected]
          Reporter: [email protected]
                CC: [email protected], [email protected]
    Classification: Unclassified

A stringstream containing the string "INFINITY" does not produce an infinite
value when calling 'operator>>(double&).' It instead produces the double 0.

In the latest revision of the C++ standard, section 27.7.2.2.2 states that the
locale's num_get<> should be used for parsing. Section 22.4.2.1.2 states that,
in num_get<>'s Stage 3, "For a floating-point value, the function strtold (is
used)." The C11 standard states in section 7.22.1.3 that, "The expected form of
the subject sequence is an optional plus or minus sign, then one of the
following...INF or INFINITY, ignoring case." It follows then that a
stringstream containing "INFINITY" should convert to an infinite value.

Below is a piece of code and resulting output demonstrating that the result of
operator>>() does not result in a value that returns true from isinf(). This
code was compiled and run on OS X 10.9.2, with "Apple LLVM version 5.1
(clang-503.0.40) (based on LLVM 3.4svn)."

#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++ -Wall -Wextra -std=c++11 inf.cpp -o inf
[gfiumara@vito ~]$ ./inf 
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

-- 
You are receiving this mail because:
You are on the CC list for the bug.
_______________________________________________
LLVMbugs mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/llvmbugs

Reply via email to