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 & 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<T>::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<T>::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<T>::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"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></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">&</span> <span class="identifier">val</span><span class="special">);</span> 416 417<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></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">&</span> <span class="identifier">val</span><span class="special">);</span> 419 420<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></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">&</span> <span class="identifier">val</span><span class="special">);</span> 422 423<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></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">&</span> <span class="identifier">val</span><span class="special">);</span> 425 426<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></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">&</span> <span class="identifier">val</span><span class="special">);</span> 428 429<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></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">&</span> <span class="identifier">val</span><span class="special">);</span> 431 432<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></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">&</span> <span class="identifier">val</span><span class="special">);</span> 434 435<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">></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">&</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<<span class="emphasis"><em>action</em></span>> 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"><</span><span class="identifier">throw_on_error</span><span class="special">></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<<span class="emphasis"><em>action</em></span>> 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"><</span><span class="identifier">throw_on_error</span><span class="special">></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<<span class="emphasis"><em>action</em></span>> 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"><</span><span class="identifier">throw_on_error</span><span class="special">></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<<span class="emphasis"><em>action</em></span>> 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"><</span><span class="identifier">ignore_error</span><span class="special">></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<<span class="emphasis"><em>action</em></span>> 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"><</span><span class="identifier">ignore_error</span><span class="special">></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<<span class="emphasis"><em>action</em></span>> 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"><</span><span class="identifier">throw_on_error</span><span class="special">></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<<span class="emphasis"><em>action</em></span>> 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"><</span><span class="identifier">throw_on_error</span><span class="special">></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<<span class="emphasis"><em>action</em></span>> 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"><</span><span class="identifier">ignore_error</span><span class="special">></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"><</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> 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"><</span> 714 <span class="identifier">domain_error</span><span class="special"><</span><span class="identifier">errno_on_error</span><span class="special">>,</span> 715 <span class="identifier">pole_error</span><span class="special"><</span><span class="identifier">errno_on_error</span><span class="special">>,</span> 716 <span class="identifier">overflow_error</span><span class="special"><</span><span class="identifier">errno_on_error</span><span class="special">>,</span> 717 <span class="identifier">evaluation_error</span><span class="special"><</span><span class="identifier">errno_on_error</span><span class="special">></span> 718<span class="special">></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"><</span><span class="identifier">errno_on_error</span><span class="special">>(),</span> 730 <span class="identifier">pole_error</span><span class="special"><</span><span class="identifier">errno_on_error</span><span class="special">>(),</span> 731 <span class="identifier">overflow_error</span><span class="special"><</span><span class="identifier">errno_on_error</span><span class="special">>(),</span> 732 <span class="identifier">evaluation_error</span><span class="special"><</span><span class="identifier">errno_on_error</span><span class="special">>()</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"><</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">></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"><</span> 746 <span class="identifier">overflow_error</span><span class="special"><</span><span class="identifier">ignore_error</span><span class="special">></span> 747 <span class="special">></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"><</span><span class="keyword">double</span><span class="special">,</span> <span class="identifier">my_policy</span><span class="special">></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