• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<html>
2<head>
3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
4<title>Error Handling Policies</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_ref.html" title="Policy Reference">
9<link rel="prev" href="../pol_ref.html" title="Policy Reference">
10<link rel="next" href="internal_promotion.html" title="Internal Floating-point Promotion Policies">
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="../pol_ref.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../pol_ref.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="internal_promotion.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_ref.error_handling_policies"></a><a class="link" href="error_handling_policies.html" title="Error Handling Policies">Error Handling
28      Policies</a>
29</h3></div></div></div>
30<p>
31        There are two orthogonal aspects to error handling:
32      </p>
33<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
34<li class="listitem">
35            What to do (if anything) with the error.
36          </li>
37<li class="listitem">
38            What kind of error is being raised.
39          </li>
40</ul></div>
41<h5>
42<a name="math_toolkit.pol_ref.error_handling_policies.h0"></a>
43        <span class="phrase"><a name="math_toolkit.pol_ref.error_handling_policies.available_actions_when_an_error_"></a></span><a class="link" href="error_handling_policies.html#math_toolkit.pol_ref.error_handling_policies.available_actions_when_an_error_">Available
44        Actions When an Error is Raised</a>
45      </h5>
46<p>
47        What to do with the error is encapsulated by an enumerated type:
48      </p>
49<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> <span class="keyword">namespace</span> <span class="identifier">policies</span> <span class="special">{</span>
50
51<span class="keyword">enum</span> <span class="identifier">error_policy_type</span>
52<span class="special">{</span>
53   <span class="identifier">throw_on_error</span> <span class="special">=</span> <span class="number">0</span><span class="special">,</span> <span class="comment">// throw an exception.</span>
54   <span class="identifier">errno_on_error</span> <span class="special">=</span> <span class="number">1</span><span class="special">,</span> <span class="comment">// set ::errno &amp; return 0, NaN, infinity or best guess.</span>
55   <span class="identifier">ignore_error</span> <span class="special">=</span> <span class="number">2</span><span class="special">,</span> <span class="comment">// return 0, NaN, infinity or best guess.</span>
56   <span class="identifier">user_error</span> <span class="special">=</span> <span class="number">3</span>  <span class="comment">// call a user-defined error handler.</span>
57<span class="special">};</span>
58
59<span class="special">}}}</span> <span class="comment">// namespaces</span>
60</pre>
61<p>
62        The various enumerated values have the following meanings:
63      </p>
64<h6>
65<a name="math_toolkit.pol_ref.error_handling_policies.h1"></a>
66        <span class="phrase"><a name="math_toolkit.pol_ref.error_handling_policies.throw_on_error"></a></span><a class="link" href="error_handling_policies.html#math_toolkit.pol_ref.error_handling_policies.throw_on_error">throw_on_error</a>
67      </h6>
68<p>
69        Will throw one of the following exceptions, depending upon the type of the
70        error:
71      </p>
72<div class="informaltable"><table class="table">
73<colgroup>
74<col>
75<col>
76</colgroup>
77<thead><tr>
78<th>
79                <p>
80                  Error Type
81                </p>
82              </th>
83<th>
84                <p>
85                  Exception
86                </p>
87              </th>
88</tr></thead>
89<tbody>
90<tr>
91<td>
92                <p>
93                  Domain Error
94                </p>
95              </td>
96<td>
97                <p>
98                  std::domain_error
99                </p>
100              </td>
101</tr>
102<tr>
103<td>
104                <p>
105                  Pole Error
106                </p>
107              </td>
108<td>
109                <p>
110                  std::domain_error
111                </p>
112              </td>
113</tr>
114<tr>
115<td>
116                <p>
117                  Overflow Error
118                </p>
119              </td>
120<td>
121                <p>
122                  std::overflow_error
123                </p>
124              </td>
125</tr>
126<tr>
127<td>
128                <p>
129                  Underflow Error
130                </p>
131              </td>
132<td>
133                <p>
134                  std::underflow_error
135                </p>
136              </td>
137</tr>
138<tr>
139<td>
140                <p>
141                  Denorm Error
142                </p>
143              </td>
144<td>
145                <p>
146                  std::underflow_error
147                </p>
148              </td>
149</tr>
150<tr>
151<td>
152                <p>
153                  Evaluation Error
154                </p>
155              </td>
156<td>
157                <p>
158                  boost::math::evaluation_error
159                </p>
160              </td>
161</tr>
162<tr>
163<td>
164                <p>
165                  Indeterminate Result Error
166                </p>
167              </td>
168<td>
169                <p>
170                  std::domain_error
171                </p>
172              </td>
173</tr>
174</tbody>
175</table></div>
176<h6>
177<a name="math_toolkit.pol_ref.error_handling_policies.h2"></a>
178        <span class="phrase"><a name="math_toolkit.pol_ref.error_handling_policies.errno_on_error"></a></span><a class="link" href="error_handling_policies.html#math_toolkit.pol_ref.error_handling_policies.errno_on_error">errno_on_error</a>
179      </h6>
180<p>
181        Will set global <a href="http://en.wikipedia.org/wiki/Errno" target="_top"><code class="computeroutput"><span class="special">::</span><span class="identifier">errno</span></code></a>
182        <code class="computeroutput"><span class="special">::</span><span class="identifier">errno</span></code>
183        to one of the following values depending upon the error type (often EDOM
184        = 33 and ERANGE = 34), and then return the same value as if the error had
185        been ignored:
186      </p>
187<div class="informaltable"><table class="table">
188<colgroup>
189<col>
190<col>
191</colgroup>
192<thead><tr>
193<th>
194                <p>
195                  Error Type
196                </p>
197              </th>
198<th>
199                <p>
200                  errno value
201                </p>
202              </th>
203</tr></thead>
204<tbody>
205<tr>
206<td>
207                <p>
208                  Domain Error
209                </p>
210              </td>
211<td>
212                <p>
213                  EDOM
214                </p>
215              </td>
216</tr>
217<tr>
218<td>
219                <p>
220                  Pole Error
221                </p>
222              </td>
223<td>
224                <p>
225                  EDOM
226                </p>
227              </td>
228</tr>
229<tr>
230<td>
231                <p>
232                  Overflow Error
233                </p>
234              </td>
235<td>
236                <p>
237                  ERANGE
238                </p>
239              </td>
240</tr>
241<tr>
242<td>
243                <p>
244                  Underflow Error
245                </p>
246              </td>
247<td>
248                <p>
249                  ERANGE
250                </p>
251              </td>
252</tr>
253<tr>
254<td>
255                <p>
256                  Denorm Error
257                </p>
258              </td>
259<td>
260                <p>
261                  ERANGE
262                </p>
263              </td>
264</tr>
265<tr>
266<td>
267                <p>
268                  Evaluation Error
269                </p>
270              </td>
271<td>
272                <p>
273                  EDOM
274                </p>
275              </td>
276</tr>
277<tr>
278<td>
279                <p>
280                  Indeterminate Result Error
281                </p>
282              </td>
283<td>
284                <p>
285                  EDOM
286                </p>
287              </td>
288</tr>
289</tbody>
290</table></div>
291<h6>
292<a name="math_toolkit.pol_ref.error_handling_policies.h3"></a>
293        <span class="phrase"><a name="math_toolkit.pol_ref.error_handling_policies.ignore_error"></a></span><a class="link" href="error_handling_policies.html#math_toolkit.pol_ref.error_handling_policies.ignore_error">ignore_error</a>
294      </h6>
295<p>
296        Will return one of the values below depending on the error type (<code class="computeroutput"><span class="special">::</span><span class="identifier">errno</span></code>
297        is NOT changed)::
298      </p>
299<div class="informaltable"><table class="table">
300<colgroup>
301<col>
302<col>
303</colgroup>
304<thead><tr>
305<th>
306                <p>
307                  Error Type
308                </p>
309              </th>
310<th>
311                <p>
312                  Returned Value
313                </p>
314              </th>
315</tr></thead>
316<tbody>
317<tr>
318<td>
319                <p>
320                  Domain Error
321                </p>
322              </td>
323<td>
324                <p>
325                  std::numeric_limits&lt;T&gt;::quiet_NaN()
326                </p>
327              </td>
328</tr>
329<tr>
330<td>
331                <p>
332                  Pole Error
333                </p>
334              </td>
335<td>
336                <p>
337                  std::numeric_limits&lt;T&gt;::quiet_NaN()
338                </p>
339              </td>
340</tr>
341<tr>
342<td>
343                <p>
344                  Overflow Error
345                </p>
346              </td>
347<td>
348                <p>
349                  std::numeric_limits&lt;T&gt;::infinity()
350                </p>
351              </td>
352</tr>
353<tr>
354<td>
355                <p>
356                  Underflow Error
357                </p>
358              </td>
359<td>
360                <p>
361                  0
362                </p>
363              </td>
364</tr>
365<tr>
366<td>
367                <p>
368                  Denorm Error
369                </p>
370              </td>
371<td>
372                <p>
373                  The denormalised value.
374                </p>
375              </td>
376</tr>
377<tr>
378<td>
379                <p>
380                  Evaluation Error
381                </p>
382              </td>
383<td>
384                <p>
385                  The best guess (perhaps NaN) as to the result: which may be significantly
386                  in error.
387                </p>
388              </td>
389</tr>
390<tr>
391<td>
392                <p>
393                  Indeterminate Result Error
394                </p>
395              </td>
396<td>
397                <p>
398                  Depends on the function where the error occurred
399                </p>
400              </td>
401</tr>
402</tbody>
403</table></div>
404<h6>
405<a name="math_toolkit.pol_ref.error_handling_policies.h4"></a>
406        <span class="phrase"><a name="math_toolkit.pol_ref.error_handling_policies.user_error"></a></span><a class="link" href="error_handling_policies.html#math_toolkit.pol_ref.error_handling_policies.user_error">user_error</a>
407      </h6>
408<p>
409        Will call a user defined error handler: these are forward declared in boost/math/policies/error_handling.hpp,
410        but the actual definitions must be provided by the user:
411      </p>
412<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> <span class="keyword">namespace</span> <span class="identifier">policies</span><span class="special">{</span>
413
414<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
415<span class="identifier">T</span> <span class="identifier">user_domain_error</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">function</span><span class="special">,</span> <span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">message</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">val</span><span class="special">);</span>
416
417<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
418<span class="identifier">T</span> <span class="identifier">user_pole_error</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">function</span><span class="special">,</span> <span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">message</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">val</span><span class="special">);</span>
419
420<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
421<span class="identifier">T</span> <span class="identifier">user_overflow_error</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">function</span><span class="special">,</span> <span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">message</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">val</span><span class="special">);</span>
422
423<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
424<span class="identifier">T</span> <span class="identifier">user_underflow_error</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">function</span><span class="special">,</span> <span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">message</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">val</span><span class="special">);</span>
425
426<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
427<span class="identifier">T</span> <span class="identifier">user_denorm_error</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">function</span><span class="special">,</span> <span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">message</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">val</span><span class="special">);</span>
428
429<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
430<span class="identifier">T</span> <span class="identifier">user_rounding_error</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">function</span><span class="special">,</span> <span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">message</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">val</span><span class="special">);</span>
431
432<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
433<span class="identifier">T</span> <span class="identifier">user_evaluation_error</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">function</span><span class="special">,</span> <span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">message</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">val</span><span class="special">);</span>
434
435<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
436<span class="identifier">T</span> <span class="identifier">user_indeterminate_result_error</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">function</span><span class="special">,</span> <span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">message</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">val</span><span class="special">);</span>
437
438<span class="special">}}}</span> <span class="comment">// namespaces</span>
439</pre>
440<p>
441        Note that the strings <span class="emphasis"><em>function</em></span> and <span class="emphasis"><em>message</em></span>
442        may contain "%1%" format specifiers designed to be used in conjunction
443        with Boost.Format. If these strings are to be presented to the program's
444        end-user then the "%1%" format specifier should be replaced with
445        the name of type T in the <span class="emphasis"><em>function</em></span> string, and if there
446        is a %1% specifier in the <span class="emphasis"><em>message</em></span> string then it should
447        be replaced with the value of <span class="emphasis"><em>val</em></span>.
448      </p>
449<p>
450        There is more information on user-defined error handlers in the <a class="link" href="../pol_tutorial/user_def_err_pol.html" title="Calling User Defined Error Handlers">tutorial
451        here</a>.
452      </p>
453<h5>
454<a name="math_toolkit.pol_ref.error_handling_policies.h5"></a>
455        <span class="phrase"><a name="math_toolkit.pol_ref.error_handling_policies.kinds_of_error_raised"></a></span><a class="link" href="error_handling_policies.html#math_toolkit.pol_ref.error_handling_policies.kinds_of_error_raised">Kinds
456        of Error Raised</a>
457      </h5>
458<p>
459        There are six kinds of error reported by this library, which are summarised
460        in the following table:
461      </p>
462<div class="informaltable"><table class="table">
463<colgroup>
464<col>
465<col>
466<col>
467</colgroup>
468<thead><tr>
469<th>
470                <p>
471                  Error Type
472                </p>
473              </th>
474<th>
475                <p>
476                  Policy Class
477                </p>
478              </th>
479<th>
480                <p>
481                  Description
482                </p>
483              </th>
484</tr></thead>
485<tbody>
486<tr>
487<td>
488                <p>
489                  Domain Error
490                </p>
491              </td>
492<td>
493                <p>
494                  boost::math::policies::domain_error&lt;<span class="emphasis"><em>action</em></span>&gt;
495                </p>
496              </td>
497<td>
498                <p>
499                  Raised when more or more arguments are outside the defined range
500                  of the function.
501                </p>
502                <p>
503                  Defaults to <code class="computeroutput"><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">&lt;</span><span class="identifier">throw_on_error</span><span class="special">&gt;</span></code>
504                </p>
505                <p>
506                  When the action is set to <span class="emphasis"><em>throw_on_error</em></span> then
507                  throws <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">domain_error</span></code>
508                </p>
509              </td>
510</tr>
511<tr>
512<td>
513                <p>
514                  Pole Error
515                </p>
516              </td>
517<td>
518                <p>
519                  boost::math::policies::pole_error&lt;<span class="emphasis"><em>action</em></span>&gt;
520                </p>
521              </td>
522<td>
523                <p>
524                  Raised when more or more arguments would cause the function to
525                  be evaluated at a pole.
526                </p>
527                <p>
528                  Defaults to <code class="computeroutput"><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">&lt;</span><span class="identifier">throw_on_error</span><span class="special">&gt;</span></code>
529                </p>
530                <p>
531                  When the action is <span class="emphasis"><em>throw_on_error</em></span> then throw
532                  a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">domain_error</span></code>
533                </p>
534              </td>
535</tr>
536<tr>
537<td>
538                <p>
539                  Overflow Error
540                </p>
541              </td>
542<td>
543                <p>
544                  boost::math::policies::overflow_error&lt;<span class="emphasis"><em>action</em></span>&gt;
545                </p>
546              </td>
547<td>
548                <p>
549                  Raised when the result of the function is outside the representable
550                  range of the floating point type used.
551                </p>
552                <p>
553                  Defaults to <code class="computeroutput"><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">&lt;</span><span class="identifier">throw_on_error</span><span class="special">&gt;</span></code>.
554                </p>
555                <p>
556                  When the action is <span class="emphasis"><em>throw_on_error</em></span> then throws
557                  a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">overflow_error</span></code>.
558                </p>
559              </td>
560</tr>
561<tr>
562<td>
563                <p>
564                  Underflow Error
565                </p>
566              </td>
567<td>
568                <p>
569                  boost::math::policies::underflow_error&lt;<span class="emphasis"><em>action</em></span>&gt;
570                </p>
571              </td>
572<td>
573                <p>
574                  Raised when the result of the function is too small to be represented
575                  in the floating point type used.
576                </p>
577                <p>
578                  Defaults to <code class="computeroutput"><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">underflow_error</span><span class="special">&lt;</span><span class="identifier">ignore_error</span><span class="special">&gt;</span></code>
579                </p>
580                <p>
581                  When the specified action is <span class="emphasis"><em>throw_on_error</em></span>
582                  then throws a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">underflow_error</span></code>
583                </p>
584              </td>
585</tr>
586<tr>
587<td>
588                <p>
589                  Denorm Error
590                </p>
591              </td>
592<td>
593                <p>
594                  boost::math::policies::denorm_error&lt;<span class="emphasis"><em>action</em></span>&gt;
595                </p>
596              </td>
597<td>
598                <p>
599                  Raised when the result of the function is a denormalised value.
600                </p>
601                <p>
602                  Defaults to <code class="computeroutput"><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">denorm_error</span><span class="special">&lt;</span><span class="identifier">ignore_error</span><span class="special">&gt;</span></code>
603                </p>
604                <p>
605                  When the action is <span class="emphasis"><em>throw_on_error</em></span> then throws
606                  a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">underflow_error</span></code>
607                </p>
608              </td>
609</tr>
610<tr>
611<td>
612                <p>
613                  Rounding Error
614                </p>
615              </td>
616<td>
617                <p>
618                  boost::math::policies::rounding_error&lt;<span class="emphasis"><em>action</em></span>&gt;
619                </p>
620              </td>
621<td>
622                <p>
623                  Raised When one of the rounding functions <a class="link" href="../rounding/round.html" title="Rounding Functions">round</a>,
624                  <a class="link" href="../rounding/trunc.html" title="Truncation Functions">trunc</a> or <a class="link" href="../rounding/modf.html" title="Integer and Fractional Part Splitting (modf)">modf</a> is called with
625                  an argument that has no integer representation, or is too large
626                  to be represented in the result type
627                </p>
628                <p>
629                  Defaults to <code class="computeroutput"><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">rounding_error</span><span class="special">&lt;</span><span class="identifier">throw_on_error</span><span class="special">&gt;</span></code>
630                </p>
631                <p>
632                  When the action is <span class="emphasis"><em>throw_on_error</em></span> then throws
633                  <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">rounding_error</span></code>
634                </p>
635              </td>
636</tr>
637<tr>
638<td>
639                <p>
640                  Evaluation Error
641                </p>
642              </td>
643<td>
644                <p>
645                  boost::math::policies::evaluation_error&lt;<span class="emphasis"><em>action</em></span>&gt;
646                </p>
647              </td>
648<td>
649                <p>
650                  Raised when the result of the function is well defined and finite,
651                  but we were unable to compute it. Typically this occurs when an
652                  iterative method fails to converge. Of course ideally this error
653                  should never be raised: feel free to report it as a bug if it is!
654                </p>
655                <p>
656                  Defaults to <code class="computeroutput"><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">&lt;</span><span class="identifier">throw_on_error</span><span class="special">&gt;</span></code>
657                </p>
658                <p>
659                  When the action is <span class="emphasis"><em>throw_on_error</em></span> then throws
660                  <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">evaluation_error</span></code>
661                </p>
662              </td>
663</tr>
664<tr>
665<td>
666                <p>
667                  Indeterminate Result Error
668                </p>
669              </td>
670<td>
671                <p>
672                  boost::math::policies::indeterminate_result_error&lt;<span class="emphasis"><em>action</em></span>&gt;
673                </p>
674              </td>
675<td>
676                <p>
677                  Raised when the result of a function is not defined for the values
678                  that were passed to it.
679                </p>
680                <p>
681                  Defaults to <code class="computeroutput"><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">indeterminate_result_error</span><span class="special">&lt;</span><span class="identifier">ignore_error</span><span class="special">&gt;</span></code>
682                </p>
683                <p>
684                  When the action is <span class="emphasis"><em>throw_on_error</em></span> then throws
685                  <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">domain_error</span></code>
686                </p>
687              </td>
688</tr>
689</tbody>
690</table></div>
691<h5>
692<a name="math_toolkit.pol_ref.error_handling_policies.h6"></a>
693        <span class="phrase"><a name="math_toolkit.pol_ref.error_handling_policies.examples"></a></span><a class="link" href="error_handling_policies.html#math_toolkit.pol_ref.error_handling_policies.examples">Examples</a>
694      </h5>
695<p>
696        Suppose we want a call to <code class="computeroutput"><span class="identifier">tgamma</span></code>
697        to behave in a C-compatible way and set global <code class="computeroutput"><span class="special">::</span><span class="identifier">errno</span></code> rather than throw an exception, we
698        can achieve this at the call site using:
699      </p>
700<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">gamma</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
701<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>
702
703<span class="comment">//using namespace boost::math::policies; may also be convenient.</span>
704<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>
705<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>
706<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>
707<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>
708<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>
709<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>
710<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>
711
712<span class="comment">// Define a policy:</span>
713<span class="keyword">typedef</span> <span class="identifier">policy</span><span class="special">&lt;</span>
714  <span class="identifier">domain_error</span><span class="special">&lt;</span><span class="identifier">errno_on_error</span><span class="special">&gt;,</span>
715  <span class="identifier">pole_error</span><span class="special">&lt;</span><span class="identifier">errno_on_error</span><span class="special">&gt;,</span>
716  <span class="identifier">overflow_error</span><span class="special">&lt;</span><span class="identifier">errno_on_error</span><span class="special">&gt;,</span>
717  <span class="identifier">evaluation_error</span><span class="special">&lt;</span><span class="identifier">errno_on_error</span><span class="special">&gt;</span>
718<span class="special">&gt;</span> <span class="identifier">my_policy</span><span class="special">;</span>
719
720<span class="keyword">double</span> <span class="identifier">my_value</span> <span class="special">=</span> <span class="number">0.</span><span class="special">;</span> <span class="comment">// </span>
721
722<span class="comment">// Call the function applying my_policy:</span>
723<span class="keyword">double</span> <span class="identifier">t1</span> <span class="special">=</span> <span class="identifier">tgamma</span><span class="special">(</span><span class="identifier">my_value</span><span class="special">,</span> <span class="identifier">my_policy</span><span class="special">());</span>
724
725<span class="comment">// Alternatively (and equivalently) we could use helpful function</span>
726<span class="comment">// make_policy and define everything at the call site:</span>
727<span class="keyword">double</span> <span class="identifier">t2</span> <span class="special">=</span> <span class="identifier">tgamma</span><span class="special">(</span><span class="identifier">my_value</span><span class="special">,</span>
728  <span class="identifier">make_policy</span><span class="special">(</span>
729    <span class="identifier">domain_error</span><span class="special">&lt;</span><span class="identifier">errno_on_error</span><span class="special">&gt;(),</span>
730    <span class="identifier">pole_error</span><span class="special">&lt;</span><span class="identifier">errno_on_error</span><span class="special">&gt;(),</span>
731    <span class="identifier">overflow_error</span><span class="special">&lt;</span><span class="identifier">errno_on_error</span><span class="special">&gt;(),</span>
732    <span class="identifier">evaluation_error</span><span class="special">&lt;</span><span class="identifier">errno_on_error</span><span class="special">&gt;()</span> <span class="special">)</span>
733  <span class="special">);</span>
734</pre>
735<p>
736        Suppose we want a statistical distribution to return infinities, rather than
737        throw exceptions, then we can use:
738      </p>
739<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">normal</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
740<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">normal_distribution</span><span class="special">;</span>
741
742<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>
743
744<span class="comment">// Define a specific policy:</span>
745<span class="keyword">typedef</span> <span class="identifier">policy</span><span class="special">&lt;</span>
746      <span class="identifier">overflow_error</span><span class="special">&lt;</span><span class="identifier">ignore_error</span><span class="special">&gt;</span>
747      <span class="special">&gt;</span> <span class="identifier">my_policy</span><span class="special">;</span>
748
749<span class="comment">// Define the distribution, using my_policy:</span>
750<span class="keyword">typedef</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">my_norm</span><span class="special">;</span>
751
752<span class="comment">// Construct a my_norm distribution, using default mean and standard deviation,</span>
753<span class="comment">// and get a 0.05 or 5% quantile:</span>
754<span class="keyword">double</span> <span class="identifier">q</span> <span class="special">=</span> <span class="identifier">quantile</span><span class="special">(</span><span class="identifier">my_norm</span><span class="special">(),</span> <span class="number">0.05</span><span class="special">);</span> <span class="comment">// = -1.64485</span>
755</pre>
756</div>
757<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
758<td align="left"></td>
759<td align="right"><div class="copyright-footer">Copyright © 2006-2019 Nikhar
760      Agrawal, Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos,
761      Hubert Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Matthew Pulver, Johan
762      Råde, Gautam Sewani, Benjamin Sobotta, Nicholas Thompson, Thijs van den Berg,
763      Daryle Walker and Xiaogang Zhang<p>
764        Distributed under the Boost Software License, Version 1.0. (See accompanying
765        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>)
766      </p>
767</div></td>
768</tr></table>
769<hr>
770<div class="spirit-nav">
771<a accesskey="p" href="../pol_ref.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../pol_ref.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="internal_promotion.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
772</div>
773</body>
774</html>
775