3 <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
4 <title>Floating point comparison</title>
5 <link rel="stylesheet" href="../../../boostbook.css" type="text/css">
6 <meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
7 <link rel="home" href="../../../index.html" title="Boost.Test">
8 <link rel="up" href="../extended_comparison.html" title="Extended comparisons support">
9 <link rel="prev" href="../extended_comparison.html" title="Extended comparisons support">
10 <link rel="next" href="floating_point/customizing_for_tolerance.html" title="Enabling tolerance for user-defined types">
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>
22 <div class="spirit-nav">
23 <a accesskey="p" href="../extended_comparison.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../extended_comparison.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="floating_point/customizing_for_tolerance.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
26 <div class="titlepage"><div><div><h4 class="title">
27 <a name="boost_test.testing_tools.extended_comparison.floating_point"></a><a class="link" href="floating_point.html" title="Floating point comparison">Floating
29 </h4></div></div></div>
30 <div class="toc"><dl class="toc">
31 <dt><span class="section"><a href="floating_point/customizing_for_tolerance.html">Enabling
32 tolerance for user-defined types</a></span></dt>
33 <dt><span class="section"><a href="floating_point/floating_points_comparison_impl.html">Tolerance-based
34 comparisons</a></span></dt>
35 <dt><span class="section"><a href="floating_point/floating_points_comparison_theory.html">Theory
36 behind floating point comparisons</a></span></dt>
39 Unless specified otherwise, when a value of floating-point type is compared
40 inside a <a class="link" href="../../utf_reference/testing_tool_ref/assertion_boost_test_universal_macro.html" title="BOOST_TEST"><code class="computeroutput"><span class="identifier">BOOST_TEST</span></code></a> assertion, operators
41 <code class="computeroutput"><span class="special">==</span></code>, <code class="computeroutput"><span class="special">!=</span></code>
42 , <code class="computeroutput"><span class="special"><</span></code> etc. defined for this
43 type are used. However for floating point type, in most cases what is needed
44 is not an <span class="emphasis"><em>exact</em></span> equality (or inequality), but a verification
45 that two numbers are <span class="emphasis"><em>sufficiently close</em></span> or <span class="emphasis"><em>sufficiently
46 different</em></span>. For that purpose, a <span class="bold"><strong>tolerance</strong></span>
47 parameter that will instruct the framework what is considered <span class="emphasis"><em>sufficiently
48 close</em></span> needs to provided.
50 <div class="note"><table border="0" summary="Note">
52 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../../doc/src/images/note.png"></td>
53 <th align="left">Note</th>
55 <tr><td align="left" valign="top"><p>
56 How the tolerance parameter is processed in detail is described <a class="link" href="floating_point/floating_points_comparison_impl.html" title="Tolerance-based comparisons">here</a>.
60 <a name="boost_test.testing_tools.extended_comparison.floating_point.h0"></a>
61 <span class="phrase"><a name="boost_test.testing_tools.extended_comparison.floating_point.test_unit_tolerance"></a></span><a class="link" href="floating_point.html#boost_test.testing_tools.extended_comparison.floating_point.test_unit_tolerance">Test-unit
65 It is possible to define a per-<a class="link" href="../../section_glossary.html#ref_test_unit">test unit</a>
66 tolerance for a given floating point type by using <a class="link" href="../../tests_organization/decorators.html" title="Decorators">decorator</a>
67 <a class="link" href="../../utf_reference/testing_tool_ref/decorator_tolerance.html" title="tolerance (decorator)"><code class="computeroutput"><span class="identifier">tolerance</span></code></a>:
70 <a name="boost_test.testing_tools.extended_comparison.floating_point.h1"></a>
71 <span class="phrase"><a name="boost_test.testing_tools.extended_comparison.floating_point.example_descr"></a></span><a class="link" href="floating_point.html#boost_test.testing_tools.extended_comparison.floating_point.example_descr">Example:
72 specifying tolerance per test case</a>
74 <div class="informaltable"><table class="table">
75 <colgroup><col></colgroup>
82 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="preprocessor">#define</span> <span class="identifier">BOOST_TEST_MODULE</span> <span class="identifier">tolerance_01</span>
83 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">test</span><span class="special">/</span><span class="identifier">included</span><span class="special">/</span><span class="identifier">unit_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
84 <span class="keyword">namespace</span> <span class="identifier">utf</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">unit_test</span><span class="special">;</span>
86 <span class="identifier">BOOST_AUTO_TEST_CASE</span><span class="special">(</span><span class="identifier">test1</span><span class="special">,</span> <span class="special">*</span> <span class="identifier">utf</span><span class="special">::</span><span class="identifier">tolerance</span><span class="special">(</span><span class="number">0.00001</span><span class="special">))</span>
87 <span class="special">{</span>
88 <span class="keyword">double</span> <span class="identifier">x</span> <span class="special">=</span> <span class="number">10.0000000</span><span class="special">;</span>
89 <span class="keyword">double</span> <span class="identifier">y</span> <span class="special">=</span> <span class="number">10.0000001</span><span class="special">;</span>
90 <span class="keyword">double</span> <span class="identifier">z</span> <span class="special">=</span> <span class="number">10.001</span><span class="special">;</span>
91 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">x</span> <span class="special">==</span> <span class="identifier">y</span><span class="special">);</span> <span class="comment">// irrelevant difference</span>
92 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">x</span> <span class="special">==</span> <span class="identifier">z</span><span class="special">);</span> <span class="comment">// relevant difference</span>
93 <span class="special">}</span>
97 <div class="informaltable"><table class="table">
98 <colgroup><col></colgroup>
105 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="special">></span> <span class="identifier">tolerance_01</span>
106 <span class="identifier">Running</span> <span class="number">1</span> <span class="identifier">test</span> <span class="keyword">case</span><span class="special">...</span>
107 <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">(</span><span class="number">11</span><span class="special">):</span> <span class="identifier">error</span><span class="special">:</span> <span class="identifier">in</span> <span class="string">"test1"</span><span class="special">:</span> <span class="identifier">check</span> <span class="identifier">x</span> <span class="special">==</span> <span class="identifier">z</span> <span class="identifier">has</span> <span class="identifier">failed</span> <span class="special">[</span><span class="number">10</span> <span class="special">!=</span> <span class="number">10.000999999999999</span><span class="special">].</span> <span class="identifier">Relative</span> <span class="identifier">difference</span> <span class="identifier">exceeds</span> <span class="identifier">tolerance</span> <span class="special">[</span><span class="number">0.0001</span> <span class="special">></span> <span class="number">1e-005</span><span class="special">]</span>
109 <span class="special">***</span> <span class="number">1</span> <span class="identifier">failure</span> <span class="identifier">is</span> <span class="identifier">detected</span> <span class="identifier">in</span> <span class="identifier">the</span> <span class="identifier">test</span> <span class="identifier">module</span> <span class="string">"tolerance_01"</span>
114 <a name="boost_test.testing_tools.extended_comparison.floating_point.h2"></a>
115 <span class="phrase"><a name="boost_test.testing_tools.extended_comparison.floating_point.assertion_tolerance"></a></span><a class="link" href="floating_point.html#boost_test.testing_tools.extended_comparison.floating_point.assertion_tolerance">Assertion
119 It is possible to specify floating point comparison tolerance per single
120 assertion, by providing the <span class="emphasis"><em>manipulator</em></span> <code class="computeroutput"><a class="link" href="../../../boost/test_tools/tolerance.html" title="Function tolerance">boost::test_tools::tolerance</a></code>
121 as the second argument to <a class="link" href="../../utf_reference/testing_tool_ref/assertion_boost_test_universal_macro.html" title="BOOST_TEST"><code class="computeroutput"><span class="identifier">BOOST_TEST</span></code></a>:
124 <a name="boost_test.testing_tools.extended_comparison.floating_point.h3"></a>
125 <span class="phrase"><a name="boost_test.testing_tools.extended_comparison.floating_point.example_descr0"></a></span><a class="link" href="floating_point.html#boost_test.testing_tools.extended_comparison.floating_point.example_descr0">Example:
126 specifying tolerance per assertion</a>
128 <div class="informaltable"><table class="table">
129 <colgroup><col></colgroup>
136 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="preprocessor">#define</span> <span class="identifier">BOOST_TEST_MODULE</span> <span class="identifier">tolerance_02</span>
137 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">test</span><span class="special">/</span><span class="identifier">included</span><span class="special">/</span><span class="identifier">unit_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
138 <span class="keyword">namespace</span> <span class="identifier">utf</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">unit_test</span><span class="special">;</span>
139 <span class="keyword">namespace</span> <span class="identifier">tt</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">test_tools</span><span class="special">;</span>
141 <span class="identifier">BOOST_AUTO_TEST_CASE</span><span class="special">(</span><span class="identifier">test1</span><span class="special">,</span> <span class="special">*</span> <span class="identifier">utf</span><span class="special">::</span><span class="identifier">tolerance</span><span class="special">(</span><span class="number">0.00001</span><span class="special">))</span>
142 <span class="special">{</span>
143 <span class="keyword">double</span> <span class="identifier">x</span> <span class="special">=</span> <span class="number">10.0000000</span><span class="special">;</span>
144 <span class="keyword">double</span> <span class="identifier">y</span> <span class="special">=</span> <span class="number">10.0000001</span><span class="special">;</span>
145 <span class="keyword">double</span> <span class="identifier">z</span> <span class="special">=</span> <span class="number">10.001</span><span class="special">;</span>
146 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">x</span> <span class="special">==</span> <span class="identifier">y</span><span class="special">);</span> <span class="comment">// irrelevant by default</span>
147 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">x</span> <span class="special">==</span> <span class="identifier">y</span><span class="special">,</span> <span class="identifier">tt</span><span class="special">::</span><span class="identifier">tolerance</span><span class="special">(</span><span class="number">0.0</span><span class="special">));</span>
149 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">x</span> <span class="special">==</span> <span class="identifier">z</span><span class="special">);</span> <span class="comment">// relevant by default</span>
150 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">x</span> <span class="special">==</span> <span class="identifier">z</span><span class="special">,</span> <span class="identifier">tt</span><span class="special">::</span><span class="identifier">tolerance</span><span class="special">(</span><span class="number">0.001</span><span class="special">));</span>
151 <span class="special">}</span>
155 <div class="informaltable"><table class="table">
156 <colgroup><col></colgroup>
163 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="special">></span> <span class="identifier">tolerance_02</span>
164 <span class="identifier">Running</span> <span class="number">1</span> <span class="identifier">test</span> <span class="keyword">case</span><span class="special">...</span>
165 <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">(</span><span class="number">12</span><span class="special">):</span> <span class="identifier">error</span><span class="special">:</span> <span class="identifier">in</span> <span class="string">"test1"</span><span class="special">:</span> <span class="identifier">check</span> <span class="identifier">x</span> <span class="special">==</span> <span class="identifier">y</span> <span class="identifier">has</span> <span class="identifier">failed</span> <span class="special">[</span><span class="number">10</span> <span class="special">!=</span> <span class="number">10.000000099999999</span><span class="special">]</span>
166 <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">(</span><span class="number">14</span><span class="special">):</span> <span class="identifier">error</span><span class="special">:</span> <span class="identifier">in</span> <span class="string">"test1"</span><span class="special">:</span> <span class="identifier">check</span> <span class="identifier">x</span> <span class="special">==</span> <span class="identifier">z</span> <span class="identifier">has</span> <span class="identifier">failed</span> <span class="special">[</span><span class="number">10</span> <span class="special">!=</span> <span class="number">10.000999999999999</span><span class="special">].</span> <span class="identifier">Relative</span> <span class="identifier">difference</span> <span class="identifier">exceeds</span> <span class="identifier">tolerance</span> <span class="special">[</span><span class="number">0.0001</span> <span class="special">></span> <span class="number">1e-005</span><span class="special">]</span>
168 <span class="special">***</span> <span class="number">2</span> <span class="identifier">failures</span> <span class="identifier">are</span> <span class="identifier">detected</span> <span class="identifier">in</span> <span class="identifier">the</span> <span class="identifier">test</span> <span class="identifier">module</span> <span class="string">"tolerance_02"</span>
172 <div class="caution"><table border="0" summary="Caution">
174 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Caution]" src="../../../../../../../doc/src/images/caution.png"></td>
175 <th align="left">Caution</th>
177 <tr><td align="left" valign="top"><p>
178 Manipulators requires a compiler that supports variadic macros, <code class="computeroutput"><span class="keyword">auto</span></code> for type deduction and <code class="computeroutput"><span class="keyword">decltype</span></code>. These are C++11 features, but
179 are also available on some pre-C++11 compilers. On compilers that are
180 lacking these features, resort to defining tolerance per test unit or
181 to compatibility test assertions: <a class="link" href="../../utf_reference/testing_tool_ref/assertion_boost_level_close.html" title="BOOST_<level>_CLOSE"><code class="computeroutput"><span class="identifier">BOOST_CHECK_CLOSE</span></code></a> and <a class="link" href="../../utf_reference/testing_tool_ref/assertion_boost_level_small.html" title="BOOST_<level>_SMALL"><code class="computeroutput"><span class="identifier">BOOST_CHECK_SMALL</span></code></a>.
185 <a name="boost_test.testing_tools.extended_comparison.floating_point.h4"></a>
186 <span class="phrase"><a name="boost_test.testing_tools.extended_comparison.floating_point.tolerance_expressed_in_percentag"></a></span><a class="link" href="floating_point.html#boost_test.testing_tools.extended_comparison.floating_point.tolerance_expressed_in_percentag">Tolerance
187 expressed in percentage</a>
190 It is possible to specify the tolerance as percentage. At test unit level,
191 the decorator syntax is:
193 <pre class="programlisting"><span class="special">*</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">unit_test</span><span class="special">::</span><span class="identifier">tolerance</span><span class="special">(</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">test_tools</span><span class="special">::</span><span class="identifier">fpc</span><span class="special">::</span><span class="identifier">percent_tolerance</span><span class="special">(</span><span class="number">2.0</span><span class="special">)</span> <span class="special">)</span>
194 <span class="comment">// equivalent to: boost::unit_test::tolerance( 2.0 / 100 )</span>
197 At assertion level, the manipulator syntax is:
199 <pre class="programlisting"><span class="number">2.0</span><span class="special">%</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">test_tools</span><span class="special">::</span><span class="identifier">tolerance</span><span class="special">()</span>
200 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">test_tools</span><span class="special">::</span><span class="identifier">tolerance</span><span class="special">(</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">test_tools</span><span class="special">::</span><span class="identifier">fpc</span><span class="special">::</span><span class="identifier">percent_tolerance</span><span class="special">(</span><span class="number">2.0</span><span class="special">)</span> <span class="special">)</span>
201 <span class="comment">// both equivalent to: boost::test_tools::tolerance( 2.0 / 100 )</span>
204 <a name="boost_test.testing_tools.extended_comparison.floating_point.h5"></a>
205 <span class="phrase"><a name="boost_test.testing_tools.extended_comparison.floating_point.type_of_the_tolerance"></a></span><a class="link" href="floating_point.html#boost_test.testing_tools.extended_comparison.floating_point.type_of_the_tolerance">Type
209 Manipulator <code class="computeroutput"><span class="identifier">tolerance</span></code> specifies
210 the tolerance only for a single floating-point type. This type is deduced
211 from form the numeric value passed along the manipulator:
213 <div class="informaltable"><table class="table">
234 <code class="computeroutput"><span class="identifier">tolerance</span><span class="special">(</span><span class="number">0.5</span><span class="special">)</span></code>
239 tolerance for type <code class="computeroutput"><span class="keyword">double</span></code>
247 <code class="computeroutput"><span class="identifier">tolerance</span><span class="special">(</span><span class="keyword">float</span><span class="special">(</span><span class="number">0.5</span><span class="special">))</span></code>
252 tolerance for type <code class="computeroutput"><span class="keyword">float</span></code>
260 <code class="computeroutput"><span class="identifier">tolerance</span><span class="special">(</span><span class="number">0.5f</span><span class="special">)</span></code>
265 tolerance for type <code class="computeroutput"><span class="keyword">float</span></code>
273 <code class="computeroutput"><span class="identifier">tolerance</span><span class="special">(</span><span class="number">0.5L</span><span class="special">)</span></code>
278 tolerance for type <code class="computeroutput"><span class="keyword">long</span>
279 <span class="keyword">double</span></code> changed to 0.5
286 <code class="computeroutput"><span class="identifier">tolerance</span><span class="special">(</span><span class="identifier">Decimal</span><span class="special">(</span><span class="string">"0.5"</span><span class="special">))</span></code>
291 tolerance for a user-defined type <code class="computeroutput"><span class="identifier">Decimal</span></code>
292 changed to the supplied value
299 <code class="computeroutput"><span class="number">5.0</span><span class="special">%</span>
300 <span class="identifier">tolerance</span><span class="special">()</span></code>
305 tolerance for type <code class="computeroutput"><span class="keyword">double</span></code>
306 changed to 0.05 (<code class="computeroutput"><span class="number">5.0</span> <span class="special">/</span> <span class="number">100</span></code>)
313 <code class="computeroutput"><span class="number">5.0f</span><span class="special">%</span>
314 <span class="identifier">tolerance</span><span class="special">()</span></code>
319 tolerance for type <code class="computeroutput"><span class="keyword">float</span></code>
327 <code class="computeroutput"><span class="identifier">Decimal</span><span class="special">(</span><span class="string">"5.0"</span><span class="special">)%</span>
328 <span class="identifier">tolerance</span><span class="special">()</span></code>
333 tolerance for type <code class="computeroutput"><span class="identifier">Decimal</span></code>
334 changed to value <code class="computeroutput"><span class="special">(</span><span class="identifier">Decimal</span><span class="special">(</span><span class="string">"5.0"</span><span class="special">)</span>
335 <span class="special">/</span> <span class="number">100</span><span class="special">)</span></code>
342 This is also the case for decorator <code class="computeroutput"><span class="identifier">tolerance</span></code>.
343 In the case of the decorator however, it is possible to apply multiple
344 decorators <code class="computeroutput"><span class="identifier">tolerance</span></code> defining
345 the tolerance for different types.
348 When values of two different floating point types <code class="computeroutput"><span class="identifier">T</span></code>
349 and <code class="computeroutput"><span class="identifier">U</span></code> are compared, <a class="link" href="../../utf_reference/testing_tool_ref/assertion_boost_test_universal_macro.html" title="BOOST_TEST"><code class="computeroutput"><span class="identifier">BOOST_TEST</span></code></a> uses the tolerance
350 specified for type <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">common_type</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">U</span><span class="special">>::</span><span class="identifier">type</span></code>. For instance, when setting a tolerance
351 for mixed <code class="computeroutput"><span class="keyword">float</span></code>-to-<code class="computeroutput"><span class="keyword">double</span></code> comparison, the tolerance for type
352 <code class="computeroutput"><span class="keyword">double</span></code> needs to be set.
355 Given two floating point types <code class="computeroutput"><span class="identifier">T</span></code>
356 and <code class="computeroutput"><span class="identifier">U</span></code> and their common
357 type <code class="computeroutput"><span class="identifier">C</span></code>, the tolerance specified
358 for type <code class="computeroutput"><span class="identifier">C</span></code> is applied only
359 when types <code class="computeroutput"><span class="identifier">T</span></code> and <code class="computeroutput"><span class="identifier">U</span></code> appear as sub-expressions of the full
360 expression inside assertion <a class="link" href="../../utf_reference/testing_tool_ref/assertion_boost_test_universal_macro.html" title="BOOST_TEST"><code class="computeroutput"><span class="identifier">BOOST_TEST</span></code></a>. It is not applied
361 when <code class="computeroutput"><span class="identifier">T</span></code> and <code class="computeroutput"><span class="identifier">U</span></code> are compared inside a function invoked
362 during the evaluation of the expression:
365 <a name="boost_test.testing_tools.extended_comparison.floating_point.h6"></a>
366 <span class="phrase"><a name="boost_test.testing_tools.extended_comparison.floating_point.example_descr1"></a></span><a class="link" href="floating_point.html#boost_test.testing_tools.extended_comparison.floating_point.example_descr1">Example:
367 tolerance applied to different types</a>
369 <div class="informaltable"><table class="table">
370 <colgroup><col></colgroup>
377 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="preprocessor">#define</span> <span class="identifier">BOOST_TEST_MODULE</span> <span class="identifier">tolerance_05</span>
378 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">test</span><span class="special">/</span><span class="identifier">included</span><span class="special">/</span><span class="identifier">unit_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
379 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">optional</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
380 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">optional</span><span class="special">/</span><span class="identifier">optional_io</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
382 <span class="identifier">BOOST_AUTO_TEST_CASE</span><span class="special">(</span><span class="identifier">test</span><span class="special">,</span> <span class="special">*</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">unit_test</span><span class="special">::</span><span class="identifier">tolerance</span><span class="special">(</span><span class="number">0.02</span><span class="special">))</span>
383 <span class="special">{</span>
384 <span class="keyword">double</span> <span class="identifier">d1</span> <span class="special">=</span> <span class="number">1.00</span><span class="special">,</span> <span class="identifier">d2</span> <span class="special">=</span> <span class="number">0.99</span><span class="special">;</span>
385 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">optional</span><span class="special"><</span><span class="keyword">double</span><span class="special">></span> <span class="identifier">o1</span> <span class="special">=</span> <span class="number">1.00</span><span class="special">,</span> <span class="identifier">o2</span> <span class="special">=</span> <span class="number">0.99</span><span class="special">;</span>
387 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">d1</span> <span class="special">==</span> <span class="identifier">d2</span><span class="special">);</span> <span class="comment">// with tolerance (double vs. double)</span>
388 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">o1</span> <span class="special">==</span> <span class="identifier">o2</span><span class="special">);</span> <span class="comment">// without tolerance (optional vs. optional)</span>
389 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">o1</span> <span class="special">==</span> <span class="identifier">d2</span><span class="special">);</span> <span class="comment">// without tolerance (optional vs. double)</span>
390 <span class="identifier">BOOST_TEST</span><span class="special">(*</span><span class="identifier">o1</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">o2</span><span class="special">);</span> <span class="comment">// with tolerance (double vs. double)</span>
391 <span class="special">}</span>
395 <div class="informaltable"><table class="table">
396 <colgroup><col></colgroup>
403 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="special">></span> <span class="identifier">tolerance_05</span>
404 <span class="identifier">Running</span> <span class="number">1</span> <span class="identifier">test</span> <span class="keyword">case</span><span class="special">...</span>
405 <span class="special">../</span><span class="identifier">doc</span><span class="special">/</span><span class="identifier">examples</span><span class="special">/</span><span class="identifier">tolerance_05</span><span class="special">.</span><span class="identifier">run</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">(</span><span class="number">20</span><span class="special">):</span> <span class="identifier">error</span><span class="special">:</span> <span class="identifier">in</span> <span class="string">"test"</span><span class="special">:</span> <span class="identifier">check</span> <span class="identifier">o1</span> <span class="special">==</span> <span class="identifier">o2</span> <span class="identifier">has</span> <span class="identifier">failed</span> <span class="special">[</span> <span class="number">1</span> <span class="special">!=</span> <span class="number">0.99</span><span class="special">]</span>
406 <span class="special">../</span><span class="identifier">doc</span><span class="special">/</span><span class="identifier">examples</span><span class="special">/</span><span class="identifier">tolerance_05</span><span class="special">.</span><span class="identifier">run</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">(</span><span class="number">21</span><span class="special">):</span> <span class="identifier">error</span><span class="special">:</span> <span class="identifier">in</span> <span class="string">"test"</span><span class="special">:</span> <span class="identifier">check</span> <span class="identifier">o1</span> <span class="special">==</span> <span class="identifier">d2</span> <span class="identifier">has</span> <span class="identifier">failed</span> <span class="special">[</span> <span class="number">1</span> <span class="special">!=</span> <span class="number">0.98999999999999999</span><span class="special">]</span>
408 <span class="special">***</span> <span class="number">2</span> <span class="identifier">failures</span> <span class="identifier">are</span> <span class="identifier">detected</span> <span class="identifier">in</span> <span class="identifier">the</span> <span class="identifier">test</span> <span class="identifier">module</span> <span class="string">"tolerance_05"</span>
413 <a name="boost_test.testing_tools.extended_comparison.floating_point.h7"></a>
414 <span class="phrase"><a name="boost_test.testing_tools.extended_comparison.floating_point.type_promotion_of_the_operands"></a></span><a class="link" href="floating_point.html#boost_test.testing_tools.extended_comparison.floating_point.type_promotion_of_the_operands">Type
415 promotion of the operands</a>
418 Given two types <code class="computeroutput"><span class="identifier">T</span></code> and
419 <code class="computeroutput"><span class="identifier">U</span></code> being compared inside
420 an assertion <a class="link" href="../../utf_reference/testing_tool_ref/assertion_boost_test_universal_macro.html" title="BOOST_TEST"><code class="computeroutput"><span class="identifier">BOOST_TEST</span></code></a>, tolerance based comparison
423 <div class="orderedlist"><ol class="orderedlist" type="1">
424 <li class="listitem">
425 whenever the types <code class="computeroutput"><span class="identifier">T</span></code>
426 and <code class="computeroutput"><span class="identifier">U</span></code> are both <a class="link" href="floating_point/customizing_for_tolerance.html" title="Enabling tolerance for user-defined types">tolerance
429 <li class="listitem">
430 whenever <code class="computeroutput"><span class="identifier">T</span></code> is <span class="emphasis"><em>tolerance</em></span>
431 based and <code class="computeroutput"><span class="identifier">U</span></code> is <span class="emphasis"><em>arithmetic</em></span>,
432 in the sense that <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special"><</span><span class="identifier">U</span><span class="special">>::</span><span class="identifier">value</span></code>
433 evaluates to <code class="computeroutput"><span class="keyword">true</span></code> (or
438 In all cases, the type of the tolerance is deduced as <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">common_type</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">U</span><span class="special">>::</span><span class="identifier">type</span></code>, and both type may be cast to this
441 <div class="note"><table border="0" summary="Note">
443 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../../doc/src/images/note.png"></td>
444 <th align="left">Note</th>
446 <tr><td align="left" valign="top">
448 This behavior has been introduced in Boost 1.70 / <span class="emphasis"><em>Unit Test
449 Framework</em></span> <a class="link" href="../../change_log.html#ref_CHANGE_LOG_3_10">3.10</a>.
450 Previously tolerance based comparison was used only when the type of
451 the two operands were tolerance based types, which was silently ignoring
452 the tolerance for expressions such as
454 <pre class="programlisting"><span class="keyword">double</span> <span class="identifier">x</span> <span class="special">=</span> <span class="number">1E-9</span><span class="special">;</span>
455 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">x</span> <span class="special">==</span> <span class="number">0</span><span class="special">);</span> <span class="comment">// U is int</span>
460 <a name="boost_test.testing_tools.extended_comparison.floating_point.h8"></a>
461 <span class="phrase"><a name="boost_test.testing_tools.extended_comparison.floating_point.example_descr2"></a></span><a class="link" href="floating_point.html#boost_test.testing_tools.extended_comparison.floating_point.example_descr2">Example:
462 operands type promotion</a>
464 <div class="informaltable"><table class="table">
465 <colgroup><col></colgroup>
472 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="preprocessor">#define</span> <span class="identifier">BOOST_TEST_MODULE</span> <span class="identifier">tolerance_06</span>
473 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">test</span><span class="special">/</span><span class="identifier">included</span><span class="special">/</span><span class="identifier">unit_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
474 <span class="keyword">namespace</span> <span class="identifier">utf</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">unit_test</span><span class="special">;</span>
475 <span class="keyword">namespace</span> <span class="identifier">tt</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">test_tools</span><span class="special">;</span>
477 <span class="identifier">BOOST_AUTO_TEST_CASE</span><span class="special">(</span><span class="identifier">test1</span><span class="special">,</span> <span class="special">*</span> <span class="identifier">utf</span><span class="special">::</span><span class="identifier">tolerance</span><span class="special">(</span><span class="number">0.1415</span> <span class="special">/</span> <span class="number">3</span><span class="special">))</span> <span class="comment">// == 0.047166667</span>
478 <span class="special">{</span>
479 <span class="keyword">double</span> <span class="identifier">x</span> <span class="special">=</span> <span class="number">3.141592404915836</span><span class="special">;</span>
480 <span class="comment">// x is 'double' which is tolerance based, 3 is 'int' which is arithmetic:</span>
481 <span class="comment">// tolerance based comparison will be used.</span>
482 <span class="comment">// Type of tolerance for this comparison will be boost::common_type<double, int>::type == double</span>
483 <span class="comment">// Value for this tolerance type is set by the decorator.</span>
484 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">x</span> <span class="special">==</span> <span class="number">3</span><span class="special">);</span>
485 <span class="special">}</span>
489 <div class="informaltable"><table class="table">
490 <colgroup><col></colgroup>
497 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="special">></span> <span class="identifier">tolerance_06</span>
498 <span class="identifier">Running</span> <span class="number">1</span> <span class="identifier">test</span> <span class="keyword">case</span><span class="special">...</span>
499 <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">(</span><span class="number">21</span><span class="special">):</span> <span class="identifier">error</span><span class="special">:</span> <span class="identifier">in</span> <span class="string">"test1"</span><span class="special">:</span> <span class="identifier">check</span> <span class="identifier">x</span> <span class="special">==</span> <span class="number">3</span> <span class="identifier">has</span> <span class="identifier">failed</span> <span class="special">[</span><span class="number">3.1415924049158361</span> <span class="special">!=</span> <span class="number">3</span><span class="special">].</span> <span class="identifier">Relative</span> <span class="identifier">difference</span> <span class="identifier">exceeds</span> <span class="identifier">tolerance</span> <span class="special">[</span><span class="number">0.0471975</span> <span class="special">></span> <span class="number">0.0471667</span><span class="special">]</span>
501 <span class="special">***</span> <span class="number">1</span> <span class="identifier">failure</span> <span class="identifier">is</span> <span class="identifier">detected</span> <span class="identifier">in</span> <span class="identifier">the</span> <span class="identifier">test</span> <span class="identifier">module</span> <span class="string">"tolerance_06"</span>
506 <a name="boost_test.testing_tools.extended_comparison.floating_point.h9"></a>
507 <span class="phrase"><a name="boost_test.testing_tools.extended_comparison.floating_point.other_relational_operators"></a></span><a class="link" href="floating_point.html#boost_test.testing_tools.extended_comparison.floating_point.other_relational_operators">Other
508 relational operators</a>
511 Finally, note that comparisons for tolerance are also applied to <code class="computeroutput"><span class="keyword">operator</span><span class="special"><</span></code>
512 with semantics <span class="emphasis"><em>less by more than some tolerance</em></span>, and
513 other relational operators. Also, the tolerance-based comparisons are involved
514 when a more complicated expression tree is processed within the assertion
515 body. The section on <a class="link" href="floating_point/floating_points_comparison_impl.html#boost_test.testing_tools.extended_comparison.floating_point.floating_points_comparison_impl.tolerance_in_operator">relational
516 operators</a> defines how <code class="computeroutput"><span class="keyword">operator</span><span class="special"><</span></code> relates to tolerance.
519 <a name="boost_test.testing_tools.extended_comparison.floating_point.h10"></a>
520 <span class="phrase"><a name="boost_test.testing_tools.extended_comparison.floating_point.example_descr3"></a></span><a class="link" href="floating_point.html#boost_test.testing_tools.extended_comparison.floating_point.example_descr3">Example:
521 tolerance applied in more complex expressions</a>
523 <div class="informaltable"><table class="table">
524 <colgroup><col></colgroup>
531 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="preprocessor">#define</span> <span class="identifier">BOOST_TEST_MODULE</span> <span class="identifier">tolerance_03</span>
532 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">test</span><span class="special">/</span><span class="identifier">included</span><span class="special">/</span><span class="identifier">unit_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
533 <span class="keyword">namespace</span> <span class="identifier">utf</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">unit_test</span><span class="special">;</span>
535 <span class="keyword">double</span> <span class="identifier">x</span> <span class="special">=</span> <span class="number">10.000000</span><span class="special">;</span>
536 <span class="keyword">double</span> <span class="identifier">d</span> <span class="special">=</span> <span class="number">0.000001</span><span class="special">;</span>
538 <span class="identifier">BOOST_AUTO_TEST_CASE</span><span class="special">(</span><span class="identifier">passing</span><span class="special">,</span> <span class="special">*</span> <span class="identifier">utf</span><span class="special">::</span><span class="identifier">tolerance</span><span class="special">(</span><span class="number">0.0001</span><span class="special">))</span>
539 <span class="special">{</span>
540 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">x</span> <span class="special">==</span> <span class="identifier">x</span> <span class="special">+</span> <span class="identifier">d</span><span class="special">);</span> <span class="comment">// equal with tolerance</span>
541 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">x</span> <span class="special">>=</span> <span class="identifier">x</span> <span class="special">+</span> <span class="identifier">d</span><span class="special">);</span> <span class="comment">// ==> greater-or-equal</span>
543 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">d</span> <span class="special">==</span> <span class="special">.</span><span class="number">0</span><span class="special">);</span> <span class="comment">// small with tolerance</span>
544 <span class="special">}</span>
546 <span class="identifier">BOOST_AUTO_TEST_CASE</span><span class="special">(</span><span class="identifier">failing</span><span class="special">,</span> <span class="special">*</span> <span class="identifier">utf</span><span class="special">::</span><span class="identifier">tolerance</span><span class="special">(</span><span class="number">0.0001</span><span class="special">))</span>
547 <span class="special">{</span>
548 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">x</span> <span class="special">-</span> <span class="identifier">d</span> <span class="special"><</span> <span class="identifier">x</span><span class="special">);</span> <span class="comment">// less, but still too close</span>
549 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">x</span> <span class="special">-</span> <span class="identifier">d</span> <span class="special">!=</span> <span class="identifier">x</span><span class="special">);</span> <span class="comment">// unequal but too close</span>
551 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">d</span> <span class="special">></span> <span class="special">.</span><span class="number">0</span><span class="special">);</span> <span class="comment">// positive, but too small</span>
552 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">d</span> <span class="special"><</span> <span class="special">.</span><span class="number">0</span><span class="special">);</span> <span class="comment">// not sufficiently negative</span>
553 <span class="special">}</span>
557 <div class="informaltable"><table class="table">
558 <colgroup><col></colgroup>
565 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="special">></span> <span class="identifier">tolerance_03</span>
566 <span class="identifier">Running</span> <span class="number">2</span> <span class="identifier">test</span> <span class="identifier">cases</span><span class="special">...</span>
567 <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">(</span><span class="number">18</span><span class="special">):</span> <span class="identifier">error</span><span class="special">:</span> <span class="identifier">in</span> <span class="string">"failing"</span><span class="special">:</span> <span class="identifier">check</span> <span class="identifier">x</span> <span class="special">-</span> <span class="identifier">d</span> <span class="special"><</span> <span class="identifier">x</span> <span class="identifier">has</span> <span class="identifier">failed</span> <span class="special">[</span><span class="number">10</span> <span class="special">-</span> <span class="number">1.0000000000000001e-05</span> <span class="special">>=</span> <span class="number">10</span><span class="special">].</span> <span class="identifier">Relative</span> <span class="identifier">difference</span> <span class="identifier">is</span> <span class="identifier">within</span> <span class="identifier">tolerance</span> <span class="special">[</span><span class="number">1e-06</span> <span class="special"><</span> <span class="number">0.001</span><span class="special">]</span>
568 <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">(</span><span class="number">19</span><span class="special">):</span> <span class="identifier">error</span><span class="special">:</span> <span class="identifier">in</span> <span class="string">"failing"</span><span class="special">:</span> <span class="identifier">check</span> <span class="identifier">x</span> <span class="special">-</span> <span class="identifier">d</span> <span class="special">!=</span> <span class="identifier">x</span> <span class="identifier">has</span> <span class="identifier">failed</span> <span class="special">[</span><span class="number">10</span> <span class="special">-</span> <span class="number">1.0000000000000001e-05</span> <span class="special">==</span> <span class="number">10</span><span class="special">].</span> <span class="identifier">Relative</span> <span class="identifier">difference</span> <span class="identifier">is</span> <span class="identifier">within</span> <span class="identifier">tolerance</span> <span class="special">[</span><span class="number">1e-06</span> <span class="special"><</span> <span class="number">0.001</span><span class="special">]</span>
569 <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">(</span><span class="number">21</span><span class="special">):</span> <span class="identifier">error</span><span class="special">:</span> <span class="identifier">in</span> <span class="string">"failing"</span><span class="special">:</span> <span class="identifier">check</span> <span class="identifier">d</span> <span class="special">></span> <span class="special">.</span><span class="number">0</span> <span class="identifier">has</span> <span class="identifier">failed</span> <span class="special">[</span><span class="number">1.0000000000000001e-05</span> <span class="special"><=</span> <span class="number">0</span><span class="special">].</span> <span class="identifier">Absolute</span> <span class="identifier">value</span> <span class="identifier">is</span> <span class="identifier">within</span> <span class="identifier">tolerance</span> <span class="special">[|</span><span class="number">1e-05</span><span class="special">|</span> <span class="special"><</span> <span class="number">0.001</span><span class="special">]</span>
570 <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">(</span><span class="number">22</span><span class="special">):</span> <span class="identifier">error</span><span class="special">:</span> <span class="identifier">in</span> <span class="string">"failing"</span><span class="special">:</span> <span class="identifier">check</span> <span class="identifier">d</span> <span class="special"><</span> <span class="special">.</span><span class="number">0</span> <span class="identifier">has</span> <span class="identifier">failed</span> <span class="special">[</span><span class="number">1.0000000000000001e-05</span> <span class="special">>=</span> <span class="number">0</span><span class="special">]</span>
572 <span class="special">***</span> <span class="number">4</span> <span class="identifier">failures</span> <span class="identifier">are</span> <span class="identifier">detected</span> <span class="identifier">in</span> <span class="identifier">the</span> <span class="identifier">test</span> <span class="identifier">module</span> <span class="string">"tolerance_03"</span>
577 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
578 <td align="left"></td>
579 <td align="right"><div class="copyright-footer">Copyright © 2001-2019 Boost.Test
581 Distributed under the Boost Software License, Version 1.0. (See accompanying
582 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>)
587 <div class="spirit-nav">
588 <a accesskey="p" href="../extended_comparison.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../extended_comparison.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="floating_point/customizing_for_tolerance.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>