Boost logo

Boost Users :

From: Anirban Pal (anirban.pal.iitkgp_at_[hidden])
Date: 2020-08-21 01:18:12


Thank you for your response. I’ve run into a few more issues with accuracy.
Here is my function, which has a singularity at 0.5 and I'm integrating it
from 0.5 to sqrt(1.25):

using BF = boost::multiprecision::cpp_bin_float_100;

auto f1 = [](BF x) { return x/BF(sqrt(x*x-BF("0.25"))); };
BF Q1 = integrator.integrate(f1, BF("0.5"), BF(sqrt(BF("1.25"))));

This gives me a value of Q1 which is close to the true value of 1 with an
error of O(10^-51). I am curious if this should be lower, like O(10^-100).
(I hope I’m not being greedy!)

Nevertheless, if I try a related function.

auto f2 = [](BF x) { return x/BF(sqrt(x*x-BF("0.25"))) - x; };
BF Q2 = integrator.integrate(f2, BF("0.5"), BF(sqrt(BF("1.25"))));

or an equivalent one:

auto f3 = [](BF x) { return (x - x*BF(sqrt(x*x-BF("0.25")))
)/BF(sqrt(x*x-BF("0.25"))); };
BF Q3 = integrator.integrate(f3, BF("0.5"), BF(sqrt(BF("1.25"))));

I get an error message:

boost_test5: /usr/local/include/boost/math/quadrature/tanh_sinh.hpp:196:
boost::math::quadrature::tanh_sinh<Real, Policy>::integrate(F, Real,
Real, Real, Real*, Real*, std::size_t*)::<lambda(Real, Real)> [with F
= main(int, char**)::<lambda(BF)>; Real =
boost::multiprecision::number<boost::multiprecision::backends::cpp_bin_float<100>
>; Policy = boost::math::policies::policy<boost::math::policies::default_policy,
boost::math::policies::default_policy,
boost::math::policies::default_policy,
boost::math::policies::default_policy,
boost::math::policies::default_policy,
boost::math::policies::default_policy,
boost::math::policies::default_policy,
boost::math::policies::default_policy,
boost::math::policies::default_policy,
boost::math::policies::default_policy,
boost::math::policies::default_policy>; result_type =
boost::multiprecision::number<boost::multiprecision::backends::cpp_bin_float<100>
>]: Assertion `position != a' failed.
Aborted (core dumped)

I'm not sure how I could improve my code. I tried using
boost::multiprecision::sqrt but i didn't notice any difference.

Thank you for your attention.

On Mon, 17 Aug 2020 at 04:47, Paul A. Bristow via Boost-users
boost-users_at_[hidden] <http://mailto:boost-users@lists.boost.org>
wrote:

>
> > -----Original Message-----
> > From: Boost-users <boost-users-bounces_at_[hidden]> On Behalf Of
> John Maddock via Boost-users
> > Sent: 16 August 2020 21:24
> > To: Anirban Pal via Boost-users <boost-users_at_[hidden]>
> > Cc: John Maddock <jz.maddock_at_[hidden]>
> > Subject: Re: [Boost-users] limited accuracy for tanh-sinh integrator
> >
> >
> > On 16/08/2020 21:15, Anirban Pal via Boost-users wrote:
> > >
> > > Hello,
> > >
> > > I’m using the tanh-sinh integrator to integrate a simple function f(x)
> > > = 0.26*x from 3.0 to 4.0.
> > > The exact result is 0.91. With the integrator I’m getting a result
> > > accurate to only 10^-18 with cpp_bin_float_100 multiprecision.
> > >
> > You have the double precision constant 0.26 in your code, and since this
> is an inexact binary value,
> > everything that depends on that constant is inherently limited to double
> precision. Try constructing it
> > as Real(26) / 100.
>
> Everyone falls into this pit, and in my case, repeatedly ☹
>
> You need to be ever vigilant not to use double precision items by mistake.
>
> Using numeric_limits<>::max_digits10 is useful because it shows the digits
> beyond double at about 17 decimal digits. Being random should raise
> suspicions.
>
> If you are only using multiprecision types, then always using decimal
> digit strings like "1.23456" is simple.
>
> If you can use a fraction like Real(1)/1000 that also works fine.
>
> You may also find the macro BOOST_MATH_TEST_VALUE in
> I:\boost\libs\math\test\test_value.hpp helpful if you want to make code
> portable over different floating-point types from fundamental to
> multiprecision?
>
> Paul
>
>
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> https://lists.boost.org/mailman/listinfo.cgi/boost-users
>

-- 
Anirban Pal


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net