Dear all,


I have encountered a problem while using Boost C++ libraries ( multiprecision/mpc.hpp, math/quadrature) which I cannot resolve.

This problems appears when running the following piece of code

    #include <boost/math/constants/constants.hpp>
    #include <boost/math/quadrature/exp_sinh.hpp>
    #include <boost/multiprecision/mpc.hpp>
    #include <boost/multiprecision/mpfr.hpp>
    #include <boost/math/special_functions/fpclassify.hpp>
    
    
    
    namespace mpns = boost::multiprecision; 
    
    typedef mpns::number<boost::multiprecision::mpc_complex_backend <50> > mpc_type ;
    typedef mpc_type::value_type mp_type ;
    
    int main()
    {
      using boost::math::constants::root_pi ;
    
      mpc_type z{mp_type(1),mp_type(1)} ;
    
      auto f = [&](mp_type x) 
      { 
        //actually I did not test if all these conditions are needed...
        if (boost::math::fpclassify<mp_type> (x) == FP_ZERO)
        {
          return mpc_type(mp_type(1)) ;
        };
    
        if (boost::math::fpclassify<mp_type> (x) == FP_INFINITE)
        {
          return mpc_type(mp_type(0)) ;
        };
    
        mp_type x2 = mpns::pow(x,2U) ;
    
        if (boost::math::fpclassify<mp_type> (x2) == FP_ZERO)
        {
          return mpc_type(mp_type(1)) ;
        };
    
        if (boost::math::fpclassify<mp_type> (x2) == FP_INFINITE)
        {
          return mpc_type(mp_type(0)) ;
        };
    
        mpc_type ex2 = mpns::exp(-z*x2) ;
    
        if (boost::math::fpclassify<mpc_type> (ex2) == FP_ZERO)
        {
          return mpc_type(mp_type(0)) ;
        };
    
        return ex2 ;
      } ;
    
      mp_type termination = boost::math::tools::root_epsilon <mp_type> () ;
      mp_type error;
      mp_type L1;
    
    
      size_t max_halvings = 12;
      boost::math::quadrature::exp_sinh<mp_type> integrator(max_halvings) ;
      mpc_type res = integrator.integrate(f,termination,&error,&L1) ;
      mpc_type div = 2U*mpns::sqrt(z) ;
      mpc_type result =  (mpc_type(root_pi<mp_type> ())/div) - res ;
      return 0;
    }

Namely, the problem appears when evaluating the exponent.

The code is compiled without any problems, but hangs on computing

    mpc_type ex2 = mpns::exp(-z*x2) ;

It was possible to go into the function while debugging.

It crashed eventually, when the compiler reached "unable to resolve non-existing file.../src/init2.c".

I let it run for a while checking the call stack. It appears that the programs is stuck at calling ___gmpn_sub_n_coreisbr().

Or better, in the call stuck it appeared frequently.


I did several tests.

The real-valued version (with mpfr_backend <2000>) works without any problems.

cpp_complex_backend <100> works fine, but I could not test higher precision yet, since it is much slower.

I found a work-around which is not ideal. Namely,

   mpc_type ex2 = mpc_type(mpns::exp(x2)) ; 
   mpc_type ezx2 = mpns::pow(ex2,-z) ;

works fine with mpc_complex_backend <2000>.

The lambda-function as it is declared in the code above works and yields correct numbers.

The problem appears when it is called from the integrator.


My system.

I use openSUSE Tumbeleweed.

I installed boost libraries as provided by boost_1_76_0-gnu-mpich-hpc-devel.

Complier -> g++, cppStandard gnu+17.

I check that I have all libs, e.g. libgmp, libmpc, libmpfr and etc.

All headers are present (the programs is complied without any warnings).


Thank you in advance and

Best wishes,

Kirill