1<html> 2<head> 3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 4<title>Changing the Policy on an Ad Hoc Basis for the Special Functions</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_dist_policies.html" title="Setting Policies for Distributions on an Ad Hoc Basis"> 10<link rel="next" href="namespace_policies.html" title="Setting Policies at Namespace or Translation Unit Scope"> 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_dist_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="namespace_policies.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.ad_hoc_sf_policies"></a><a class="link" href="ad_hoc_sf_policies.html" title="Changing the Policy on an Ad Hoc Basis for the Special Functions">Changing 28 the Policy on an Ad Hoc Basis for the Special Functions</a> 29</h3></div></div></div> 30<p> 31 All of the special functions in this library come in two overloaded forms, 32 one with a final "policy" parameter, and one without. For example: 33 </p> 34<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">math</span><span class="special">{</span> 35 36<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">RealType</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Policy</span><span class="special">></span> 37<span class="identifier">RealType</span> <span class="identifier">tgamma</span><span class="special">(</span><span class="identifier">RealType</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">Policy</span><span class="special">&);</span> 38 39<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">RealType</span><span class="special">></span> 40<span class="identifier">RealType</span> <span class="identifier">tgamma</span><span class="special">(</span><span class="identifier">RealType</span><span class="special">);</span> 41 42<span class="special">}}</span> <span class="comment">// namespaces</span> 43</pre> 44<p> 45 Normally, the second version is just a forwarding wrapper to the first like 46 this: 47 </p> 48<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> 49<span class="keyword">inline</span> <span class="identifier">RealType</span> <span class="identifier">tgamma</span><span class="special">(</span><span class="identifier">RealType</span> <span class="identifier">x</span><span class="special">)</span> 50<span class="special">{</span> 51 <span class="keyword">return</span> <span class="identifier">tgamma</span><span class="special">(</span><span class="identifier">x</span><span class="special">,</span> <span class="identifier">policies</span><span class="special">::</span><span class="identifier">policy</span><span class="special"><>());</span> 52<span class="special">}</span> 53</pre> 54<p> 55 So calling a special function with a specific policy is just a matter of 56 defining the policy type to use and passing it as the final parameter. For 57 example, suppose we want <code class="computeroutput"><span class="identifier">tgamma</span></code> 58 to behave in a C-compatible fashion and set <code class="computeroutput"><span class="special">::</span><span class="identifier">errno</span></code> when an error occurs, and never throw 59 an exception: 60 </p> 61<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">gamma</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 62<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">tgamma</span><span class="special">;</span> 63 64<span class="comment">// Define the policy to use:</span> 65<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> <span class="comment">// may be convenient, or</span> 66 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<span class="comment">// Types of error whose action can be altered by policies:.</span> 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">evaluation_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">domain_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">domain_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">pole_error</span><span class="special">;</span> 74<span class="comment">// Actions on error (in enum error_policy_type):</span> 75<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> 76<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">ignore_error</span><span class="special">;</span> 77<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">throw_on_error</span><span class="special">;</span> 78<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">user_error</span><span class="special">;</span> 79 80<span class="keyword">typedef</span> <span class="identifier">policy</span><span class="special"><</span> 81 <span class="identifier">domain_error</span><span class="special"><</span><span class="identifier">errno_on_error</span><span class="special">>,</span> 82 <span class="identifier">pole_error</span><span class="special"><</span><span class="identifier">errno_on_error</span><span class="special">>,</span> 83 <span class="identifier">overflow_error</span><span class="special"><</span><span class="identifier">errno_on_error</span><span class="special">>,</span> 84 <span class="identifier">evaluation_error</span><span class="special"><</span><span class="identifier">errno_on_error</span><span class="special">></span> 85<span class="special">></span> <span class="identifier">c_policy</span><span class="special">;</span> 86<span class="comment">//</span> 87<span class="comment">// Now use the policy when calling tgamma:</span> 88 89<span class="comment">// http://msdn.microsoft.com/en-us/library/t3ayayh1.aspx </span> 90<span class="comment">// Microsoft errno declared in STDLIB.H as "extern int errno;" </span> 91 92<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> 93<span class="special">{</span> 94 <span class="identifier">errno</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="comment">// Reset.</span> 95 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Result of tgamma(30000) is: "</span> 96 <span class="special"><<</span> <span class="identifier">tgamma</span><span class="special">(</span><span class="number">30000</span><span class="special">,</span> <span class="identifier">c_policy</span><span class="special">())</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// Too big parameter</span> 97 <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 Numerical result out of range.</span> 98 <span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Result of tgamma(-10) is: "</span> 99 <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">tgamma</span><span class="special">(-</span><span class="number">10</span><span class="special">,</span> <span class="identifier">c_policy</span><span class="special">())</span> <span class="special"><<</span> <span class="identifier">endl</span><span class="special">;</span> <span class="comment">// Negative parameter.</span> 100 <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">// error 33 Numerical argument out of domain.</span> 101<span class="special">}</span> <span class="comment">// int main()</span> 102</pre> 103<p> 104 which outputs: 105 </p> 106<pre class="programlisting">Result of tgamma(30000) is: 1.#INF 107errno = 34 108Result of tgamma(-10) is: 1.#QNAN 109errno = 33 110</pre> 111<p> 112 Alternatively, for ad hoc use, we can use the <code class="computeroutput"><span class="identifier">make_policy</span></code> 113 helper function to create a policy for us: this usage is more verbose, so 114 is probably only preferred when a policy is going to be used once only: 115 </p> 116<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">gamma</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 117<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">tgamma</span><span class="special">;</span> 118 119<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> 120<span class="special">{</span> 121 <span class="comment">// using namespace boost::math::policies; // or</span> 122 <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> 123 <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">make_policy</span><span class="special">;</span> 124 <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> 125 <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> 126 <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> 127 <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> 128 129 <span class="identifier">errno</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> 130 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Result of tgamma(30000) is: "</span> 131 <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">tgamma</span><span class="special">(</span> 132 <span class="number">30000</span><span class="special">,</span> 133 <span class="identifier">make_policy</span><span class="special">(</span> 134 <span class="identifier">domain_error</span><span class="special"><</span><span class="identifier">errno_on_error</span><span class="special">>(),</span> 135 <span class="identifier">pole_error</span><span class="special"><</span><span class="identifier">errno_on_error</span><span class="special">>(),</span> 136 <span class="identifier">overflow_error</span><span class="special"><</span><span class="identifier">errno_on_error</span><span class="special">>(),</span> 137 <span class="identifier">evaluation_error</span><span class="special"><</span><span class="identifier">errno_on_error</span><span class="special">>()</span> 138 <span class="special">)</span> 139 <span class="special">)</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> 140 <span class="comment">// Check errno was set:</span> 141 <span class="identifier">std</span><span class="special">::</span><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">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> 142 <span class="comment">// and again with evaluation at a pole:</span> 143 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Result of tgamma(-10) is: "</span> 144 <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">tgamma</span><span class="special">(</span> 145 <span class="special">-</span><span class="number">10</span><span class="special">,</span> 146 <span class="identifier">make_policy</span><span class="special">(</span> 147 <span class="identifier">domain_error</span><span class="special"><</span><span class="identifier">errno_on_error</span><span class="special">>(),</span> 148 <span class="identifier">pole_error</span><span class="special"><</span><span class="identifier">errno_on_error</span><span class="special">>(),</span> 149 <span class="identifier">overflow_error</span><span class="special"><</span><span class="identifier">errno_on_error</span><span class="special">>(),</span> 150 <span class="identifier">evaluation_error</span><span class="special"><</span><span class="identifier">errno_on_error</span><span class="special">>()</span> 151 <span class="special">)</span> 152 <span class="special">)</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> 153 <span class="comment">// Check errno was set:</span> 154 <span class="identifier">std</span><span class="special">::</span><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">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> 155<span class="special">}</span> 156</pre> 157</div> 158<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 159<td align="left"></td> 160<td align="right"><div class="copyright-footer">Copyright © 2006-2019 Nikhar 161 Agrawal, Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, 162 Hubert Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Matthew Pulver, Johan 163 Råde, Gautam Sewani, Benjamin Sobotta, Nicholas Thompson, Thijs van den Berg, 164 Daryle Walker and Xiaogang Zhang<p> 165 Distributed under the Boost Software License, Version 1.0. (See accompanying 166 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>) 167 </p> 168</div></td> 169</tr></table> 170<hr> 171<div class="spirit-nav"> 172<a accesskey="p" href="ad_hoc_dist_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="namespace_policies.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> 173</div> 174</body> 175</html> 176