• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<html>
2<head>
3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
4<title>Termination Condition Functors</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="../roots_noderiv.html" title="Root Finding Without Derivatives">
9<link rel="prev" href="brent.html" title="Brent-Decker Algorithm">
10<link rel="next" href="implementation.html" title="Implementation">
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="brent.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../roots_noderiv.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="implementation.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.roots_noderiv.root_termination"></a><a class="link" href="root_termination.html" title="Termination Condition Functors">Termination
28      Condition Functors</a>
29</h3></div></div></div>
30<pre class="programlisting"><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>
31<span class="keyword">struct</span> <span class="identifier">eps_tolerance</span>
32<span class="special">{</span>
33   <span class="identifier">eps_tolerance</span><span class="special">();</span>
34   <span class="identifier">eps_tolerance</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">bits</span><span class="special">);</span>
35   <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">()(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span><span class="keyword">const</span><span class="special">;</span>
36<span class="special">};</span>
37</pre>
38<p>
39        <code class="computeroutput"><span class="identifier">eps_tolerance</span></code> is the usual
40        termination condition used with these root finding functions. Its <code class="computeroutput"><span class="keyword">operator</span><span class="special">()</span></code>
41        will return true when the relative distance between <span class="emphasis"><em>a</em></span>
42        and <span class="emphasis"><em>b</em></span> is less than four times the machine epsilon for
43        T, or 2<sup>1-bits</sup>, whichever is the larger. In other words, you set <span class="emphasis"><em>bits</em></span>
44        to the number of bits of precision you want in the result. The minimal tolerance
45        of <span class="emphasis"><em>four times the machine epsilon of type T</em></span> is required
46        to ensure that we get back a bracketing interval, since this must clearly
47        be at greater than one epsilon in size. While in theory a maximum distance
48        of twice machine epsilon is possible to achieve, in practice this results
49        in a great deal of "thrashing" given that the function whose root
50        is being found can only ever be accurate to 1 epsilon at best.
51      </p>
52<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">equal_floor</span>
53<span class="special">{</span>
54   <span class="identifier">equal_floor</span><span class="special">();</span>
55   <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> <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">()(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span><span class="keyword">const</span><span class="special">;</span>
56<span class="special">};</span>
57</pre>
58<p>
59        This termination condition is used when you want to find an integer result
60        that is the <span class="emphasis"><em>floor</em></span> of the true root. It will terminate
61        as soon as both ends of the interval have the same <span class="emphasis"><em>floor</em></span>.
62      </p>
63<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">equal_ceil</span>
64<span class="special">{</span>
65   <span class="identifier">equal_ceil</span><span class="special">();</span>
66   <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> <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">()(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span><span class="keyword">const</span><span class="special">;</span>
67<span class="special">};</span>
68</pre>
69<p>
70        This termination condition is used when you want to find an integer result
71        that is the <span class="emphasis"><em>ceil</em></span> of the true root. It will terminate
72        as soon as both ends of the interval have the same <span class="emphasis"><em>ceil</em></span>.
73      </p>
74<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">equal_nearest_integer</span>
75<span class="special">{</span>
76   <span class="identifier">equal_nearest_integer</span><span class="special">();</span>
77   <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> <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">()(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&amp;</span> <span class="identifier">b</span><span class="special">)</span><span class="keyword">const</span><span class="special">;</span>
78<span class="special">};</span>
79</pre>
80<p>
81        This termination condition is used when you want to find an integer result
82        that is the <span class="emphasis"><em>closest</em></span> to the true root. It will terminate
83        as soon as both ends of the interval round to the same nearest integer.
84      </p>
85</div>
86<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
87<td align="left"></td>
88<td align="right"><div class="copyright-footer">Copyright © 2006-2019 Nikhar
89      Agrawal, Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos,
90      Hubert Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Matthew Pulver, Johan
91      Råde, Gautam Sewani, Benjamin Sobotta, Nicholas Thompson, Thijs van den Berg,
92      Daryle Walker and Xiaogang Zhang<p>
93        Distributed under the Boost Software License, Version 1.0. (See accompanying
94        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>)
95      </p>
96</div></td>
97</tr></table>
98<hr>
99<div class="spirit-nav">
100<a accesskey="p" href="brent.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../roots_noderiv.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="implementation.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
101</div>
102</body>
103</html>
104