]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/math/doc/html/math_toolkit/pol_tutorial/namespace_policies.html
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / boost / libs / math / doc / html / math_toolkit / pol_tutorial / namespace_policies.html
1 <html>
2 <head>
3 <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
4 <title>Setting Policies at Namespace or Translation Unit Scope</title>
5 <link rel="stylesheet" href="../../math.css" type="text/css">
6 <meta name="generator" content="DocBook XSL Stylesheets V1.77.1">
7 <link rel="home" href="../../index.html" title="Math Toolkit 2.5.1">
8 <link rel="up" href="../pol_tutorial.html" title="Policy Tutorial">
9 <link rel="prev" href="ad_hoc_sf_policies.html" title="Changing the Policy on an Ad Hoc Basis for the Special Functions">
10 <link rel="next" href="user_def_err_pol.html" title="Calling User Defined Error Handlers">
11 </head>
12 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
13 <table cellpadding="2" width="100%"><tr>
14 <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td>
15 <td align="center"><a href="../../../../../../index.html">Home</a></td>
16 <td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td>
17 <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
18 <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
19 <td align="center"><a href="../../../../../../more/index.htm">More</a></td>
20 </tr></table>
21 <hr>
22 <div class="spirit-nav">
23 <a accesskey="p" href="ad_hoc_sf_policies.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../pol_tutorial.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="user_def_err_pol.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
24 </div>
25 <div class="section">
26 <div class="titlepage"><div><div><h3 class="title">
27 <a name="math_toolkit.pol_tutorial.namespace_policies"></a><a class="link" href="namespace_policies.html" title="Setting Policies at Namespace or Translation Unit Scope">Setting
28 Policies at Namespace or Translation Unit Scope</a>
29 </h3></div></div></div>
30 <p>
31 Sometimes what you want to do is just change a set of policies within the
32 current scope: <span class="bold"><strong>the one thing you should not do in this
33 situation is use the configuration macros</strong></span>, as this can lead to
34 "One Definition Rule" violations. Instead this library provides
35 a pair of macros especially for this purpose.
36 </p>
37 <p>
38 Let's consider the special functions first: we can declare a set of forwarding
39 functions that all use a specific policy using the macro BOOST_MATH_DECLARE_SPECIAL_FUNCTIONS(<span class="emphasis"><em>Policy</em></span>).
40 This macro should be used either inside a unique namespace set aside for
41 the purpose (for example, a C namespace for a C-style policy), or an unnamed
42 namespace if you just want the functions visible in global scope for the
43 current file only.
44 </p>
45 <p>
46 Suppose we want <code class="computeroutput"><span class="identifier">C</span><span class="special">::</span><span class="identifier">foo</span><span class="special">()</span></code> to
47 behave in a C-compatible way and set <code class="computeroutput"><span class="special">::</span><span class="identifier">errno</span></code> on error rather than throwing any
48 exceptions.
49 </p>
50 <p>
51 We'll begin by including the needed header for our function:
52 </p>
53 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">math</span><span class="special">/</span><span class="identifier">special_functions</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
54 <span class="comment">//using boost::math::tgamma; // Not needed because using C::tgamma.</span>
55 </pre>
56 <p>
57 Open up the "C" namespace that we'll use for our functions, and
58 define the policy type we want: in this case a C-style one that sets ::errno
59 and returns a standard value, rather than throwing exceptions.
60 </p>
61 <p>
62 Any policies we don't specify here will inherit the defaults.
63 </p>
64 <pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">C</span>
65 <span class="special">{</span> <span class="comment">// To hold our C-style policy.</span>
66 <span class="comment">//using namespace boost::math::policies; or explicitly:</span>
67 <span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">policies</span><span class="special">::</span><span class="identifier">policy</span><span class="special">;</span>
68
69 <span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">policies</span><span class="special">::</span><span class="identifier">domain_error</span><span class="special">;</span>
70 <span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">policies</span><span class="special">::</span><span class="identifier">pole_error</span><span class="special">;</span>
71 <span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">policies</span><span class="special">::</span><span class="identifier">overflow_error</span><span class="special">;</span>
72 <span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">policies</span><span class="special">::</span><span class="identifier">evaluation_error</span><span class="special">;</span>
73 <span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">policies</span><span class="special">::</span><span class="identifier">errno_on_error</span><span class="special">;</span>
74
75 <span class="keyword">typedef</span> <span class="identifier">policy</span><span class="special">&lt;</span>
76 <span class="identifier">domain_error</span><span class="special">&lt;</span><span class="identifier">errno_on_error</span><span class="special">&gt;,</span>
77 <span class="identifier">pole_error</span><span class="special">&lt;</span><span class="identifier">errno_on_error</span><span class="special">&gt;,</span>
78 <span class="identifier">overflow_error</span><span class="special">&lt;</span><span class="identifier">errno_on_error</span><span class="special">&gt;,</span>
79 <span class="identifier">evaluation_error</span><span class="special">&lt;</span><span class="identifier">errno_on_error</span><span class="special">&gt;</span>
80 <span class="special">&gt;</span> <span class="identifier">c_policy</span><span class="special">;</span>
81 </pre>
82 <p>
83 All we need do now is invoke the BOOST_MATH_DECLARE_SPECIAL_FUNCTIONS macro
84 passing our policy type c_policy as the single argument:
85 </p>
86 <pre class="programlisting"><span class="identifier">BOOST_MATH_DECLARE_SPECIAL_FUNCTIONS</span><span class="special">(</span><span class="identifier">c_policy</span><span class="special">)</span>
87
88 <span class="special">}</span> <span class="comment">// close namespace C</span>
89 </pre>
90 <p>
91 We now have a set of forwarding functions defined in namespace C that all
92 look something like this:
93 </p>
94 <pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">RealType</span><span class="special">&gt;</span>
95 <span class="keyword">inline</span> <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">tools</span><span class="special">::</span><span class="identifier">promote_args</span><span class="special">&lt;</span><span class="identifier">RT</span><span class="special">&gt;::</span><span class="identifier">type</span>
96 <span class="identifier">tgamma</span><span class="special">(</span><span class="identifier">RT</span> <span class="identifier">z</span><span class="special">)</span>
97 <span class="special">{</span>
98 <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">tgamma</span><span class="special">(</span><span class="identifier">z</span><span class="special">,</span> <span class="identifier">c_policy</span><span class="special">());</span>
99 <span class="special">}</span>
100 </pre>
101 <p>
102 So that when we call <code class="computeroutput"><span class="identifier">C</span><span class="special">::</span><span class="identifier">tgamma</span><span class="special">(</span><span class="identifier">z</span><span class="special">)</span></code>, we
103 really end up calling <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">tgamma</span><span class="special">(</span><span class="identifier">z</span><span class="special">,</span>
104 <span class="identifier">C</span><span class="special">::</span><span class="identifier">c_policy</span><span class="special">())</span></code>:
105 </p>
106 <pre class="programlisting"><span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
107 <span class="special">{</span>
108 <span class="identifier">errno</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
109 <span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"Result of tgamma(30000) is: "</span>
110 <span class="special">&lt;&lt;</span> <span class="identifier">C</span><span class="special">::</span><span class="identifier">tgamma</span><span class="special">(</span><span class="number">30000</span><span class="special">)</span> <span class="special">&lt;&lt;</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// Note using C::tgamma</span>
111 <span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"errno = "</span> <span class="special">&lt;&lt;</span> <span class="identifier">errno</span> <span class="special">&lt;&lt;</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// errno = 34</span>
112 <span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"Result of tgamma(-10) is: "</span>
113 <span class="special">&lt;&lt;</span> <span class="identifier">C</span><span class="special">::</span><span class="identifier">tgamma</span><span class="special">(-</span><span class="number">10</span><span class="special">)</span> <span class="special">&lt;&lt;</span> <span class="identifier">endl</span><span class="special">;</span>
114 <span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"errno = "</span> <span class="special">&lt;&lt;</span> <span class="identifier">errno</span> <span class="special">&lt;&lt;</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// errno = 33, overwriting previous value of 34.</span>
115 <span class="special">}</span>
116 </pre>
117 <p>
118 Which outputs:
119 </p>
120 <pre class="programlisting">Result of C::tgamma(30000) is: 1.#INF
121 errno = 34
122 Result of C::tgamma(-10) is: 1.#QNAN
123 errno = 33
124 </pre>
125 <p>
126 This mechanism is particularly useful when we want to define a project-wide
127 policy, and don't want to modify the Boost source, or to set project wide
128 build macros (possibly fragile and easy to forget).
129 </p>
130 <p>
131 The same mechanism works well at file scope as well, by using an unnamed
132 namespace, we can ensure that these declarations don't conflict with any
133 alternate policies present in other translation units:
134 </p>
135 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">math</span><span class="special">/</span><span class="identifier">special_functions</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
136 <span class="comment">// using boost::math::tgamma; // Would create an ambiguity between</span>
137 <span class="comment">// 'double boost::math::tgamma&lt;int&gt;(T)' and</span>
138 <span class="comment">// 'double 'anonymous-namespace'::tgamma&lt;int&gt;(RT)'.</span>
139
140 <span class="keyword">namespace</span> <span class="identifier">mymath</span>
141 <span class="special">{</span> <span class="comment">// unnamed</span>
142
143 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">policies</span><span class="special">;</span>
144
145 <span class="keyword">typedef</span> <span class="identifier">policy</span><span class="special">&lt;</span>
146 <span class="identifier">domain_error</span><span class="special">&lt;</span><span class="identifier">errno_on_error</span><span class="special">&gt;,</span>
147 <span class="identifier">pole_error</span><span class="special">&lt;</span><span class="identifier">errno_on_error</span><span class="special">&gt;,</span>
148 <span class="identifier">overflow_error</span><span class="special">&lt;</span><span class="identifier">errno_on_error</span><span class="special">&gt;,</span>
149 <span class="identifier">evaluation_error</span><span class="special">&lt;</span><span class="identifier">errno_on_error</span><span class="special">&gt;</span>
150 <span class="special">&gt;</span> <span class="identifier">c_policy</span><span class="special">;</span>
151
152 <span class="identifier">BOOST_MATH_DECLARE_SPECIAL_FUNCTIONS</span><span class="special">(</span><span class="identifier">c_policy</span><span class="special">)</span>
153 </pre>
154 <p>
155 So that when we call <code class="computeroutput"><span class="identifier">mymath</span><span class="special">::</span><span class="identifier">tgamma</span><span class="special">(</span><span class="identifier">z</span><span class="special">)</span></code>,
156 we really end up calling <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">tgamma</span><span class="special">(</span><span class="identifier">z</span><span class="special">,</span>
157 <span class="identifier">anonymous</span><span class="special">-</span><span class="keyword">namespace</span><span class="special">::</span><span class="identifier">c_policy</span><span class="special">())</span></code>.
158 </p>
159 <pre class="programlisting"><span class="special">}</span> <span class="comment">// close unnamed namespace</span>
160
161 <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
162 <span class="special">{</span>
163 <span class="identifier">errno</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
164 <span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"Result of tgamma(30000) is: "</span>
165 <span class="special">&lt;&lt;</span> <span class="identifier">mymath</span><span class="special">::</span><span class="identifier">tgamma</span><span class="special">(</span><span class="number">30000</span><span class="special">)</span> <span class="special">&lt;&lt;</span> <span class="identifier">endl</span><span class="special">;</span>
166 <span class="comment">// tgamma in unnamed namespace in this translation unit (file) only.</span>
167 <span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"errno = "</span> <span class="special">&lt;&lt;</span> <span class="identifier">errno</span> <span class="special">&lt;&lt;</span> <span class="identifier">endl</span><span class="special">;</span>
168 <span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"Result of tgamma(-10) is: "</span>
169 <span class="special">&lt;&lt;</span> <span class="identifier">mymath</span><span class="special">::</span><span class="identifier">tgamma</span><span class="special">(-</span><span class="number">10</span><span class="special">)</span> <span class="special">&lt;&lt;</span> <span class="identifier">endl</span><span class="special">;</span>
170 <span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"errno = "</span> <span class="special">&lt;&lt;</span> <span class="identifier">errno</span> <span class="special">&lt;&lt;</span> <span class="identifier">endl</span><span class="special">;</span>
171 <span class="comment">// Default tgamma policy would throw an exception, and abort.</span>
172 <span class="special">}</span>
173 </pre>
174 <p>
175 Handling policies for the statistical distributions is very similar except
176 that now the macro BOOST_MATH_DECLARE_DISTRIBUTIONS accepts two parameters:
177 the floating point type to use, and the policy type to apply. For example:
178 </p>
179 <pre class="programlisting"><span class="identifier">BOOST_MATH_DECLARE_DISTRIBUTIONS</span><span class="special">(</span><span class="keyword">double</span><span class="special">,</span> <span class="identifier">mypolicy</span><span class="special">)</span>
180 </pre>
181 <p>
182 Results a set of typedefs being defined like this:
183 </p>
184 <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">normal_distribution</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">,</span> <span class="identifier">mypolicy</span><span class="special">&gt;</span> <span class="identifier">normal</span><span class="special">;</span>
185 </pre>
186 <p>
187 The name of each typedef is the same as the name of the distribution class
188 template, but without the "_distribution" suffix.
189 </p>
190 <p>
191 Suppose we want a set of distributions to behave as follows:
192 </p>
193 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
194 <li class="listitem">
195 Return infinity on overflow, rather than throwing an exception.
196 </li>
197 <li class="listitem">
198 Don't perform any promotion from double to long double internally.
199 </li>
200 <li class="listitem">
201 Return the closest integer result from the quantiles of discrete distributions.
202 </li>
203 </ul></div>
204 <p>
205 We'll begin by including the needed header for all the distributions:
206 </p>
207 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">math</span><span class="special">/</span><span class="identifier">distributions</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
208 </pre>
209 <p>
210 Open up an appropriate namespace, calling it <code class="computeroutput"><span class="identifier">my_distributions</span></code>,
211 for our distributions, and define the policy type we want. Any policies we
212 don't specify here will inherit the defaults:
213 </p>
214 <pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">my_distributions</span>
215 <span class="special">{</span>
216 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">policies</span><span class="special">;</span>
217 <span class="comment">// using boost::math::policies::errno_on_error; // etc.</span>
218
219 <span class="keyword">typedef</span> <span class="identifier">policy</span><span class="special">&lt;</span>
220 <span class="comment">// return infinity and set errno rather than throw:</span>
221 <span class="identifier">overflow_error</span><span class="special">&lt;</span><span class="identifier">errno_on_error</span><span class="special">&gt;,</span>
222 <span class="comment">// Don't promote double -&gt; long double internally:</span>
223 <span class="identifier">promote_double</span><span class="special">&lt;</span><span class="keyword">false</span><span class="special">&gt;,</span>
224 <span class="comment">// Return the closest integer result for discrete quantiles:</span>
225 <span class="identifier">discrete_quantile</span><span class="special">&lt;</span><span class="identifier">integer_round_nearest</span><span class="special">&gt;</span>
226 <span class="special">&gt;</span> <span class="identifier">my_policy</span><span class="special">;</span>
227 </pre>
228 <p>
229 All we need do now is invoke the BOOST_MATH_DECLARE_DISTRIBUTIONS macro passing
230 the floating point type <code class="computeroutput"><span class="keyword">double</span></code>
231 and policy types <code class="computeroutput"><span class="identifier">my_policy</span></code>
232 as arguments:
233 </p>
234 <pre class="programlisting"><span class="identifier">BOOST_MATH_DECLARE_DISTRIBUTIONS</span><span class="special">(</span><span class="keyword">double</span><span class="special">,</span> <span class="identifier">my_policy</span><span class="special">)</span>
235
236 <span class="special">}</span> <span class="comment">// close namespace my_namespace</span>
237 </pre>
238 <p>
239 We now have a set of typedefs defined in namespace my_distributions that
240 all look something like this:
241 </p>
242 <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">normal_distribution</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">,</span> <span class="identifier">my_policy</span><span class="special">&gt;</span> <span class="identifier">normal</span><span class="special">;</span>
243 <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">cauchy_distribution</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">,</span> <span class="identifier">my_policy</span><span class="special">&gt;</span> <span class="identifier">cauchy</span><span class="special">;</span>
244 <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">gamma_distribution</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">,</span> <span class="identifier">my_policy</span><span class="special">&gt;</span> <span class="identifier">gamma</span><span class="special">;</span>
245 <span class="comment">// etc</span>
246 </pre>
247 <p>
248 So that when we use my_distributions::normal we really end up using <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">normal_distribution</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">,</span> <span class="identifier">my_policy</span><span class="special">&gt;</span></code>:
249 </p>
250 <pre class="programlisting"><span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
251 <span class="special">{</span>
252 <span class="comment">// Construct distribution with something we know will overflow</span>
253 <span class="comment">// (using double rather than if promoted to long double):</span>
254 <span class="identifier">my_distributions</span><span class="special">::</span><span class="identifier">normal</span> <span class="identifier">norm</span><span class="special">(</span><span class="number">10</span><span class="special">,</span> <span class="number">2</span><span class="special">);</span>
255
256 <span class="identifier">errno</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
257 <span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"Result of quantile(norm, 0) is: "</span>
258 <span class="special">&lt;&lt;</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">norm</span><span class="special">,</span> <span class="number">0</span><span class="special">)</span> <span class="special">&lt;&lt;</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// -infinity.</span>
259 <span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"errno = "</span> <span class="special">&lt;&lt;</span> <span class="identifier">errno</span> <span class="special">&lt;&lt;</span> <span class="identifier">endl</span><span class="special">;</span>
260 <span class="identifier">errno</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
261 <span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"Result of quantile(norm, 1) is: "</span>
262 <span class="special">&lt;&lt;</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">norm</span><span class="special">,</span> <span class="number">1</span><span class="special">)</span> <span class="special">&lt;&lt;</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// +infinity.</span>
263 <span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"errno = "</span> <span class="special">&lt;&lt;</span> <span class="identifier">errno</span> <span class="special">&lt;&lt;</span> <span class="identifier">endl</span><span class="special">;</span>
264
265 <span class="comment">// Now try a discrete distribution.</span>
266 <span class="identifier">my_distributions</span><span class="special">::</span><span class="identifier">binomial</span> <span class="identifier">binom</span><span class="special">(</span><span class="number">20</span><span class="special">,</span> <span class="number">0.25</span><span class="special">);</span>
267 <span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"Result of quantile(binom, 0.05) is: "</span>
268 <span class="special">&lt;&lt;</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">binom</span><span class="special">,</span> <span class="number">0.05</span><span class="special">)</span> <span class="special">&lt;&lt;</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// To check we get integer results.</span>
269 <span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"Result of quantile(complement(binom, 0.05)) is: "</span>
270 <span class="special">&lt;&lt;</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">binom</span><span class="special">,</span> <span class="number">0.05</span><span class="special">))</span> <span class="special">&lt;&lt;</span> <span class="identifier">endl</span><span class="special">;</span>
271 <span class="special">}</span>
272 </pre>
273 <p>
274 Which outputs:
275 </p>
276 <pre class="programlisting">Result of quantile(norm, 0) is: -1.#INF
277 errno = 34
278 Result of quantile(norm, 1) is: 1.#INF
279 errno = 34
280 Result of quantile(binom, 0.05) is: 1
281 Result of quantile(complement(binom, 0.05)) is: 8
282 </pre>
283 <p>
284 This mechanism is particularly useful when we want to define a project-wide
285 policy, and don't want to modify the Boost source or set project wide build
286 macros (possibly fragile and easy to forget).
287 </p>
288 <div class="note"><table border="0" summary="Note">
289 <tr>
290 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../doc/src/images/note.png"></td>
291 <th align="left">Note</th>
292 </tr>
293 <tr><td align="left" valign="top"><p>
294 There is an important limitation to note: you can *not use the macros BOOST_MATH_DECLARE_DISTRIBUTIONS
295 and BOOST_MATH_DECLARE_SPECIAL_FUNCTIONS <span class="emphasis"><em>in the same namespace</em></span>*,
296 as doing so creates ambiguities between functions and distributions of
297 the same name.
298 </p></td></tr>
299 </table></div>
300 <p>
301 As before, the same mechanism works well at file scope as well: by using
302 an unnamed namespace, we can ensure that these declarations don't conflict
303 with any alternate policies present in other translation units:
304 </p>
305 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">math</span><span class="special">/</span><span class="identifier">distributions</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span> <span class="comment">// All distributions.</span>
306 <span class="comment">// using boost::math::normal; // Would create an ambguity between</span>
307 <span class="comment">// boost::math::normal_distribution&lt;RealType&gt; boost::math::normal and</span>
308 <span class="comment">// 'anonymous-namespace'::normal'.</span>
309
310 <span class="keyword">namespace</span>
311 <span class="special">{</span> <span class="comment">// anonymous or unnnamed (rather than named as in policy_eg_6.cpp).</span>
312
313 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">policies</span><span class="special">;</span>
314 <span class="comment">// using boost::math::policies::errno_on_error; // etc.</span>
315 <span class="keyword">typedef</span> <span class="identifier">policy</span><span class="special">&lt;</span>
316 <span class="comment">// return infinity and set errno rather than throw:</span>
317 <span class="identifier">overflow_error</span><span class="special">&lt;</span><span class="identifier">errno_on_error</span><span class="special">&gt;,</span>
318 <span class="comment">// Don't promote double -&gt; long double internally:</span>
319 <span class="identifier">promote_double</span><span class="special">&lt;</span><span class="keyword">false</span><span class="special">&gt;,</span>
320 <span class="comment">// Return the closest integer result for discrete quantiles:</span>
321 <span class="identifier">discrete_quantile</span><span class="special">&lt;</span><span class="identifier">integer_round_nearest</span><span class="special">&gt;</span>
322 <span class="special">&gt;</span> <span class="identifier">my_policy</span><span class="special">;</span>
323
324 <span class="identifier">BOOST_MATH_DECLARE_DISTRIBUTIONS</span><span class="special">(</span><span class="keyword">double</span><span class="special">,</span> <span class="identifier">my_policy</span><span class="special">)</span>
325
326 <span class="special">}</span> <span class="comment">// close namespace my_namespace</span>
327
328 <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
329 <span class="special">{</span>
330 <span class="comment">// Construct distribution with something we know will overflow.</span>
331 <span class="identifier">normal</span> <span class="identifier">norm</span><span class="special">(</span><span class="number">10</span><span class="special">,</span> <span class="number">2</span><span class="special">);</span> <span class="comment">// using 'anonymous-namespace'::normal</span>
332 <span class="identifier">errno</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
333 <span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"Result of quantile(norm, 0) is: "</span>
334 <span class="special">&lt;&lt;</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">norm</span><span class="special">,</span> <span class="number">0</span><span class="special">)</span> <span class="special">&lt;&lt;</span> <span class="identifier">endl</span><span class="special">;</span>
335 <span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"errno = "</span> <span class="special">&lt;&lt;</span> <span class="identifier">errno</span> <span class="special">&lt;&lt;</span> <span class="identifier">endl</span><span class="special">;</span>
336 <span class="identifier">errno</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
337 <span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"Result of quantile(norm, 1) is: "</span>
338 <span class="special">&lt;&lt;</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">norm</span><span class="special">,</span> <span class="number">1</span><span class="special">)</span> <span class="special">&lt;&lt;</span> <span class="identifier">endl</span><span class="special">;</span>
339 <span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"errno = "</span> <span class="special">&lt;&lt;</span> <span class="identifier">errno</span> <span class="special">&lt;&lt;</span> <span class="identifier">endl</span><span class="special">;</span>
340 <span class="comment">//</span>
341 <span class="comment">// Now try a discrete distribution:</span>
342 <span class="identifier">binomial</span> <span class="identifier">binom</span><span class="special">(</span><span class="number">20</span><span class="special">,</span> <span class="number">0.25</span><span class="special">);</span>
343 <span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"Result of quantile(binom, 0.05) is: "</span>
344 <span class="special">&lt;&lt;</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">binom</span><span class="special">,</span> <span class="number">0.05</span><span class="special">)</span> <span class="special">&lt;&lt;</span> <span class="identifier">endl</span><span class="special">;</span>
345 <span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"Result of quantile(complement(binom, 0.05)) is: "</span>
346 <span class="special">&lt;&lt;</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">complement</span><span class="special">(</span><span class="identifier">binom</span><span class="special">,</span> <span class="number">0.05</span><span class="special">))</span> <span class="special">&lt;&lt;</span> <span class="identifier">endl</span><span class="special">;</span>
347 <span class="special">}</span>
348 </pre>
349 </div>
350 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
351 <td align="left"></td>
352 <td align="right"><div class="copyright-footer">Copyright &#169; 2006-2010, 2012-2014 Nikhar Agrawal,
353 Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert
354 Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Johan R&#229;de, Gautam Sewani,
355 Benjamin Sobotta, Thijs van den Berg, Daryle Walker and Xiaogang Zhang<p>
356 Distributed under the Boost Software License, Version 1.0. (See accompanying
357 file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
358 </p>
359 </div></td>
360 </tr></table>
361 <hr>
362 <div class="spirit-nav">
363 <a accesskey="p" href="ad_hoc_sf_policies.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../pol_tutorial.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="user_def_err_pol.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
364 </div>
365 </body>
366 </html>