diff --git a/include/boost/math/distributions/non_central_t.hpp b/include/boost/math/distributions/non_central_t.hpp index 1c1c54d06..cc33128c7 100644 --- a/include/boost/math/distributions/non_central_t.hpp +++ b/include/boost/math/distributions/non_central_t.hpp @@ -578,11 +578,11 @@ namespace boost BOOST_MATH_STD_USING if ((boost::math::isinf)(v)) { - return 3; + return 1; } if (delta == 0) { // == Student's t - return 3; + return 1; } T mean = boost::math::detail::mean(v, delta, pol); T l2 = delta * delta; @@ -592,6 +592,7 @@ namespace boost result *= -mean * mean; result += v * v * (l2 * l2 + 6 * l2 + 3) / ((v - 4) * (v - 2)); result /= var * var; + result -= static_cast(3); return result; } diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 1d0d21013..17aa8484a 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -889,7 +889,7 @@ test-suite distribution_tests : [ run complex_test.cpp ../../test/build//boost_unit_test_framework ] [ compile test_dist_deduction_guides.cpp : [ requires cpp_deduction_guides cpp_variadic_templates ] ] - + [ run git_issue_800.cpp ../../test/build//boost_unit_test_framework ] ; test-suite mp : diff --git a/test/git_issue_800.cpp b/test/git_issue_800.cpp new file mode 100644 index 000000000..64d3f012c --- /dev/null +++ b/test/git_issue_800.cpp @@ -0,0 +1,33 @@ +// Copyright Matt Borland, 2022 +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include "math_unit_test.hpp" +#include + +template +void test() +{ + boost::math::non_central_t_distribution nct(T(10), T(3)); + + // https://www.wolframalpha.com/input?i2d=true&i=N%5C%2891%29Kurtosis%5C%2891%29NoncentralStudentTDistribution%5C%2891%2910%5C%2844%29+3%5C%2893%29%5C%2893%29%5C%2844%2930%5C%2893%29 + CHECK_MOLLIFIED_CLOSE(boost::math::kurtosis(nct), T(5.44234533171835241424739188827L), 1e-6); + + boost::math::non_central_t_distribution nct0(T(10), T(0)); + + // https://www.wolframalpha.com/input?i2d=true&i=Kurtosis%5C%2891%29NoncentralStudentTDistribution%5C%2891%2910%5C%2844%29+0%5C%2893%29%5C%2893%29 + CHECK_ULP_CLOSE(boost::math::kurtosis(nct0), T(4), 1); + + // https://www.wolframalpha.com/input?i2d=true&i=ExcessKurtosis%5C%2891%29NoncentralStudentTDistribution%5C%2891%2910%5C%2844%29+0%5C%2893%29%5C%2893%29 + CHECK_ULP_CLOSE(boost::math::kurtosis_excess(nct0), T(1), 1); +} + +int main(void) +{ + test(); + test(); + test(); + + return boost::math::test::report_errors(); +} diff --git a/test/test_nc_t.hpp b/test/test_nc_t.hpp index c7f13576b..42f10f9b3 100644 --- a/test/test_nc_t.hpp +++ b/test/test_nc_t.hpp @@ -107,7 +107,7 @@ RealType naive_kurtosis_excess(RealType v, RealType delta) / ((-4 + v) * (-2 + v)); r /= (1 + delta*delta)*v / (-2 + v) - delta*delta*v *tgr*tgr / 2; r /= (1 + delta*delta)*v / (-2 + v) - delta*delta*v *tgr*tgr / 2; - return r; + return r - static_cast(3); } float naive_kurtosis_excess(float v, float delta) @@ -139,7 +139,7 @@ void test_spot( BOOST_CHECK_CLOSE( skewness(dist), naive_skewness(df, ncp), tol * 10 * tolerance_tgamma_extra); BOOST_CHECK_CLOSE( - kurtosis_excess(dist), naive_kurtosis_excess(df, ncp), tol * 50 * tolerance_tgamma_extra); + kurtosis_excess(dist), naive_kurtosis_excess(df, ncp), tol * 350 * tolerance_tgamma_extra); BOOST_CHECK_CLOSE( kurtosis(dist), 3 + naive_kurtosis_excess(df, ncp), tol * 50 * tolerance_tgamma_extra); } @@ -517,8 +517,8 @@ void test_big_df(RealType) BOOST_CHECK_EQUAL(variance(maxdf), 1); BOOST_CHECK_EQUAL(skewness(infdf), 0); BOOST_CHECK_EQUAL(skewness(maxdf), 0); - BOOST_CHECK_EQUAL(kurtosis_excess(infdf), 3); - BOOST_CHECK_CLOSE_FRACTION(kurtosis_excess(maxdf), static_cast(3), tolerance); + BOOST_CHECK_EQUAL(kurtosis_excess(infdf), 1); + BOOST_CHECK_CLOSE_FRACTION(kurtosis_excess(maxdf), static_cast(1), tolerance); // Bad df examples. #ifndef BOOST_NO_EXCEPTIONS