[Boost-bugs] [Boost C++ Libraries] #8272: BOOST_REQUIRE_CLOSE fails to compile with boost::multiprecision::cpp_dec_float_100

Subject: [Boost-bugs] [Boost C++ Libraries] #8272: BOOST_REQUIRE_CLOSE fails to compile with boost::multiprecision::cpp_dec_float_100
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2013-03-10 20:12:09


#8272: BOOST_REQUIRE_CLOSE fails to compile with
boost::multiprecision::cpp_dec_float_100
------------------------------------------------------------+---------------
 Reporter: Ken Smith <kgsmith@…> | Owner: johnmaddock
     Type: Bugs | Status: new
Milestone: To Be Determined | Component: multiprecision
  Version: Boost 1.53.0 | Severity: Problem
 Keywords: test multiprecision check_is_close is_close_to |
------------------------------------------------------------+---------------
 Environment:
 - Linux 3.7.9-2-ARCH
 - G++ 4.7.2
 - Issue reproduces with Boost SVN trunk

 This code:

 {{{
 #define BOOST_TEST_MAIN
 #include <boost/test/included/unit_test.hpp>
 #include <boost/test/floating_point_comparison.hpp>
 #include <boost/multiprecision/cpp_dec_float.hpp>

 BOOST_AUTO_TEST_CASE(multiprecision_closeness)
 {
    using num_t = boost::multiprecision::cpp_dec_float_100;

    num_t a("1.0000000000000000000000000000001");
    num_t b(1);
    num_t thresh(1e-15);

    BOOST_REQUIRE_CLOSE(a, b, thresh);
 }

 }}}

 Generates the following compilation error:

 {{{
 g++ -std=gnu++11 -g -Iboost-trunk -o prog repro.cpp
 In file included from boost-trunk/boost/test/tools/old/impl.hpp:21:0,
                  from boost-trunk/boost/test/test_tools.hpp:32,
                  from boost-trunk/boost/test/impl/exception_safety.ipp:35,
                  from boost-trunk/boost/test/included/unit_test.hpp:22,
                  from repro.cpp:2:
 boost-trunk/boost/test/tools/floating_point_comparison.hpp: In
 instantiation of ‘FPT boost::math::fpc::fpc_detail::fpt_abs(FPT) [with FPT
 =
 boost::multiprecision::detail::expression<boost::multiprecision::detail::subtract_immediates,
 boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<100u>
>,
 boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<100u>
>, void, void>]’:
 boost-trunk/boost/test/tools/floating_point_comparison.hpp:207:67:
 required from ‘bool
 boost::math::fpc::close_at_tolerance<FPT>::operator()(FPT, FPT) const
 [with FPT =
 boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<100u>
>]’
 boost-trunk/boost/test/tools/old/impl.hpp:292:50: required from
 â€˜boost::test_tools::assertion_result
 boost::test_tools::check_is_close_t::operator()(FPT1, FPT2, ToleranceType)
 const [with FPT1 =
 boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<100u>
>; FPT2 =
 boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<100u>
>; ToleranceType =
 boost::math::fpc::percent_tolerance_t<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<100u>
> >]’
 boost-trunk/boost/test/tools/old/impl.hpp:91:1: required from ‘bool
 boost::test_tools::tt_detail::check_frwd(Pred, const
 boost::unit_test::lazy_ostream&, boost::unit_test::const_string,
 std::size_t, boost::test_tools::tt_detail::tool_level,
 boost::test_tools::tt_detail::check_type, const Arg0&, const char*, const
 Arg1&, const char*, const Arg2&, const char*) [with Pred =
 boost::test_tools::check_is_close_t; Arg0 =
 boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<100u>
>; Arg1 =
 boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<100u>
>; Arg2 =
 boost::math::fpc::percent_tolerance_t<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<100u>
> >; boost::unit_test::const_string =
 boost::unit_test::basic_cstring<const char>; std::size_t = long unsigned
 int]’
 repro.cpp:14:1: required from here
 boost-trunk/boost/test/tools/floating_point_comparison.hpp:59:47: error:
 no matching function for call to
 â€˜boost::multiprecision::detail::expression<boost::multiprecision::detail::subtract_immediates,
 boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<100u>
>,
 boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<100u>
>, void, void>::expression(int)’
 boost-trunk/boost/test/tools/floating_point_comparison.hpp:59:47: note:
 candidates are:
 In file included from boost-
 trunk/boost/multiprecision/detail/default_ops.hpp:10:0,
                  from boost-
 trunk/boost/multiprecision/detail/generic_interconvert.hpp:9,
                  from boost-trunk/boost/multiprecision/number.hpp:22,
                  from boost-
 trunk/boost/multiprecision/cpp_dec_float.hpp:28,
                  from repro.cpp:4:
 boost-trunk/boost/multiprecision/detail/number_base.hpp:379:4: note:
 boost::multiprecision::detail::expression<tag, Arg1, Arg2, void,
 void>::expression(const Arg1&, const Arg2&) [with tag =
 boost::multiprecision::detail::subtract_immediates; Arg1 =
 boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<100u>
>; Arg2 =
 boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<100u>
>]
 boost-trunk/boost/multiprecision/detail/number_base.hpp:379:4: note:
 candidate expects 2 arguments, 1 provided
 boost-trunk/boost/multiprecision/detail/number_base.hpp:369:8: note:
 constexpr
 boost::multiprecision::detail::expression<boost::multiprecision::detail::subtract_immediates,
 boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<100u>
>,
 boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<100u>
>, void, void>::expression(const
 boost::multiprecision::detail::expression<boost::multiprecision::detail::subtract_immediates,
 boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<100u>
>,
 boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<100u>
>, void, void>&)
 boost-trunk/boost/multiprecision/detail/number_base.hpp:369:8: note: no
 known conversion for argument 1 from ‘int’ to ‘const
 boost::multiprecision::detail::expression<boost::multiprecision::detail::subtract_immediates,
 boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<100u>
>,
 boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<100u>
>, void, void>&’
 make: *** [prog] Error 1
 }}}

 At line 59 of floating_point_comparison.hpp, FPT appears to be an
 expression template and doesn't suffer the static cast.

-- 
Ticket URL: <https://svn.boost.org/trac/boost/ticket/8272>
Boost C++ Libraries <http://www.boost.org/>
Boost provides free peer-reviewed portable C++ source libraries.

This archive was generated by hypermail 2.1.7 : 2017-02-16 18:50:12 UTC