...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
All of the statistical distributions in this library are class templates that accept two template parameters: real type (float, double ...) and policy (how to handle exceptional events), both with sensible defaults, for example:
namespace boost{ namespace math{ template <class RealType = double, class Policy = policies::policy<> > class fisher_f_distribution; typedef fisher_f_distribution<> fisher_f; }}
This policy gets used by all the accessor functions that accept a distribution
as an argument, and forwarded to all the functions called by these. So if
you use the shorthand-typedef for the distribution, then you get double
precision arithmetic and all the default
policies.
However, say for example we wanted to evaluate the quantile of the binomial distribution at float precision, without internal promotion to double, and with the result rounded to the nearest integer, then here's how it can be done:
#include <boost/math/distributions/binomial.hpp> using boost::math::binomial_distribution; // Begin by defining a policy type, that gives the behaviour we want: //using namespace boost::math::policies; or explicitly using boost::math::policies::policy; using boost::math::policies::promote_float; using boost::math::policies::discrete_quantile; using boost::math::policies::integer_round_nearest; typedef policy< promote_float<false>, // Do not promote to double. discrete_quantile<integer_round_nearest> // Round result to nearest integer. > mypolicy; // // Then define a new distribution that uses it: typedef boost::math::binomial_distribution<float, mypolicy> mybinom; // And now use it to get the quantile: int main() { cout << "quantile(mybinom(200, 0.25), 0.05) is: " << quantile(mybinom(200, 0.25), 0.05) << endl; }
Which outputs:
quantile is: 40