Imported Upstream version 1.57.0
[platform/upstream/boost.git] / 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.78.1">
7 <link rel="home" href="../../index.html" title="Math Toolkit 2.1.0">
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, Johan R&#229;de, Gautam Sewani, Benjamin Sobotta,
355       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>