Imported Upstream version 1.72.0
[platform/upstream/boost.git] / libs / math / doc / html / math_toolkit / pol_ref / error_handling_policies.html
1 <html>
2 <head>
3 <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
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.11.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 &#169; 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&#229;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>