real_numerics.cpp

来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 450 行 · 第 1/2 页

CPP
450
字号
//  Copyright (c) 2001-2008 Hartmut Kaiser// //  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)//#define KARMA_FAIL_COMPILATION#include <boost/version.hpp>#include <boost/config/warning_disable.hpp>#include <boost/detail/lightweight_test.hpp>#include <boost/math/concepts/real_concept.hpp>#include <boost/spirit/include/karma_char.hpp>#include <boost/spirit/include/karma_numeric.hpp>#include <boost/spirit/include/karma_generate.hpp>#include <boost/spirit/include/karma_directive.hpp>#include <limits>#include "test.hpp"using namespace spirit_test;/////////////////////////////////////////////////////////////////////////////////  policy for real_generator, which forces the scientific notationtemplate <typename T>struct scientific_policy : boost::spirit::karma::real_generator_policies<T>{    //  we want the numbers always to be in scientific format    typedef boost::spirit::karma::real_generator_policies<T> base_type;    static int floatfield(T) { return base_type::scientific; }};/////////////////////////////////////////////////////////////////////////////////  policy for real_generator, which forces the fixed notationtemplate <typename T>struct fixed_policy : boost::spirit::karma::real_generator_policies<T>{    typedef boost::spirit::karma::real_generator_policies<T> base_type;    //  we want the numbers always to be in scientific format    static int floatfield(T) { return base_type::fixed; }};/////////////////////////////////////////////////////////////////////////////////  policy for real_generator, which forces to output trailing zeros in the //  fractional parttemplate <typename T>struct trailing_zeros_policy   : boost::spirit::karma::real_generator_policies<T>   // 4 digits{    //  we want the numbers always to contain trailing zeros up to 4 digits in     //  the fractional part    static bool const trailing_zeros = true;        //  we want to generate up to 4 fractional digits     static unsigned int precision(T) { return 4; }};/////////////////////////////////////////////////////////////////////////////////  policy for real_generator, which forces the sign to be generatedtemplate <typename T>struct signed_policy   : boost::spirit::karma::real_generator_policies<T>{    // we want to always have a sign generated    static bool const force_sign = true;};// support for using real_concept with a Karma generator has been implemented // in Boost versions > 1.36 only#if BOOST_VERSION > 103600/////////////////////////////////////////////////////////////////////////////////  We need to specialize is_real_lit_tag to allow to use a real_concept as a//  literal belownamespace boost { namespace spirit {    template <typename Domain>    struct is_real_lit_tag<boost::math::concepts::real_concept, Domain>       : boost::mpl::true_ {};}}#endif///////////////////////////////////////////////////////////////////////////////intmain(){    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_spec<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()));        BOOST_TEST(test(" 0.0", signed_, 0.0));                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())));        BOOST_TEST(test(" 0.0", signed_(0.0)));    }        {        ///////////////////////////////////////////////////////////////////////        typedef karma::real_spec<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.)));    }        {        ///////////////////////////////////////////////////////////////////////        BOOST_TEST(test_delimited("0.0 ", double_, 0.0, char_(' ')));        BOOST_TEST(test_delimited("1.0 ", double_, 1.0, char_(' ')));        BOOST_TEST(test_delimited("1.0 ", double_, 1.0001, char_(' ')));        BOOST_TEST(test_delimited("1.001 ", double_, 1.001, char_(' ')));        BOOST_TEST(test_delimited("1.01 ", double_, 1.010, char_(' ')));        BOOST_TEST(test_delimited("1.1 ", double_, 1.100, char_(' ')));                BOOST_TEST(test_delimited("1.234e-04 ", double_, 0.00012345, char_(' ')));        BOOST_TEST(test_delimited("0.001 ", double_, 0.0012345, char_(' ')));        BOOST_TEST(test_delimited("0.012 ", double_, 0.012345, char_(' ')));        BOOST_TEST(test_delimited("0.123 ", double_, 0.12345, char_(' ')));        BOOST_TEST(test_delimited("1.234 ", double_, 1.2345, char_(' ')));        BOOST_TEST(test_delimited("12.346 ", double_, 12.346, char_(' ')));        BOOST_TEST(test_delimited("123.46 ", double_, 123.46, char_(' ')));        BOOST_TEST(test_delimited("1234.5 ", double_, 1234.5, char_(' ')));        BOOST_TEST(test_delimited("12342.0 ", double_, 12342., char_(' ')));        BOOST_TEST(test_delimited("1.234e05 ", double_, 123420., char_(' ')));                BOOST_TEST(test_delimited("-1.0 ", double_, -1.0, char_(' ')));        BOOST_TEST(test_delimited("-1.234 ", double_, -1.2345, char_(' ')));

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?