3 <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
4 <title>Enabling tolerance for user-defined types</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="../floating_point.html" title="Floating point comparison">
9 <link rel="prev" href="../floating_point.html" title="Floating point comparison">
10 <link rel="next" href="floating_points_comparison_impl.html" title="Tolerance-based comparisons">
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="../floating_point.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../floating_point.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_points_comparison_impl.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
26 <div class="titlepage"><div><div><h5 class="title">
27 <a name="boost_test.testing_tools.extended_comparison.floating_point.customizing_for_tolerance"></a><a class="link" href="customizing_for_tolerance.html" title="Enabling tolerance for user-defined types">Enabling
28 tolerance for user-defined types</a>
29 </h5></div></div></div>
31 The <span class="emphasis"><em>Unit Test Framework</em></span> recognizes that a given
32 type <code class="computeroutput"><span class="identifier">T</span></code> is suitable for
33 tolerance-based comparisons using the expression <code class="computeroutput"><a class="link" href="../../../../boost/math/fpc/tolerance_based.html" title="Struct template tolerance_based">boost::math::fpc::tolerance_based</a></code><code class="computeroutput"><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span></code>.
34 This meta-function already returns <code class="computeroutput"><span class="keyword">true</span></code>
35 for built-in floating-point types as well as any other types that match
36 the following compile-time expression:
38 <pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">is_floating_point</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span> <span class="special">||</span>
39 <span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">is_specialized</span> <span class="special">&&</span>
40 <span class="special">!</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">is_integer</span> <span class="special">&&</span>
41 <span class="special">!</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">is_exact</span><span class="special">)</span>
44 If you require your type to also participate in tolerance-based comparisons,
45 regardless of the above expression, you can just specialize <code class="computeroutput"><a class="link" href="../../../../boost/math/fpc/tolerance_based.html" title="Struct template tolerance_based">boost::math::fpc::tolerance_based</a></code>
46 for your type directly, and derive it from <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">true_type</span></code>.
47 Your type does not even have to be a floating-point type provided that
48 it models concept <a class="link" href="customizing_for_tolerance.html#boost_test.testing_tools.extended_comparison.floating_point.customizing_for_tolerance.concept_tolerance_based"><code class="computeroutput"><span class="identifier">ToleranceCompatible</span></code></a>.
51 <a name="boost_test.testing_tools.extended_comparison.floating_point.customizing_for_tolerance.h0"></a>
52 <span class="phrase"><a name="boost_test.testing_tools.extended_comparison.floating_point.customizing_for_tolerance.example_descr"></a></span><a class="link" href="customizing_for_tolerance.html#boost_test.testing_tools.extended_comparison.floating_point.customizing_for_tolerance.example_descr">Example:
53 adapting user-defined types for tolerance-based comparison</a>
55 <div class="informaltable"><table class="table">
56 <colgroup><col></colgroup>
63 <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_04</span>
64 <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>
65 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">rational</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
66 <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>
67 <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>
69 <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">fpc</span> <span class="special">{</span>
71 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">I</span><span class="special">></span>
72 <span class="keyword">struct</span> <span class="identifier">tolerance_based</span><span class="special"><</span> <span class="identifier">rational</span><span class="special"><</span><span class="identifier">I</span><span class="special">></span> <span class="special">></span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">true_type</span><span class="special">{};</span>
74 <span class="special">}</span> <span class="special">}</span> <span class="special">}</span>
76 <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">rational</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">ratio</span><span class="special">;</span>
78 <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="identifier">ratio</span><span class="special">(</span><span class="number">1</span><span class="special">,</span> <span class="number">1000</span><span class="special">)))</span>
79 <span class="special">{</span>
80 <span class="identifier">ratio</span> <span class="identifier">x</span> <span class="special">(</span><span class="number">1002</span><span class="special">,</span> <span class="number">100</span><span class="special">);</span> <span class="comment">// 10.02</span>
81 <span class="identifier">ratio</span> <span class="identifier">y</span> <span class="special">(</span><span class="number">1001</span><span class="special">,</span> <span class="number">100</span><span class="special">);</span> <span class="comment">// 10.01</span>
82 <span class="identifier">ratio</span> <span class="identifier">z</span> <span class="special">(</span><span class="number">1000</span><span class="special">,</span> <span class="number">100</span><span class="special">);</span> <span class="comment">// 10.00</span>
84 <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 diff by default</span>
85 <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="identifier">ratio</span><span class="special">(</span><span class="number">1</span><span class="special">,</span> <span class="number">2000</span><span class="special">)));</span>
87 <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 diff by default</span>
88 <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="identifier">ratio</span><span class="special">(</span><span class="number">2</span><span class="special">,</span> <span class="number">1000</span><span class="special">)));</span>
89 <span class="special">}</span>
93 <div class="informaltable"><table class="table">
94 <colgroup><col></colgroup>
101 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="special">></span> <span class="identifier">tolerance_04</span>
102 <span class="identifier">Running</span> <span class="number">1</span> <span class="identifier">test</span> <span class="keyword">case</span><span class="special">...</span>
103 <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">(</span><span class="number">23</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">501</span><span class="special">/</span><span class="number">50</span> <span class="special">!=</span> <span class="number">1001</span><span class="special">/</span><span class="number">100</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">1</span><span class="special">/</span><span class="number">1001</span> <span class="special">></span> <span class="number">1</span><span class="special">/</span><span class="number">2000</span><span class="special">]</span>
104 <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">(</span><span class="number">26</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">501</span><span class="special">/</span><span class="number">50</span> <span class="special">==</span> <span class="number">10</span><span class="special">/</span><span class="number">1</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">1</span><span class="special">/</span><span class="number">501</span> <span class="special"><</span> <span class="number">1</span><span class="special">/</span><span class="number">500</span><span class="special">]</span>
106 <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_04"</span>
111 <a name="boost_test.testing_tools.extended_comparison.floating_point.customizing_for_tolerance.h1"></a>
112 <span class="phrase"><a name="boost_test.testing_tools.extended_comparison.floating_point.customizing_for_tolerance.concept_tolerance_based"></a></span><a class="link" href="customizing_for_tolerance.html#boost_test.testing_tools.extended_comparison.floating_point.customizing_for_tolerance.concept_tolerance_based">Concept
113 <code class="computeroutput"><span class="identifier">ToleranceCompatible</span></code></a>
116 <a name="boost_test.testing_tools.extended_comparison.floating_point.customizing_for_tolerance.h2"></a>
117 <span class="phrase"><a name="boost_test.testing_tools.extended_comparison.floating_point.customizing_for_tolerance.refinement_of"></a></span><a class="link" href="customizing_for_tolerance.html#boost_test.testing_tools.extended_comparison.floating_point.customizing_for_tolerance.refinement_of">Refinement
121 <a href="https://en.cppreference.com/w/cpp/named_req/MoveConstructible" target="_top"><code class="computeroutput"><span class="identifier">MoveConstructible</span></code></a>, <a href="https://en.cppreference.com/w/cpp/named_req/EqualityComparable" target="_top"><code class="computeroutput"><span class="identifier">EqualityComparable</span></code></a>, <a href="https://en.cppreference.com/w/cpp/named_req/LessThanComparable" target="_top"><code class="computeroutput"><span class="identifier">LessThanComparable</span></code></a>
124 <a name="boost_test.testing_tools.extended_comparison.floating_point.customizing_for_tolerance.h3"></a>
125 <span class="phrase"><a name="boost_test.testing_tools.extended_comparison.floating_point.customizing_for_tolerance.notation"></a></span><a class="link" href="customizing_for_tolerance.html#boost_test.testing_tools.extended_comparison.floating_point.customizing_for_tolerance.notation">Notation</a>
127 <div class="informaltable"><table class="table">
142 <code class="computeroutput"><span class="identifier">T</span></code>
147 A type that is a model of <code class="computeroutput"><span class="identifier">ToleranceCompatible</span></code>
154 <code class="computeroutput"><span class="identifier">x</span></code>, <code class="computeroutput"><span class="identifier">y</span></code>
159 objects of type <code class="computeroutput"><span class="identifier">T</span></code>
166 <code class="computeroutput"><span class="identifier">i</span></code>, <code class="computeroutput"><span class="identifier">j</span></code>
171 objects of type <code class="computeroutput"><span class="keyword">int</span></code>
178 <a name="boost_test.testing_tools.extended_comparison.floating_point.customizing_for_tolerance.h4"></a>
179 <span class="phrase"><a name="boost_test.testing_tools.extended_comparison.floating_point.customizing_for_tolerance.valid_expressions"></a></span><a class="link" href="customizing_for_tolerance.html#boost_test.testing_tools.extended_comparison.floating_point.customizing_for_tolerance.valid_expressions">Valid
182 <div class="informaltable"><table class="table">
209 Conversion from <code class="computeroutput"><span class="keyword">int</span></code>
214 <code class="computeroutput"><span class="identifier">T</span> <span class="identifier">j</span>
215 <span class="special">=</span> <span class="identifier">i</span><span class="special">;</span></code>
229 <code class="computeroutput"><span class="identifier">x</span> <span class="special">+</span>
230 <span class="identifier">y</span></code>
235 <code class="computeroutput"><span class="identifier">T</span></code>
247 <code class="computeroutput"><span class="identifier">x</span> <span class="special">-</span>
248 <span class="identifier">y</span></code>
253 <code class="computeroutput"><span class="identifier">T</span></code>
265 <code class="computeroutput"><span class="special">-</span><span class="identifier">x</span></code>
270 <code class="computeroutput"><span class="identifier">T</span></code>
282 <code class="computeroutput"><span class="identifier">x</span> <span class="special">*</span>
283 <span class="identifier">y</span></code><br> <code class="computeroutput"><span class="identifier">x</span> <span class="special">*</span>
284 <span class="identifier">i</span></code>
289 <code class="computeroutput"><span class="identifier">T</span></code>
301 <code class="computeroutput"><span class="identifier">x</span> <span class="special">/</span>
302 <span class="identifier">y</span></code><br> <code class="computeroutput"><span class="identifier">x</span> <span class="special">/</span>
303 <span class="identifier">i</span></code>
308 <code class="computeroutput"><span class="identifier">T</span></code>
320 <code class="computeroutput"><span class="identifier">x</span> <span class="special">==</span>
321 <span class="identifier">i</span></code><br> <code class="computeroutput"><span class="identifier">x</span> <span class="special">!=</span>
322 <span class="identifier">i</span></code>
327 <code class="computeroutput"><span class="keyword">bool</span></code>
339 <code class="computeroutput"><span class="identifier">x</span> <span class="special"><</span>
340 <span class="identifier">i</span></code><br> <code class="computeroutput"><span class="identifier">x</span> <span class="special">></span>
341 <span class="identifier">i</span></code><br> <code class="computeroutput"><span class="identifier">x</span> <span class="special"><=</span>
342 <span class="identifier">i</span></code><br> <code class="computeroutput"><span class="identifier">x</span> <span class="special">>=</span>
343 <span class="identifier">i</span></code>
348 <code class="computeroutput"><span class="keyword">bool</span></code>
355 <a name="boost_test.testing_tools.extended_comparison.floating_point.customizing_for_tolerance.h5"></a>
356 <span class="phrase"><a name="boost_test.testing_tools.extended_comparison.floating_point.customizing_for_tolerance.invariants"></a></span><a class="link" href="customizing_for_tolerance.html#boost_test.testing_tools.extended_comparison.floating_point.customizing_for_tolerance.invariants">Invariants</a>
358 <div class="informaltable"><table class="table">
366 <code class="computeroutput"><span class="identifier">T</span></code> and <code class="computeroutput"><span class="keyword">int</span></code> consistency
371 <code class="computeroutput"><span class="special">(</span><span class="identifier">x</span>
372 <span class="special">==</span> <span class="identifier">T</span><span class="special">(</span><span class="identifier">i</span><span class="special">))</span> <span class="special">==</span>
373 <span class="special">(</span><span class="identifier">x</span>
374 <span class="special">==</span> <span class="identifier">i</span><span class="special">)</span></code><br> <code class="computeroutput"><span class="special">(</span><span class="identifier">x</span> <span class="special">!=</span>
375 <span class="identifier">T</span><span class="special">(</span><span class="identifier">i</span><span class="special">))</span>
376 <span class="special">==</span> <span class="special">(</span><span class="identifier">x</span> <span class="special">!=</span>
377 <span class="identifier">i</span><span class="special">)</span></code><br>
378 <code class="computeroutput"><span class="special">(</span><span class="identifier">x</span>
379 <span class="special"><</span> <span class="identifier">T</span><span class="special">(</span><span class="identifier">i</span><span class="special">))</span> <span class="special">==</span>
380 <span class="special">(</span><span class="identifier">x</span>
381 <span class="special"><</span> <span class="identifier">i</span><span class="special">)</span></code><br> <code class="computeroutput"><span class="special">(</span><span class="identifier">x</span> <span class="special">></span>
382 <span class="identifier">T</span><span class="special">(</span><span class="identifier">i</span><span class="special">))</span>
383 <span class="special">==</span> <span class="special">(</span><span class="identifier">x</span> <span class="special">></span>
384 <span class="identifier">i</span><span class="special">)</span></code><br>
385 <code class="computeroutput"><span class="special">(</span><span class="identifier">x</span>
386 <span class="special">/</span> <span class="identifier">T</span><span class="special">(</span><span class="identifier">i</span><span class="special">))</span> <span class="special">==</span>
387 <span class="special">(</span><span class="identifier">x</span>
388 <span class="special">/</span> <span class="identifier">i</span><span class="special">)</span></code><br> <code class="computeroutput"><span class="special">(</span><span class="identifier">x</span> <span class="special">*</span>
389 <span class="identifier">T</span><span class="special">(</span><span class="identifier">i</span><span class="special">))</span>
390 <span class="special">==</span> <span class="special">(</span><span class="identifier">x</span> <span class="special">*</span>
391 <span class="identifier">i</span><span class="special">)</span></code>
397 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
398 <td align="left"></td>
399 <td align="right"><div class="copyright-footer">Copyright © 2001-2019 Boost.Test
401 Distributed under the Boost Software License, Version 1.0. (See accompanying
402 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>)
407 <div class="spirit-nav">
408 <a accesskey="p" href="../floating_point.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../floating_point.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_points_comparison_impl.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>