]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/math/example/error_policies_example.cpp
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / boost / libs / math / example / error_policies_example.cpp
CommitLineData
7c673cae
FG
1// error_policies_example.cpp
2
3// Copyright Paul A. Bristow 2007, 2010.
4// Copyright John Maddock 2007.
5
6// Use, modification and distribution are subject to the
7// Boost Software License, Version 1.0.
8// (See accompanying file LICENSE_1_0.txt
9// or copy at http://www.boost.org/LICENSE_1_0.txt)
10
11#include <boost/math/distributions/normal.hpp>
12 using boost::math::normal_distribution;
13
14#include <boost/math/distributions/students_t.hpp>
15 using boost::math::students_t; // Probability of students_t(df, t).
16 using boost::math::students_t_distribution;
17
18// using namespace boost::math; causes:
19//.\error_policy_normal.cpp(30) : error C2872: 'policy' : ambiguous symbol
20// could be '\boost/math/policies/policy.hpp(392) : boost::math::policies::policy'
21// or 'boost::math::policies'
22
23// So should not use this 'using namespace boost::math;' command.
24
25// Suppose we want a statistical distribution to return infinities,
26// rather than throw exceptions (the default policy), then we can use:
27
28// std
29#include <iostream>
30 using std::cout;
31 using std::endl;
32
33// using namespace boost::math::policies; or
34
35using boost::math::policies::policy;
36// Possible errors
37using boost::math::policies::overflow_error;
38using boost::math::policies::underflow_error;
39using boost::math::policies::domain_error;
40using boost::math::policies::pole_error;
41using boost::math::policies::denorm_error;
42using boost::math::policies::evaluation_error;
43using boost::math::policies::ignore_error;
44
45// Define a custom policy to ignore just overflow:
46typedef policy<
47overflow_error<ignore_error>
48 > my_policy;
49
50// Define another custom policy (perhaps ill-advised?)
51// to ignore all errors: domain, pole, overflow, underflow, denorm & evaluation:
52typedef policy<
53domain_error<ignore_error>,
54pole_error<ignore_error>,
55overflow_error<ignore_error>,
56underflow_error<ignore_error>,
57denorm_error<ignore_error>,
58evaluation_error<ignore_error>
59 > my_ignoreall_policy;
60
61// Define a new distribution with a custom policy to ignore_error
62// (& thus perhaps return infinity for some arguments):
63typedef boost::math::normal_distribution<double, my_policy> my_normal;
64// Note: uses default parameters zero mean and unit standard deviation.
65
66// We could also do the same for another distribution, for example:
67using boost::math::students_t_distribution;
68typedef students_t_distribution<double, my_ignoreall_policy> my_students_t;
69
70int main()
71{
72 cout << "quantile(my_normal(), 0.05); = " << quantile(my_normal(), 0.05) << endl; // 0.05 is argument within normal range.
73 cout << "quantile(my_normal(), 0.); = " << quantile(my_normal(), 0.) << endl; // argument zero, so expect infinity.
74 cout << "quantile(my_normal(), 0.); = " << quantile(my_normal(), 0.F) << endl; // argument zero, so expect infinity.
75
76 cout << "quantile(my_students_t(), 0.); = " << quantile(my_students_t(-1), 0.F) << endl; // 'bad' argument negative, so expect NaN.
77
78#ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
79 // Construct a (0, 1) normal distribution that ignores all errors,
80 // returning NaN, infinity, zero, or best guess,
81 // and NOT setting errno.
82 normal_distribution<long double, my_ignoreall_policy> my_normal2(0.L, 1.L); // explicit parameters for distribution.
83 cout << "quantile(my_normal2(), 0.); = " << quantile(my_normal2, 0.01) << endl; // argument 0.01, so result finite.
84 cout << "quantile(my_normal2(), 0.); = " << quantile(my_normal2, 0.) << endl; // argument zero, so expect infinity.
85#endif
86
87 return 0;
88}
89
90/*
91
92Output:
93
94error_policies_example.cpp
95 Generating code
96 Finished generating code
97 error_policy_normal_example.vcxproj -> J:\Cpp\MathToolkit\test\Math_test\Release\error_policies_example.exe
98 quantile(my_normal(), 0.05); = -1.64485
99 quantile(my_normal(), 0.); = -1.#INF
100 quantile(my_normal(), 0.); = -1.#INF
101 quantile(my_students_t(), 0.); = 1.#QNAN
102 quantile(my_normal2(), 0.); = -2.32635
103 quantile(my_normal2(), 0.); = -1.#INF
104
105*/