2
0
mirror of https://github.com/boostorg/spirit.git synced 2026-01-19 04:42:11 +00:00
Files
spirit/test/karma/real1.cpp
Roel Standaert e4092c6f3b Karma: fix off by factor 10 error when rounding to integer
This fixes issue #688. There's some code that divides the integer part
by 10 and increases dim to compensate for it. This code is not
applicable to fixed notation, however, since dim is disregarded in that
case, causing the result to be off by a factor 10.

We can fix this by checking if we're not using fixed notation first,
before doing the division.

Added a few tests to check for this regression.
2021-12-17 01:12:53 +03:00

189 lines
8.1 KiB
C++

// Copyright (c) 2001-2011 Hartmut Kaiser
// Copyright (c) 2011 Bryce Lelbach
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
#include "real.hpp"
#include <boost/phoenix/core/value.hpp>
///////////////////////////////////////////////////////////////////////////////
int main()
{
using namespace boost::spirit;
{
///////////////////////////////////////////////////////////////////////
// use the default real_policies
BOOST_TEST(test("0.0", double_, 0.0));
BOOST_TEST(test("1.0", double_, 1.0));
BOOST_TEST(test("1.0", double_, 1.0001));
BOOST_TEST(test("1.001", double_, 1.001));
BOOST_TEST(test("1.01", double_, 1.010));
BOOST_TEST(test("1.1", double_, 1.100));
BOOST_TEST(test("1.234e-04", double_, 0.00012345));
BOOST_TEST(test("0.001", double_, 0.0012345));
BOOST_TEST(test("0.012", double_, 0.012345));
BOOST_TEST(test("0.123", double_, 0.12345));
BOOST_TEST(test("1.234", double_, 1.2345));
BOOST_TEST(test("12.346", double_, 12.346));
BOOST_TEST(test("123.46", double_, 123.46));
BOOST_TEST(test("1234.5", double_, 1234.5));
BOOST_TEST(test("12342.0", double_, 12342.));
BOOST_TEST(test("1.234e05", double_, 123420.));
BOOST_TEST(test("-1.0", double_, -1.0));
BOOST_TEST(test("-1.234", double_, -1.2345));
BOOST_TEST(test("-1.235", double_, -1.2346));
BOOST_TEST(test("-1234.2", double_, -1234.2));
BOOST_TEST(test("1.0", double_(1.0)));
BOOST_TEST(test("1.0", double_(1.0001)));
BOOST_TEST(test("1.001", double_(1.001)));
BOOST_TEST(test("1.01", double_(1.010)));
BOOST_TEST(test("1.1", double_(1.100)));
BOOST_TEST(test("1.234e-04", double_(0.00012345)));
BOOST_TEST(test("0.001", double_(0.0012345)));
BOOST_TEST(test("0.012", double_(0.012345)));
BOOST_TEST(test("0.123", double_(0.12345)));
BOOST_TEST(test("1.234", double_(1.2345)));
BOOST_TEST(test("12.346", double_(12.346)));
BOOST_TEST(test("123.46", double_(123.46)));
BOOST_TEST(test("1234.5", double_(1234.5)));
BOOST_TEST(test("12342.0", double_(12342.)));
BOOST_TEST(test("1.234e05", double_(123420.)));
}
{
///////////////////////////////////////////////////////////////////////
// test NaN and Inf
BOOST_TEST(test("nan", double_, std::numeric_limits<double>::quiet_NaN()));
BOOST_TEST(test("-nan", double_, -std::numeric_limits<double>::quiet_NaN()));
BOOST_TEST(test("inf", double_, std::numeric_limits<double>::infinity()));
BOOST_TEST(test("-inf", double_, -std::numeric_limits<double>::infinity()));
typedef karma::real_generator<double, signed_policy<double> > signed_type;
signed_type const signed_ = signed_type();
BOOST_TEST(test("+nan", signed_, std::numeric_limits<double>::quiet_NaN()));
BOOST_TEST(test("-nan", signed_, -std::numeric_limits<double>::quiet_NaN()));
BOOST_TEST(test("+inf", signed_, std::numeric_limits<double>::infinity()));
BOOST_TEST(test("-inf", signed_, -std::numeric_limits<double>::infinity()));
#if defined(BOOST_SPIRIT_ZERO_PROBLEM)
BOOST_TEST(test(" 0.0", signed_, 0.0));
#endif
BOOST_TEST(test("+nan", signed_(std::numeric_limits<double>::quiet_NaN())));
BOOST_TEST(test("-nan", signed_(-std::numeric_limits<double>::quiet_NaN())));
BOOST_TEST(test("+inf", signed_(std::numeric_limits<double>::infinity())));
BOOST_TEST(test("-inf", signed_(-std::numeric_limits<double>::infinity())));
#if defined(BOOST_SPIRIT_ZERO_PROBLEM)
BOOST_TEST(test(" 0.0", signed_(0.0)));
#endif
}
{
///////////////////////////////////////////////////////////////////////
typedef karma::real_generator<double, statefull_policy<double> >
statefull_type;
statefull_policy<double> policy(5, true);
statefull_type const statefull = statefull_type(policy);
BOOST_TEST(test("0.00000", statefull, 0.0));
BOOST_TEST(test("0.00000", statefull(0.0)));
using namespace boost::phoenix;
BOOST_TEST(test("0.00000", statefull(val(0.0))));
}
{
///////////////////////////////////////////////////////////////////////
typedef karma::real_generator<double, trailing_zeros_policy<double> >
trailing_zeros_type;
trailing_zeros_type const trail_zeros = trailing_zeros_type();
BOOST_TEST(test("0.0000", trail_zeros, 0.0));
BOOST_TEST(test("1.0000", trail_zeros, 1.0));
BOOST_TEST(test("1.0001", trail_zeros, 1.0001));
BOOST_TEST(test("1.0010", trail_zeros, 1.001));
BOOST_TEST(test("1.0100", trail_zeros, 1.010));
BOOST_TEST(test("1.1000", trail_zeros, 1.100));
BOOST_TEST(test("1.2345e-04", trail_zeros, 0.00012345));
BOOST_TEST(test("0.0012", trail_zeros, 0.0012345));
BOOST_TEST(test("0.0123", trail_zeros, 0.012345));
BOOST_TEST(test("0.1235", trail_zeros, 0.12345));
BOOST_TEST(test("1.2345", trail_zeros, 1.2345));
BOOST_TEST(test("12.3460", trail_zeros, 12.346));
BOOST_TEST(test("123.4600", trail_zeros, 123.46));
BOOST_TEST(test("1234.5000", trail_zeros, 1234.5));
BOOST_TEST(test("12342.0000", trail_zeros, 12342.));
BOOST_TEST(test("1.2342e05", trail_zeros, 123420.));
BOOST_TEST(test("-1.0000", trail_zeros, -1.0));
BOOST_TEST(test("-1.2345", trail_zeros, -1.2345));
BOOST_TEST(test("-1.2346", trail_zeros, -1.2346));
BOOST_TEST(test("-1234.2000", trail_zeros, -1234.2));
BOOST_TEST(test("1.0000", trail_zeros(1.0)));
BOOST_TEST(test("1.0001", trail_zeros(1.0001)));
BOOST_TEST(test("1.0010", trail_zeros(1.001)));
BOOST_TEST(test("1.0100", trail_zeros(1.010)));
BOOST_TEST(test("1.1000", trail_zeros(1.100)));
BOOST_TEST(test("1.2345e-04", trail_zeros(0.00012345)));
BOOST_TEST(test("0.0012", trail_zeros(0.0012345)));
BOOST_TEST(test("0.0123", trail_zeros(0.012345)));
BOOST_TEST(test("0.1235", trail_zeros(0.12345)));
BOOST_TEST(test("1.2345", trail_zeros(1.2345)));
BOOST_TEST(test("12.3460", trail_zeros(12.346)));
BOOST_TEST(test("123.4600", trail_zeros(123.46)));
BOOST_TEST(test("1234.5000", trail_zeros(1234.5)));
BOOST_TEST(test("12342.0000", trail_zeros(12342.)));
BOOST_TEST(test("1.2342e05", trail_zeros(123420.)));
// Regression tests for issue #688
BOOST_TEST(test("10.0000", trail_zeros(9.99999)));
BOOST_TEST(test("103.0000", trail_zeros(102.99999)));
BOOST_TEST(test("-10.0000", trail_zeros(-9.99999)));
BOOST_TEST(test("-103.0000", trail_zeros(-102.99999)));
}
{
using namespace boost::spirit::ascii;
///////////////////////////////////////////////////////////////////////
// test NaN and Inf
BOOST_TEST(test("NAN", upper[double_],
std::numeric_limits<double>::quiet_NaN()));
BOOST_TEST(test("-NAN", upper[double_],
-std::numeric_limits<double>::quiet_NaN()));
BOOST_TEST(test("INF", upper[double_],
std::numeric_limits<double>::infinity()));
BOOST_TEST(test("-INF", upper[double_],
-std::numeric_limits<double>::infinity()));
typedef karma::real_generator<double, signed_policy<double> > signed_type;
signed_type const signed_ = signed_type();
BOOST_TEST(test("+NAN", upper[signed_],
std::numeric_limits<double>::quiet_NaN()));
BOOST_TEST(test("-NAN", upper[signed_],
-std::numeric_limits<double>::quiet_NaN()));
BOOST_TEST(test("+INF", upper[signed_],
std::numeric_limits<double>::infinity()));
BOOST_TEST(test("-INF", upper[signed_],
-std::numeric_limits<double>::infinity()));
#if defined(BOOST_SPIRIT_ZERO_PROBLEM)
BOOST_TEST(test(" 0.0", upper[signed_], 0.0));
#endif
}
return boost::report_errors();
}