1<html> 2<head> 3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 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.79.1"> 7<link rel="home" href="../../index.html" title="Math Toolkit 2.12.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"><</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">></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"><</span> 76 <span class="identifier">domain_error</span><span class="special"><</span><span class="identifier">errno_on_error</span><span class="special">>,</span> 77 <span class="identifier">pole_error</span><span class="special"><</span><span class="identifier">errno_on_error</span><span class="special">>,</span> 78 <span class="identifier">overflow_error</span><span class="special"><</span><span class="identifier">errno_on_error</span><span class="special">>,</span> 79 <span class="identifier">evaluation_error</span><span class="special"><</span><span class="identifier">errno_on_error</span><span class="special">></span> 80 <span class="special">></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"><</span><span class="keyword">class</span> <span class="identifier">RealType</span><span class="special">></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"><</span><span class="identifier">RT</span><span class="special">>::</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"><<</span> <span class="string">"Result of tgamma(30000) is: "</span> 110 <span class="special"><<</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"><<</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"><<</span> <span class="string">"errno = "</span> <span class="special"><<</span> <span class="identifier">errno</span> <span class="special"><<</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"><<</span> <span class="string">"Result of tgamma(-10) is: "</span> 113 <span class="special"><<</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"><<</span> <span class="identifier">endl</span><span class="special">;</span> 114 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"errno = "</span> <span class="special"><<</span> <span class="identifier">errno</span> <span class="special"><<</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 121errno = 34 122Result of C::tgamma(-10) is: 1.#QNAN 123errno = 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"><</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">></span> 136<span class="comment">// using boost::math::tgamma; // Would create an ambiguity between</span> 137<span class="comment">// 'double boost::math::tgamma<int>(T)' and</span> 138<span class="comment">// 'double 'anonymous-namespace'::tgamma<int>(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"><</span> 146 <span class="identifier">domain_error</span><span class="special"><</span><span class="identifier">errno_on_error</span><span class="special">>,</span> 147 <span class="identifier">pole_error</span><span class="special"><</span><span class="identifier">errno_on_error</span><span class="special">>,</span> 148 <span class="identifier">overflow_error</span><span class="special"><</span><span class="identifier">errno_on_error</span><span class="special">>,</span> 149 <span class="identifier">evaluation_error</span><span class="special"><</span><span class="identifier">errno_on_error</span><span class="special">></span> 150<span class="special">></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"><<</span> <span class="string">"Result of tgamma(30000) is: "</span> 165 <span class="special"><<</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"><<</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"><<</span> <span class="string">"errno = "</span> <span class="special"><<</span> <span class="identifier">errno</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> 168 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Result of tgamma(-10) is: "</span> 169 <span class="special"><<</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"><<</span> <span class="identifier">endl</span><span class="special">;</span> 170 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"errno = "</span> <span class="special"><<</span> <span class="identifier">errno</span> <span class="special"><<</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">my_policy</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"><</span><span class="keyword">double</span><span class="special">,</span> <span class="identifier">my_policy</span><span class="special">></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"><</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">></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"><</span> 220 <span class="comment">// return infinity and set errno rather than throw:</span> 221 <span class="identifier">overflow_error</span><span class="special"><</span><span class="identifier">errno_on_error</span><span class="special">>,</span> 222 <span class="comment">// Don't promote double -> long double internally:</span> 223 <span class="identifier">promote_double</span><span class="special"><</span><span class="keyword">false</span><span class="special">>,</span> 224 <span class="comment">// Return the closest integer result for discrete quantiles:</span> 225 <span class="identifier">discrete_quantile</span><span class="special"><</span><span class="identifier">integer_round_nearest</span><span class="special">></span> 226 <span class="special">></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"><</span><span class="keyword">double</span><span class="special">,</span> <span class="identifier">my_policy</span><span class="special">></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"><</span><span class="keyword">double</span><span class="special">,</span> <span class="identifier">my_policy</span><span class="special">></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"><</span><span class="keyword">double</span><span class="special">,</span> <span class="identifier">my_policy</span><span class="special">></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"><</span><span class="keyword">double</span><span class="special">,</span> <span class="identifier">my_policy</span><span class="special">></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"><<</span> <span class="string">"Result of quantile(norm, 0) is: "</span> 258 <span class="special"><<</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"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// -infinity.</span> 259 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"errno = "</span> <span class="special"><<</span> <span class="identifier">errno</span> <span class="special"><<</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"><<</span> <span class="string">"Result of quantile(norm, 1) is: "</span> 262 <span class="special"><<</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"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// +infinity.</span> 263 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"errno = "</span> <span class="special"><<</span> <span class="identifier">errno</span> <span class="special"><<</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"><<</span> <span class="string">"Result of quantile(binom, 0.05) is: "</span> 268 <span class="special"><<</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"><<</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"><<</span> <span class="string">"Result of quantile(complement(binom, 0.05)) is: "</span> 270 <span class="special"><<</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"><<</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 277errno = 34 278Result of quantile(norm, 1) is: 1.#INF 279errno = 34 280Result of quantile(binom, 0.05) is: 1 281Result 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"><</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">></span> <span class="comment">// All distributions.</span> 306<span class="comment">// using boost::math::normal; // Would create an ambiguity between</span> 307<span class="comment">// boost::math::normal_distribution<RealType> 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 unnamed (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"><</span> 316 <span class="comment">// return infinity and set errno rather than throw:</span> 317 <span class="identifier">overflow_error</span><span class="special"><</span><span class="identifier">errno_on_error</span><span class="special">>,</span> 318 <span class="comment">// Don't promote double -> long double internally:</span> 319 <span class="identifier">promote_double</span><span class="special"><</span><span class="keyword">false</span><span class="special">>,</span> 320 <span class="comment">// Return the closest integer result for discrete quantiles:</span> 321 <span class="identifier">discrete_quantile</span><span class="special"><</span><span class="identifier">integer_round_nearest</span><span class="special">></span> 322 <span class="special">></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"><<</span> <span class="string">"Result of quantile(norm, 0) is: "</span> 334 <span class="special"><<</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"><<</span> <span class="identifier">endl</span><span class="special">;</span> 335 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"errno = "</span> <span class="special"><<</span> <span class="identifier">errno</span> <span class="special"><<</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"><<</span> <span class="string">"Result of quantile(norm, 1) is: "</span> 338 <span class="special"><<</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"><<</span> <span class="identifier">endl</span><span class="special">;</span> 339 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"errno = "</span> <span class="special"><<</span> <span class="identifier">errno</span> <span class="special"><<</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"><<</span> <span class="string">"Result of quantile(binom, 0.05) is: "</span> 344 <span class="special"><<</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"><<</span> <span class="identifier">endl</span><span class="special">;</span> 345 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Result of quantile(complement(binom, 0.05)) is: "</span> 346 <span class="special"><<</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"><<</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 © 2006-2019 Nikhar 353 Agrawal, Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, 354 Hubert Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Matthew Pulver, Johan 355 Råde, Gautam Sewani, Benjamin Sobotta, Nicholas Thompson, Thijs van den Berg, 356 Daryle Walker and Xiaogang Zhang<p> 357 Distributed under the Boost Software License, Version 1.0. (See accompanying 358 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>) 359 </p> 360</div></td> 361</tr></table> 362<hr> 363<div class="spirit-nav"> 364<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> 365</div> 366</body> 367</html> 368