Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Failing gamma_p_inv() test case (when Briggs algos used) #148

Open
ckormanyos opened this issue Feb 1, 2023 · 0 comments
Open

Failing gamma_p_inv() test case (when Briggs algos used) #148

ckormanyos opened this issue Feb 1, 2023 · 0 comments

Comments

@ckormanyos
Copy link
Member

The following test (and other similar tests) fails on gamma_p_inv() for cpp_double_double when Briggs-style algorithms are used.

For cpp_double_double we get NaN, whereby the expected small-valued result should simply be zero for this type.

#include <iomanip>
#include <iostream>
#include <string>

#include <boost/math/special_functions/gamma.hpp>
#include <boost/multiprecision/cpp_double_fp.hpp>
#include <boost/multiprecision/cpp_dec_float.hpp>

#if defined(SC_)
#undef SC_
#endif

#define SC_(x) std::string( BOOST_STRINGIZE(x) )

int main()
{
  using boost::multiprecision::cpp_double_double;

  using float_type = typename cpp_double_double::backend_type::float_type;

  using dec_float_type = boost::multiprecision::number<boost::multiprecision::cpp_dec_float<31>, boost::multiprecision::et_off>;

  // Test case for gamma_p_inv.
  const std::string nums_as_str[] = { SC_(0.1730655412757187150418758392333984375e-5), SC_(0.12698681652545928955078125), SC_(0.2239623606222809074122747811596115646210220735131141509259977248899758059576948436798908594057794725e-517862), SC_(0.4348301951174619607003912855228982264838968134589390827069898370149065135278987288014463439625604227e-34079) };

  const auto a1 = cpp_double_double(nums_as_str[0U]);
  const auto p1 = cpp_double_double(nums_as_str[1U]);

  const auto a2 = dec_float_type(nums_as_str[0U]);
  const auto p2 = dec_float_type(nums_as_str[1U]);

  const auto gp1 = boost::math::gamma_p_inv(a1, p1);
  const auto gp2 = boost::math::gamma_p_inv(a2, p2);

  const auto ctrl1 = cpp_double_double(nums_as_str[2U]);
  const auto ctrl2 = dec_float_type   (nums_as_str[2U]);

  const auto delta1 = cpp_double_double(fabs(1 - fabs(gp1 / ctrl1)));
  const auto delta2 = dec_float_type   (fabs(1 - fabs(gp2 / ctrl2)));

  const auto flg = std::cout.flags();

  std::cout << std::setprecision(static_cast<std::streamsize>(std::numeric_limits<cpp_double_double>::digits10)) << gp1 << std::endl;
  std::cout << std::setprecision(static_cast<std::streamsize>(std::numeric_limits<dec_float_type   >::digits10)) << gp2 << std::endl;

  std::cout << std::setprecision(static_cast<std::streamsize>(std::numeric_limits<cpp_double_double>::digits10)) << ctrl1 << std::endl;
  std::cout << std::setprecision(static_cast<std::streamsize>(std::numeric_limits<dec_float_type   >::digits10)) << ctrl2 << std::endl;

  std::cout << std::setprecision(static_cast<std::streamsize>(std::numeric_limits<cpp_double_double>::digits10)) << delta1 << std::endl;
  std::cout << std::setprecision(static_cast<std::streamsize>(std::numeric_limits<dec_float_type   >::digits10)) << delta2 << std::endl;

  std::cout.flags(flg);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant