diff --git a/include/boost/math/special_functions/jacobi_elliptic.hpp b/include/boost/math/special_functions/jacobi_elliptic.hpp index 114b991d9..149e9fb1c 100644 --- a/include/boost/math/special_functions/jacobi_elliptic.hpp +++ b/include/boost/math/special_functions/jacobi_elliptic.hpp @@ -41,9 +41,7 @@ T jacobi_imp(const T& x, const T& k, T* cn, T* dn, const Policy& pol, const char BOOST_MATH_STD_USING if(k < 0) { - *cn = policies::raise_domain_error(function, "Modulus k must be positive but got %1%.", k, pol); - *dn = *cn; - return *cn; + return *dn = *cn = policies::raise_domain_error(function, "Modulus k must be positive but got %1%.", k, pol); } if(k > 1) { diff --git a/test/test_jacobi.hpp b/test/test_jacobi.hpp index 186def46b..ce2ec9c4e 100644 --- a/test/test_jacobi.hpp +++ b/test/test_jacobi.hpp @@ -186,5 +186,33 @@ void test_spots(T, const char* type_name) BOOST_CHECK_CLOSE_FRACTION(boost::math::jacobi_sn(T(0.5), T(0.5)), static_cast(0.475082936028536510082218324703870258745078171807428948028252L), tol); BOOST_CHECK_CLOSE_FRACTION(boost::math::jacobi_sn(T(0.5), T(0.5), pol), static_cast(0.475082936028536510082218324703870258745078171807428948028252L), tol); + // + // Bug cases and coverage: + // +#ifndef BOOST_MATH_NO_EXCEPTIONS + BOOST_CHECK_THROW(boost::math::jacobi_cd(T(-0.5), T(0.5)), std::domain_error); + BOOST_CHECK_THROW(boost::math::jacobi_cn(T(-0.5), T(0.5)), std::domain_error); + BOOST_CHECK_THROW(boost::math::jacobi_cs(T(-0.5), T(0.5)), std::domain_error); + BOOST_CHECK_THROW(boost::math::jacobi_dn(T(-0.5), T(0.5)), std::domain_error); + BOOST_CHECK_THROW(boost::math::jacobi_ds(T(-0.5), T(0.5)), std::domain_error); + BOOST_CHECK_THROW(boost::math::jacobi_nc(T(-0.5), T(0.5)), std::domain_error); + BOOST_CHECK_THROW(boost::math::jacobi_nd(T(-0.5), T(0.5)), std::domain_error); + BOOST_CHECK_THROW(boost::math::jacobi_ns(T(-0.5), T(0.5)), std::domain_error); + BOOST_CHECK_THROW(boost::math::jacobi_sc(T(-0.5), T(0.5)), std::domain_error); + BOOST_CHECK_THROW(boost::math::jacobi_sd(T(-0.5), T(0.5)), std::domain_error); + BOOST_CHECK_THROW(boost::math::jacobi_sn(T(-0.5), T(0.5)), std::domain_error); +#else + BOOST_CHECK((boost::math::isnan)(boost::math::jacobi_cd(T(-0.5), T(0.5)))); + BOOST_CHECK((boost::math::isnan)(boost::math::jacobi_cn(T(-0.5), T(0.5)))); + BOOST_CHECK((boost::math::isnan)(boost::math::jacobi_cs(T(-0.5), T(0.5)))); + BOOST_CHECK((boost::math::isnan)(boost::math::jacobi_dn(T(-0.5), T(0.5)))); + BOOST_CHECK((boost::math::isnan)(boost::math::jacobi_ds(T(-0.5), T(0.5)))); + BOOST_CHECK((boost::math::isnan)(boost::math::jacobi_nc(T(-0.5), T(0.5)))); + BOOST_CHECK((boost::math::isnan)(boost::math::jacobi_nd(T(-0.5), T(0.5)))); + BOOST_CHECK((boost::math::isnan)(boost::math::jacobi_ns(T(-0.5), T(0.5)))); + BOOST_CHECK((boost::math::isnan)(boost::math::jacobi_sc(T(-0.5), T(0.5)))); + BOOST_CHECK((boost::math::isnan)(boost::math::jacobi_sd(T(-0.5), T(0.5)))); + BOOST_CHECK((boost::math::isnan)(boost::math::jacobi_sn(T(-0.5), T(0.5)))); +#endif }