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