...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
There are two equivalent policies that effect the working precision used to calculate results, these policies both default to 0 - meaning calculate to the maximum precision available in the type being used - but can be set to other values to cause lower levels of precision to be used. One might want to trade precision for evaluation speed.
namespace boost{ namespace math{ namespace policies{ template <int N> digits10; template <int N> digits2; }}} // namespaces
As you would expect, digits10 specifies the number of decimal digits to use, and digits2 the number of binary digits. Internally, whichever is used, the precision is always converted to binary digits.
These policies are specified at compile-time, because many of the special functions use compile-time-dispatch to select which approximation to use based on the precision requested and the numeric type being used.
For example we could calculate tgamma
to approximately 5 decimal digits using:
#include <boost/math/special_functions/gamma.hpp> using boost::math::tgamma; using boost::math::policies::policy; using boost::math::policies::digits10; typedef policy<digits10<5> > my_pol_5; // Define a new, non-default, policy // to calculate tgamma to accuracy of approximately 5 decimal digits.
Or again using helper function make_policy
:
#include <boost/math/special_functions/gamma.hpp> using boost::math::tgamma; using namespace boost::math::policies; double t = tgamma(12, policy<digits10<5> >()); // Concise make_policy.
And for a quantile of a distribution to approximately 25-bit precision:
#include <boost/math/distributions/normal.hpp> using boost::math::normal_distribution; using namespace boost::math::policies; const int bits = 25; // approximate precision. double q = quantile( normal_distribution<double, policy<digits2<bits> > >(), 0.05); // 5% quantile.