diff --git a/include/boost/math/differentiation/autodiff.hpp b/include/boost/math/differentiation/autodiff.hpp index 1286326c2..7cda19685 100644 --- a/include/boost/math/differentiation/autodiff.hpp +++ b/include/boost/math/differentiation/autodiff.hpp @@ -1491,7 +1491,7 @@ fvar sqrt(fvar const& cr) { BOOST_IF_CONSTEXPR (order == 0) return fvar(*derivatives); else { - root_type numerator = 0.5; + root_type numerator = root_type(0.5); root_type powers = 1; #ifndef BOOST_NO_CXX17_IF_CONSTEXPR derivatives[1] = numerator / *derivatives; diff --git a/test/test_autodiff.hpp b/test/test_autodiff.hpp index 7f3c98b20..e522a3daf 100644 --- a/test/test_autodiff.hpp +++ b/test/test_autodiff.hpp @@ -31,16 +31,24 @@ #include #include +#if __has_include() +# include +#endif + namespace mp11 = boost::mp11; namespace bmp = boost::multiprecision; namespace diff = boost::math::differentiation::autodiff_v1::detail; + #if defined(BOOST_USE_VALGRIND) || defined(BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS) using bin_float_types = mp11::mp_list; +#elif defined(__STDCPP_FLOAT32_T__) && defined(__STDCPP_FLOAT64_T__) +using bin_float_types = mp11::mp_list; #else using bin_float_types = mp11::mp_list; #endif + // cpp_dec_float_50 cannot be used with close_at_tolerance /*using multiprecision_float_types = mp_list;*/ diff --git a/test/test_autodiff_1.cpp b/test/test_autodiff_1.cpp index 9417d78bf..144f61051 100644 --- a/test/test_autodiff_1.cpp +++ b/test/test_autodiff_1.cpp @@ -22,7 +22,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(constructors, T, all_float_types) { } } // Single variable - const T cx = 10.0; + const T cx = 10; const auto x = make_fvar(cx); for (auto i : boost::irange(m + 1)) { if (i == 0u) { @@ -44,16 +44,16 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(constructors, T, all_float_types) { } } // Second independent variable - const T cy = 100.0; + const T cy = 100; const auto y = make_fvar(cy); for (auto i : boost::irange(m + 1)) { for (auto j : boost::irange(n + 1)) { if (i == 0 && j == 0) { BOOST_CHECK_EQUAL(y.derivative(i, j), cy); } else if (i == 0 && j == 1) { - BOOST_CHECK_EQUAL(y.derivative(i, j), 1.0); + BOOST_CHECK_EQUAL(y.derivative(i, j), static_cast(1.0)); } else { - BOOST_CHECK_EQUAL(y.derivative(i, j), 0.0); + BOOST_CHECK_EQUAL(y.derivative(i, j), static_cast(0.0)); } } } @@ -64,16 +64,16 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(implicit_constructors, T, all_float_types) { const autodiff_fvar x = 3; const autodiff_fvar one = uncast_return(x); const autodiff_fvar two_and_a_half = 2.5; - BOOST_CHECK_EQUAL(static_cast(x), 3.0); - BOOST_CHECK_EQUAL(static_cast(one), 1.0); - BOOST_CHECK_EQUAL(static_cast(two_and_a_half), 2.5); + BOOST_CHECK_EQUAL(static_cast(x), static_cast(3.0)); + BOOST_CHECK_EQUAL(static_cast(one), static_cast(1.0)); + BOOST_CHECK_EQUAL(static_cast(two_and_a_half), static_cast(2.5)); } BOOST_AUTO_TEST_CASE_TEMPLATE(assignment, T, all_float_types) { constexpr std::size_t m = 3; constexpr std::size_t n = 4; - const T cx = 10.0; - const T cy = 10.0; + const T cx = 10; + const T cy = 10; autodiff_fvar empty; // Uninitialized variable<> may have non-zero values. // Single variable @@ -132,7 +132,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(ostream, T, all_float_types) { BOOST_AUTO_TEST_CASE_TEMPLATE(addition_assignment, T, all_float_types) { constexpr std::size_t m = 3; constexpr std::size_t n = 4; - const T cx = 10.0; + const T cx = 10; auto sum = autodiff_fvar(); // zero-initialized // Single variable const auto x = make_fvar(cx); @@ -142,14 +142,14 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(addition_assignment, T, all_float_types) { if (i == 0 && j == 0) { BOOST_CHECK_EQUAL(sum.derivative(i, j), cx); } else if (i == 1 && j == 0) { - BOOST_CHECK_EQUAL(sum.derivative(i, j), 1.0); + BOOST_CHECK_EQUAL(sum.derivative(i, j), T(1)); } else { - BOOST_CHECK_EQUAL(sum.derivative(i, j), 0.0); + BOOST_CHECK_EQUAL(sum.derivative(i, j), T(0)); } } } // Arithmetic constant - const T cy = 11.0; + const T cy = 11; sum = 0; sum += cy; for (auto i : boost::irange(m + 1)) { @@ -157,7 +157,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(addition_assignment, T, all_float_types) { if (i == 0 && j == 0) { BOOST_CHECK_EQUAL(sum.derivative(i, j), cy); } else { - BOOST_CHECK_EQUAL(sum.derivative(i, j), 0.0); + BOOST_CHECK_EQUAL(sum.derivative(i, j), T(0)); } } } @@ -166,7 +166,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(addition_assignment, T, all_float_types) { BOOST_AUTO_TEST_CASE_TEMPLATE(subtraction_assignment, T, all_float_types) { constexpr std::size_t m = 3; constexpr std::size_t n = 4; - const T cx = 10.0; + const T cx = 10; auto sum = autodiff_fvar(); // zero-initialized // Single variable const auto x = make_fvar(cx); @@ -176,14 +176,14 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(subtraction_assignment, T, all_float_types) { if (i == 0 && j == 0) { BOOST_CHECK_EQUAL(sum.derivative(i, j), -cx); } else if (i == 1 && j == 0) { - BOOST_CHECK_EQUAL(sum.derivative(i, j), -1.0); + BOOST_CHECK_EQUAL(sum.derivative(i, j), T(-1)); } else { - BOOST_CHECK_EQUAL(sum.derivative(i, j), 0.0); + BOOST_CHECK_EQUAL(sum.derivative(i, j), T(0)); } } } // Arithmetic constant - const T cy = 11.0; + const T cy = 11; sum = 0; sum -= cy; for (auto i : boost::irange(m + 1)) { @@ -191,7 +191,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(subtraction_assignment, T, all_float_types) { if (i == 0 && j == 0) { BOOST_CHECK_EQUAL(sum.derivative(i, j), -cy); } else { - BOOST_CHECK_EQUAL(sum.derivative(i, j), 0.0); + BOOST_CHECK_EQUAL(sum.derivative(i, j), T(0)); } } } @@ -202,7 +202,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(multiplication_assignment, T, all_float_types) { // extra lines. constexpr std::size_t m = 3; constexpr std::size_t n = 4; - const T cx = 10.0; + const T cx = 10; auto product = autodiff_fvar(1); // unit constant // Single variable auto x = make_fvar(cx); @@ -212,14 +212,14 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(multiplication_assignment, T, all_float_types) { if (i == 0 && j == 0) { BOOST_CHECK_EQUAL(product.derivative(i, j), cx); } else if (i == 1 && j == 0) { - BOOST_CHECK_EQUAL(product.derivative(i, j), 1.0); + BOOST_CHECK_EQUAL(product.derivative(i, j), T(1)); } else { - BOOST_CHECK_EQUAL(product.derivative(i, j), 0.0); + BOOST_CHECK_EQUAL(product.derivative(i, j), T(0)); } } } // Arithmetic constant - const T cy = 11.0; + const T cy = 11; product = 1; product *= cy; for (auto i : boost::irange(m + 1)) { @@ -227,12 +227,12 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(multiplication_assignment, T, all_float_types) { if (i == 0 && j == 0) { BOOST_CHECK_EQUAL(product.derivative(i, j), cy); } else { - BOOST_CHECK_EQUAL(product.derivative(i, j), 0.0); + BOOST_CHECK_EQUAL(product.derivative(i, j), T(0)); } } } // 0 * inf = nan - x = make_fvar(0.0); + x = make_fvar(T(0.0)); x *= std::numeric_limits::infinity(); // std::cout << "x = " << x << std::endl; for (auto i : boost::irange(m + 1)) { @@ -251,7 +251,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(multiplication_assignment, T, all_float_types) { BOOST_AUTO_TEST_CASE_TEMPLATE(division_assignment, T, all_float_types) { constexpr std::size_t m = 3; constexpr std::size_t n = 4; - const T cx = 16.0; + const T cx = 16; auto quotient = autodiff_fvar(1); // unit constant // Single variable const auto x = make_fvar(cx); @@ -262,11 +262,11 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(division_assignment, T, all_float_types) { BOOST_CHECK_EQUAL(quotient.derivative(3, 0), -6 / pow(cx, 4)); for (auto i : boost::irange(m + 1)) { for (auto j : boost::irange(std::size_t(1), n + 1)) { - BOOST_CHECK_EQUAL(quotient.derivative(i, j), 0.0); + BOOST_CHECK_EQUAL(quotient.derivative(i, j), T(0)); } } // Arithmetic constant - const T cy = 32.0; + const T cy = 32; quotient = 1; quotient /= cy; for (auto i : boost::irange(m + 1)) { @@ -274,7 +274,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(division_assignment, T, all_float_types) { if (i == 0 && j == 0) { BOOST_CHECK_EQUAL(quotient.derivative(i, j), 1 / cy); } else { - BOOST_CHECK_EQUAL(quotient.derivative(i, j), 0.0); + BOOST_CHECK_EQUAL(quotient.derivative(i, j), T(0)); } } } @@ -283,7 +283,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(division_assignment, T, all_float_types) { BOOST_AUTO_TEST_CASE_TEMPLATE(unary_signs, T, all_float_types) { constexpr std::size_t m = 3; constexpr std::size_t n = 4; - const T cx = 16.0; + const T cx = 16; autodiff_fvar lhs; // Single variable const auto x = make_fvar(cx); @@ -293,9 +293,9 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(unary_signs, T, all_float_types) { if (i == 0 && j == 0) { BOOST_CHECK_EQUAL(lhs.derivative(i, j), -cx); } else if (i == 1 && j == 0) { - BOOST_CHECK_EQUAL(lhs.derivative(i, j), -1.0); + BOOST_CHECK_EQUAL(lhs.derivative(i, j), T(-1)); } else { - BOOST_CHECK_EQUAL(lhs.derivative(i, j), 0.0); + BOOST_CHECK_EQUAL(lhs.derivative(i, j), T(0)); } } } @@ -305,9 +305,9 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(unary_signs, T, all_float_types) { if (i == 0 && j == 0) { BOOST_CHECK_EQUAL(lhs.derivative(i, j), cx); } else if (i == 1 && j == 0) { - BOOST_CHECK_EQUAL(lhs.derivative(i, j), 1.0); + BOOST_CHECK_EQUAL(lhs.derivative(i, j), T(1)); } else { - BOOST_CHECK_EQUAL(lhs.derivative(i, j), 0.0); + BOOST_CHECK_EQUAL(lhs.derivative(i, j), T(0)); } } } @@ -324,7 +324,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(cast_double, T, all_float_types) { } BOOST_AUTO_TEST_CASE_TEMPLATE(int_double_casting, T, all_float_types) { - const T ca = 3.0; + const T ca = 3; const auto x0 = make_fvar(ca); BOOST_CHECK_EQUAL(static_cast(x0), ca); const auto x1 = make_fvar(ca); @@ -334,8 +334,8 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(int_double_casting, T, all_float_types) { } BOOST_AUTO_TEST_CASE_TEMPLATE(scalar_addition, T, all_float_types) { - const T ca = 3.0; - const T cb = 4.0; + const T ca = 3; + const T cb = 4; const auto sum0 = autodiff_fvar(ca) + autodiff_fvar(cb); BOOST_CHECK_EQUAL(ca + cb, static_cast(sum0)); const auto sum1 = autodiff_fvar(ca) + cb; @@ -346,7 +346,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(scalar_addition, T, all_float_types) { BOOST_AUTO_TEST_CASE_TEMPLATE(power8, T, all_float_types) { constexpr std::size_t n = 8u; - const T ca = 3.0; + const T ca = 3; auto x = make_fvar(ca); // Test operator*=() x *= x; @@ -366,10 +366,10 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(power8, T, all_float_types) { x = x * x * x * x * x * x * x * x; for (auto i : boost::irange(n + 1)) { BOOST_CHECK_CLOSE( - x.derivative(i), - power_factorial / + static_cast(x.derivative(i)), + static_cast(power_factorial / boost::math::factorial(static_cast(n - i)) * - pow(ca, n - i), + pow(ca, n - i)), std::numeric_limits::epsilon()); } } @@ -377,14 +377,14 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(power8, T, all_float_types) { BOOST_AUTO_TEST_CASE_TEMPLATE(dim1_multiplication, T, all_float_types) { constexpr std::size_t m = 2; constexpr std::size_t n = 3; - const T cy = 4.0; + const T cy = 4; auto y0 = make_fvar(cy); auto y = make_fvar(cy); y *= y0; BOOST_CHECK_EQUAL(y.derivative(0), cy * cy); BOOST_CHECK_EQUAL(y.derivative(1), 2 * cy); - BOOST_CHECK_EQUAL(y.derivative(2), 2.0); - BOOST_CHECK_EQUAL(y.derivative(3), 0.0); + BOOST_CHECK_EQUAL(y.derivative(2), T(2)); + BOOST_CHECK_EQUAL(y.derivative(3), T(0)); y = y * cy; BOOST_CHECK_EQUAL(y.derivative(0), cy * cy * cy); BOOST_CHECK_EQUAL(y.derivative(1), 2 * cy * cy); @@ -395,21 +395,21 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(dim1_multiplication, T, all_float_types) { BOOST_AUTO_TEST_CASE_TEMPLATE(dim1and2_multiplication, T, all_float_types) { constexpr std::size_t m = 2; constexpr std::size_t n = 3; - const T cx = 3.0; - const T cy = 4.0; + const T cx = 3; + const T cy = 4; auto x = make_fvar(cx); auto y = make_fvar(cy); y *= x; BOOST_CHECK_EQUAL(y.derivative(0, 0), cx * cy); BOOST_CHECK_EQUAL(y.derivative(0, 1), cx); BOOST_CHECK_EQUAL(y.derivative(1, 0), cy); - BOOST_CHECK_EQUAL(y.derivative(1, 1), 1.0); + BOOST_CHECK_EQUAL(y.derivative(1, 1), T(1)); for (auto i : boost::irange(std::size_t(1), m)) { for (auto j : boost::irange(std::size_t(1), n)) { if (i == 1 && j == 1) { - BOOST_CHECK_EQUAL(y.derivative(i, j), 1.0); + BOOST_CHECK_EQUAL(y.derivative(i, j), T(1)); } else { - BOOST_CHECK_EQUAL(y.derivative(i, j), 0.0); + BOOST_CHECK_EQUAL(y.derivative(i, j), T(0)); } } } @@ -418,89 +418,89 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(dim1and2_multiplication, T, all_float_types) { BOOST_AUTO_TEST_CASE_TEMPLATE(dim2_addition, T, all_float_types) { constexpr std::size_t m = 2; constexpr std::size_t n = 3; - const T cx = 3.0; + const T cx = 3; const auto x = make_fvar(cx); BOOST_CHECK_EQUAL(x.derivative(0), cx); - BOOST_CHECK_EQUAL(x.derivative(1), 1.0); + BOOST_CHECK_EQUAL(x.derivative(1), T(1)); BOOST_CHECK_EQUAL(x.derivative(2), 0.0); - const T cy = 4.0; + const T cy = 4; const auto y = make_fvar(cy); BOOST_CHECK_EQUAL(static_cast(y.derivative(0)), cy); BOOST_CHECK_EQUAL(static_cast(y.derivative(1)), 0.0); // partial of y w.r.t. x. BOOST_CHECK_EQUAL(y.derivative(0, 0), cy); - BOOST_CHECK_EQUAL(y.derivative(0, 1), 1.0); + BOOST_CHECK_EQUAL(y.derivative(0, 1), T(1)); BOOST_CHECK_EQUAL(y.derivative(1, 0), 0.0); BOOST_CHECK_EQUAL(y.derivative(1, 1), 0.0); const auto z = x + y; BOOST_CHECK_EQUAL(z.derivative(0, 0), cx + cy); - BOOST_CHECK_EQUAL(z.derivative(0, 1), 1.0); - BOOST_CHECK_EQUAL(z.derivative(1, 0), 1.0); + BOOST_CHECK_EQUAL(z.derivative(0, 1), T(1)); + BOOST_CHECK_EQUAL(z.derivative(1, 0), T(1)); BOOST_CHECK_EQUAL(z.derivative(1, 1), 0.0); // The following 4 are unnecessarily more expensive than the previous 4. BOOST_CHECK_EQUAL(z.derivative(0).derivative(0), cx + cy); - BOOST_CHECK_EQUAL(z.derivative(0).derivative(1), 1.0); - BOOST_CHECK_EQUAL(z.derivative(1).derivative(0), 1.0); + BOOST_CHECK_EQUAL(z.derivative(0).derivative(1), T(1)); + BOOST_CHECK_EQUAL(z.derivative(1).derivative(0), T(1)); BOOST_CHECK_EQUAL(z.derivative(1).derivative(1), 0.0); } BOOST_AUTO_TEST_CASE_TEMPLATE(dim2_multiplication, T, all_float_types) { constexpr std::size_t m = 3; constexpr std::size_t n = 4; - const T cx = 6.0; + const T cx = 6; const auto x = make_fvar(cx); - const T cy = 5.0; + const T cy = 5; const auto y = make_fvar(cy); const auto z = x * x * y * y * y; BOOST_CHECK_EQUAL(z.derivative(0, 0), cx * cx * cy * cy * cy); // x^2 * y^3 BOOST_CHECK_EQUAL(z.derivative(0, 1), cx * cx * 3 * cy * cy); // x^2 * 3y^2 BOOST_CHECK_EQUAL(z.derivative(0, 2), cx * cx * 6 * cy); // x^2 * 6y BOOST_CHECK_EQUAL(z.derivative(0, 3), cx * cx * 6); // x^2 * 6 - BOOST_CHECK_EQUAL(z.derivative(0, 4), 0.0); // x^2 * 0 + BOOST_CHECK_EQUAL(z.derivative(0, 4), T(0)); // x^2 * 0 BOOST_CHECK_EQUAL(z.derivative(1, 0), 2 * cx * cy * cy * cy); // 2x * y^3 BOOST_CHECK_EQUAL(z.derivative(1, 1), 2 * cx * 3 * cy * cy); // 2x * 3y^2 BOOST_CHECK_EQUAL(z.derivative(1, 2), 2 * cx * 6 * cy); // 2x * 6y BOOST_CHECK_EQUAL(z.derivative(1, 3), 2 * cx * 6); // 2x * 6 - BOOST_CHECK_EQUAL(z.derivative(1, 4), 0.0); // 2x * 0 + BOOST_CHECK_EQUAL(z.derivative(1, 4), T(0)); // 2x * 0 BOOST_CHECK_EQUAL(z.derivative(2, 0), 2 * cy * cy * cy); // 2 * y^3 BOOST_CHECK_EQUAL(z.derivative(2, 1), 2 * 3 * cy * cy); // 2 * 3y^2 BOOST_CHECK_EQUAL(z.derivative(2, 2), 2 * 6 * cy); // 2 * 6y BOOST_CHECK_EQUAL(z.derivative(2, 3), 2 * 6); // 2 * 6 - BOOST_CHECK_EQUAL(z.derivative(2, 4), 0.0); // 2 * 0 - BOOST_CHECK_EQUAL(z.derivative(3, 0), 0.0); // 0 * y^3 - BOOST_CHECK_EQUAL(z.derivative(3, 1), 0.0); // 0 * 3y^2 - BOOST_CHECK_EQUAL(z.derivative(3, 2), 0.0); // 0 * 6y - BOOST_CHECK_EQUAL(z.derivative(3, 3), 0.0); // 0 * 6 - BOOST_CHECK_EQUAL(z.derivative(3, 4), 0.0); // 0 * 0 + BOOST_CHECK_EQUAL(z.derivative(2, 4), T(0)); // 2 * 0 + BOOST_CHECK_EQUAL(z.derivative(3, 0), T(0)); // 0 * y^3 + BOOST_CHECK_EQUAL(z.derivative(3, 1), T(0)); // 0 * 3y^2 + BOOST_CHECK_EQUAL(z.derivative(3, 2), T(0)); // 0 * 6y + BOOST_CHECK_EQUAL(z.derivative(3, 3), T(0)); // 0 * 6 + BOOST_CHECK_EQUAL(z.derivative(3, 4), T(0)); // 0 * 0 } BOOST_AUTO_TEST_CASE_TEMPLATE(dim2_multiplication_and_subtraction, T, all_float_types) { constexpr std::size_t m = 3; constexpr std::size_t n = 4; - const T cx = 6.0; + const T cx = 6; const auto x = make_fvar(cx); - const T cy = 5.0; + const T cy = 5; const auto y = make_fvar(cy); const auto z = x * x - y * y; BOOST_CHECK_EQUAL(z.derivative(0, 0), cx * cx - cy * cy); BOOST_CHECK_EQUAL(z.derivative(0, 1), -2 * cy); - BOOST_CHECK_EQUAL(z.derivative(0, 2), -2.0); - BOOST_CHECK_EQUAL(z.derivative(0, 3), 0.0); - BOOST_CHECK_EQUAL(z.derivative(0, 4), 0.0); + BOOST_CHECK_EQUAL(z.derivative(0, 2), T(-2)); + BOOST_CHECK_EQUAL(z.derivative(0, 3), T(0)); + BOOST_CHECK_EQUAL(z.derivative(0, 4), T(0)); BOOST_CHECK_EQUAL(z.derivative(1, 0), 2 * cx); - BOOST_CHECK_EQUAL(z.derivative(2, 0), 2.0); + BOOST_CHECK_EQUAL(z.derivative(2, 0), T(2)); for (auto i : boost::irange(std::size_t(1), m + 1)) { for (auto j : boost::irange(std::size_t(1), n + 1)) { - BOOST_CHECK_EQUAL(z.derivative(i, j), 0.0); + BOOST_CHECK_EQUAL(z.derivative(i, j), T(0)); } } } BOOST_AUTO_TEST_CASE_TEMPLATE(inverse, T, all_float_types) { constexpr std::size_t m = 3; - const T cx = 4.0; + const T cx = 4; const auto x = make_fvar(cx); const auto xinv = x.inverse(); BOOST_CHECK_EQUAL(xinv.derivative(0), 1 / cx); @@ -519,9 +519,9 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(inverse, T, all_float_types) { BOOST_AUTO_TEST_CASE_TEMPLATE(division, T, all_float_types) { constexpr std::size_t m = 3; constexpr std::size_t n = 4; - const T cx = 16.0; + const T cx = 16; auto x = make_fvar(cx); - const T cy = 4.0; + const T cy = 4; auto y = make_fvar(cy); auto z = x * x / (y * y); BOOST_CHECK_EQUAL(z.derivative(0, 0), cx * cx / (cy * cy)); // x^2 * y^-2 @@ -581,8 +581,8 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(division, T, all_float_types) { BOOST_AUTO_TEST_CASE_TEMPLATE(equality, T, all_float_types) { constexpr std::size_t m = 3; constexpr std::size_t n = 4; - const T cx = 10.0; - const T cy = 10.0; + const T cx = 10; + const T cy = 10; const auto x = make_fvar(cx); const auto y = make_fvar(cy); BOOST_CHECK_EQUAL(x, y); @@ -595,8 +595,8 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(equality, T, all_float_types) { BOOST_AUTO_TEST_CASE_TEMPLATE(inequality, T, all_float_types) { constexpr std::size_t m = 3; constexpr std::size_t n = 4; - const T cx = 10.0; - const T cy = 11.0; + const T cx = 10; + const T cy = 11; const auto x = make_fvar(cx); const auto y = make_fvar(cy); BOOST_CHECK_NE(x, y); @@ -609,8 +609,8 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(inequality, T, all_float_types) { BOOST_AUTO_TEST_CASE_TEMPLATE(less_than_or_equal_to, T, all_float_types) { constexpr std::size_t m = 3; constexpr std::size_t n = 4; - const T cx = 10.0; - const T cy = 11.0; + const T cx = 10; + const T cy = 11; const auto x = make_fvar(cx); const auto y = make_fvar(cy); BOOST_CHECK_LE(x, y); @@ -627,8 +627,8 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(less_than_or_equal_to, T, all_float_types) { BOOST_AUTO_TEST_CASE_TEMPLATE(greater_than_or_equal_to, T, all_float_types) { constexpr std::size_t m = 3; constexpr std::size_t n = 4; - const T cx = 11.0; - const T cy = 10.0; + const T cx = 11; + const T cy = 10; const auto x = make_fvar(cx); const auto y = make_fvar(cy); BOOST_CHECK_GE(x, y); @@ -647,28 +647,28 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(fabs_test, T, all_float_types) { using detail::fabs; using std::fabs; constexpr std::size_t m = 3; - const T cx = 11.0; + const T cx = 11; const auto x = make_fvar(cx); auto a = fabs(x); BOOST_CHECK_EQUAL(a.derivative(0), fabs(cx)); - BOOST_CHECK_EQUAL(a.derivative(1), 1.0); - BOOST_CHECK_EQUAL(a.derivative(2), 0.0); - BOOST_CHECK_EQUAL(a.derivative(3), 0.0); + BOOST_CHECK_EQUAL(a.derivative(1), T(1)); + BOOST_CHECK_EQUAL(a.derivative(2), T(0)); + BOOST_CHECK_EQUAL(a.derivative(3), T(0)); a = fabs(-x); BOOST_CHECK_EQUAL(a.derivative(0), fabs(cx)); - BOOST_CHECK_EQUAL(a.derivative(1), 1.0); // fabs(-x) = fabs(x) - BOOST_CHECK_EQUAL(a.derivative(2), 0.0); - BOOST_CHECK_EQUAL(a.derivative(3), 0.0); + BOOST_CHECK_EQUAL(a.derivative(1), T(1)); // fabs(-x) = fabs(x) + BOOST_CHECK_EQUAL(a.derivative(2), T(0)); + BOOST_CHECK_EQUAL(a.derivative(3), T(0)); const auto xneg = make_fvar(-cx); a = fabs(xneg); BOOST_CHECK_EQUAL(a.derivative(0), fabs(cx)); - BOOST_CHECK_EQUAL(a.derivative(1), -1.0); - BOOST_CHECK_EQUAL(a.derivative(2), 0.0); - BOOST_CHECK_EQUAL(a.derivative(3), 0.0); + BOOST_CHECK_EQUAL(a.derivative(1), -T(1)); + BOOST_CHECK_EQUAL(a.derivative(2), T(0)); + BOOST_CHECK_EQUAL(a.derivative(3), T(0)); const auto zero = make_fvar(0); a = fabs(zero); for (auto i : boost::irange(m + 1)) { - BOOST_CHECK_EQUAL(a.derivative(i), 0.0); + BOOST_CHECK_EQUAL(a.derivative(i), T(0)); } } @@ -678,7 +678,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(ceil_and_floor, T, all_float_types) { using std::ceil; using std::floor; constexpr std::size_t m = 3; - T tests[]{-1.5, 0.0, 1.5}; + T tests[]{T(-1.5), T(0.0), T(1.5)}; for (T &test : tests) { const auto x = make_fvar(test); auto c = ceil(x); @@ -686,8 +686,8 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(ceil_and_floor, T, all_float_types) { BOOST_CHECK_EQUAL(c.derivative(0), ceil(test)); BOOST_CHECK_EQUAL(f.derivative(0), floor(test)); for (auto i : boost::irange(std::size_t(1), m + 1)) { - BOOST_CHECK_EQUAL(c.derivative(i), 0.0); - BOOST_CHECK_EQUAL(f.derivative(i), 0.0); + BOOST_CHECK_EQUAL(c.derivative(i), T(0)); + BOOST_CHECK_EQUAL(f.derivative(i), T(0)); } } } diff --git a/test/test_autodiff_2.cpp b/test/test_autodiff_2.cpp index 30b517fed..f7700195d 100644 --- a/test/test_autodiff_2.cpp +++ b/test/test_autodiff_2.cpp @@ -15,9 +15,9 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(one_over_one_plus_x_squared, T, all_float_types) { f *= f; f += T(1); f = f.inverse(); - BOOST_CHECK_EQUAL(f.derivative(0u), 0.5); - BOOST_CHECK_EQUAL(f.derivative(1u), -0.5); - BOOST_CHECK_EQUAL(f.derivative(2u), 0.5); + BOOST_CHECK_EQUAL(f.derivative(0u), T(0.5)); + BOOST_CHECK_EQUAL(f.derivative(1u), T(-0.5)); + BOOST_CHECK_EQUAL(f.derivative(2u), T(0.5)); BOOST_CHECK_EQUAL(f.derivative(3u), 0); BOOST_CHECK_EQUAL(f.derivative(4u), -3); } @@ -25,14 +25,14 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(one_over_one_plus_x_squared, T, all_float_types) { BOOST_AUTO_TEST_CASE_TEMPLATE(exp_test, T, all_float_types) { using std::exp; constexpr std::size_t m = 4; - const T cx = 2.0; + const T cx = 2; const auto x = make_fvar(cx); auto y = exp(x); for (auto i : boost::irange(m + 1)) { // std::cout.precision(100); // std::cout << "y.derivative("<