From 1e47518075ab9293199f4525a0dbb5f4f03d1159 Mon Sep 17 00:00:00 2001 From: Matt Borland Date: Sat, 11 Feb 2023 09:16:32 -0800 Subject: [PATCH 1/2] Fix for scipy issue 15101 --- include/boost/math/special_functions/beta.hpp | 2 +- test/Jamfile.v2 | 1 + test/scipy_issue_15101.cpp | 33 +++++++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 test/scipy_issue_15101.cpp diff --git a/include/boost/math/special_functions/beta.hpp b/include/boost/math/special_functions/beta.hpp index 574dd3021..f0212800c 100644 --- a/include/boost/math/special_functions/beta.hpp +++ b/include/boost/math/special_functions/beta.hpp @@ -373,7 +373,7 @@ T ibeta_power_terms(T a, if(a < b) { T p1 = pow(b2, b / a); - T l3 = a * (log(b1) + log(p1)); + T l3 = (b1 != 0) && (p1 != 0) ? (a * (log(b1) + log(p1))) : tools::max_value(); // arbitrary large value if the logs would fail! if((l3 < tools::log_max_value()) && (l3 > tools::log_min_value())) { diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 36f56d56d..ad373bd39 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -894,6 +894,7 @@ test-suite distribution_tests : [ run git_issue_800.cpp ../../test/build//boost_unit_test_framework ] [ run git_issue_845.cpp ../../test/build//boost_unit_test_framework ] [ run scipy_issue_14901.cpp ../../test/build//boost_unit_test_framework ] + [ run scipy_issue_15101.cpp ../../test/build//boost_unit_test_framework ] [ run scipy_issue_17146.cpp ../../test/build//boost_unit_test_framework ] [ run scipy_issue_17388.cpp ../../test/build//boost_unit_test_framework ] [ run scipy_issue_17916.cpp ../../test/build//boost_unit_test_framework ] diff --git a/test/scipy_issue_15101.cpp b/test/scipy_issue_15101.cpp new file mode 100644 index 000000000..4494aa01c --- /dev/null +++ b/test/scipy_issue_15101.cpp @@ -0,0 +1,33 @@ +// Copyright Matt Borland, 2023 +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE or copy at http://www.boost.org/LICENSE_1_0.txt) + +#define BOOST_MATH_DOMAIN_ERROR_POLICY ignore_error +#define BOOST_MATH_OVERFLOW_ERROR_POLICY ignore_error +#define BOOST_MATH_PROMOTE_DOUBLE_POLICY false + +#include +#include +#include +#include +#include "math_unit_test.hpp" + +#pragma STDC FENV_ACCESS ON + +int main() +{ + constexpr double n {2000}; + constexpr double p {0.9999}; + const auto binom_dist = boost::math::binomial_distribution(n, p); + const auto pdf1 = boost::math::pdf(binom_dist, 3); + + CHECK_ULP_CLOSE(pdf1, 0, 1); + + if (std::fetestexcept(FE_DIVBYZERO)) + { + return 1; + } + + return boost::math::test::report_errors(); +} From a26b1045dee282ad9660c268a2e1e3d59fad4e1e Mon Sep 17 00:00:00 2001 From: Matt Borland Date: Sat, 11 Feb 2023 09:56:08 -0800 Subject: [PATCH 2/2] Fix expected value's type for MSVC --- test/scipy_issue_15101.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/scipy_issue_15101.cpp b/test/scipy_issue_15101.cpp index 4494aa01c..b3bf01a4f 100644 --- a/test/scipy_issue_15101.cpp +++ b/test/scipy_issue_15101.cpp @@ -22,7 +22,7 @@ int main() const auto binom_dist = boost::math::binomial_distribution(n, p); const auto pdf1 = boost::math::pdf(binom_dist, 3); - CHECK_ULP_CLOSE(pdf1, 0, 1); + CHECK_ULP_CLOSE(pdf1, 0.0, 1); if (std::fetestexcept(FE_DIVBYZERO)) {