Ticket #8699: spirit.qi.real.patch

File spirit.qi.real.patch, 3.9 KB (added by K-ballo <kaballo86@…>, 9 years ago)

Proposed patch

  • boost/spirit/home/qi/numeric/detail/real_impl.hpp

     
    238238            {
    239239                // No exponent found. Scale the number by -frac_digits.
    240240                traits::scale(-frac_digits, n);
    241             }
    242             else if (traits::is_equal_to_one(n))
    243             {
     241               
    244242                // There is a chance of having to parse one of the 1.0#...
    245243                // styles some implementations use for representing NaN or Inf.
     244                if (frac_digits == 1 && traits::is_equal_to_one(n) &&
     245                    (first != last && *first == '#'))
     246                {
     247                    save = first;
    246248
    247                 // Check whether the number to parse is a NaN or Inf
    248                 if (p.parse_nan(first, last, n) ||
    249                     p.parse_inf(first, last, n))
    250                 {
    251                     // If we got a negative sign, negate the number
    252                     traits::assign_to(traits::negate(neg, n), attr);
    253                     return true;    // got a NaN or Inf, return immediately
     249                    ++first;
     250                    // Check whether the number to parse is a NaN or Inf
     251                    if (!p.parse_nan(first, last, n) &&
     252                        !p.parse_inf(first, last, n))
     253                    {
     254                        first = save;
     255                    }
    254256                }
    255257            }
    256258
  • libs/spirit/test/qi/real2.cpp

     
    6969
    7070        using boost::math::fpclassify;
    7171        using boost::spirit::detail::signbit;   // Boost version is broken
    72 
     72       
    7373        BOOST_TEST(test("-inf", double_));
    7474        BOOST_TEST(test("-infinity", double_));
    7575        BOOST_TEST(test_attr("-inf", double_, d) &&
     
    8383        BOOST_TEST(test_attr("-INFINITY", double_, d) &&
    8484            FP_INFINITE == fpclassify(d) && signbit(d));
    8585
     86        BOOST_TEST(test("-1.0#inf", double_));
     87        BOOST_TEST(test("-1.0#infinity", double_));
     88        BOOST_TEST(test_attr("-1.0#inf", double_, d) &&
     89            FP_INFINITE == fpclassify(d) && signbit(d));
     90        BOOST_TEST(test_attr("-1.0#infinity", double_, d) &&
     91            FP_INFINITE == fpclassify(d) && signbit(d));
     92        BOOST_TEST(test("-1.0#INF", double_));
     93        BOOST_TEST(test("-1.0#INFINITY", double_));
     94        BOOST_TEST(test_attr("-1.0#INF", double_, d) &&
     95            FP_INFINITE == fpclassify(d) && signbit(d));
     96        BOOST_TEST(test_attr("-1.0#INFINITY", double_, d) &&
     97            FP_INFINITE == fpclassify(d) && signbit(d));
     98
    8699        BOOST_TEST(test("-nan", double_));
    87100        BOOST_TEST(test_attr("-nan", double_, d) &&
    88101            FP_NAN == fpclassify(d) && signbit(d));
     
    96109        BOOST_TEST(test("-NAN(...)", double_));
    97110        BOOST_TEST(test_attr("-NAN(...)", double_, d) &&
    98111            FP_NAN == fpclassify(d) && signbit(d));
     112
     113        BOOST_TEST(test("-1.0#nan", double_));
     114        BOOST_TEST(test_attr("-1.0#nan", double_, d) &&
     115            FP_NAN == fpclassify(d) && signbit(d));
     116        BOOST_TEST(test("-1.0#NAN", double_));
     117        BOOST_TEST(test_attr("-1.0#NAN", double_, d) &&
     118            FP_NAN == fpclassify(d) && signbit(d));
     119
     120        BOOST_TEST(test("-1.0#nan(...)", double_));
     121        BOOST_TEST(test_attr("-1.0#nan(...)", double_, d) &&
     122            FP_NAN == fpclassify(d) && signbit(d));
     123        BOOST_TEST(test("-1.0#NAN(...)", double_));
     124        BOOST_TEST(test_attr("-1.0#NAN(...)", double_, d) &&
     125            FP_NAN == fpclassify(d) && signbit(d));
    99126    }
    100127
    101128    return boost::report_errors();