Imported Upstream version 1.72.0
[platform/upstream/boost.git] / libs / math / doc / html / math_toolkit / high_precision / using_test.html
1 <html>
2 <head>
3 <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
4 <title>Using without expression templates for Boost.Test and others</title>
5 <link rel="stylesheet" href="../../math.css" type="text/css">
6 <meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
7 <link rel="home" href="../../index.html" title="Math Toolkit 2.11.0">
8 <link rel="up" href="../high_precision.html" title="Using Boost.Math with High-Precision Floating-Point Libraries">
9 <link rel="prev" href="use_ntl.html" title="Using NTL Library">
10 <link rel="next" href="../real_concepts.html" title="Conceptual Requirements for Real Number Types">
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="use_ntl.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../high_precision.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="../real_concepts.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.high_precision.using_test"></a><a class="link" href="using_test.html" title="Using without expression templates for Boost.Test and others">Using without
28       expression templates for Boost.Test and others</a>
29 </h3></div></div></div>
30 <p>
31         As noted in the <a href="../../../../../../libs/multiprecision/doc/html/index.html" target="_top">Boost.Multiprecision</a>
32         documentation, certain program constructs will not compile when using expression
33         templates. One example that many users may encounter is Boost.Test (1.54
34         and earlier) when using macro BOOST_CHECK_CLOSE and BOOST_CHECK_CLOSE_FRACTION.
35       </p>
36 <p>
37         If, for example, you wish to use any multiprecision type like <code class="computeroutput"><span class="identifier">cpp_dec_float_50</span></code> in place of <code class="computeroutput"><span class="keyword">double</span></code> to give more precision, you will need
38         to override the default <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">multiprecision</span><span class="special">::</span><span class="identifier">et_on</span></code>
39         with <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">multiprecision</span><span class="special">::</span><span class="identifier">et_off</span></code>.
40       </p>
41 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">multiprecision</span><span class="special">/</span><span class="identifier">cpp_dec_float</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
42 </pre>
43 <p>
44         To define a 50 decimal digit type using <code class="computeroutput"><span class="identifier">cpp_dec_float</span></code>,
45         you must pass two template parameters to <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">multiprecision</span><span class="special">::</span><span class="identifier">number</span></code>.
46       </p>
47 <p>
48         It may be more legible to use a two-staged type definition such as this:
49       </p>
50 <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">multiprecision</span><span class="special">::</span><span class="identifier">cpp_dec_float</span><span class="special">&lt;</span><span class="number">50</span><span class="special">&gt;</span> <span class="identifier">mp_backend</span><span class="special">;</span>
51 <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">multiprecision</span><span class="special">::</span><span class="identifier">number</span><span class="special">&lt;</span><span class="identifier">mp_backend</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">multiprecision</span><span class="special">::</span><span class="identifier">et_off</span><span class="special">&gt;</span> <span class="identifier">cpp_dec_float_50_noet</span><span class="special">;</span>
52 </pre>
53 <p>
54         Here, we first define <code class="computeroutput"><span class="identifier">mp_backend</span></code>
55         as <code class="computeroutput"><span class="identifier">cpp_dec_float</span></code> with 50
56         digits. The second step passes this backend to <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">multiprecision</span><span class="special">::</span><span class="identifier">number</span></code>
57         with <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">multiprecision</span><span class="special">::</span><span class="identifier">et_off</span></code>, an enumerated type.
58       </p>
59 <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">multiprecision</span><span class="special">::</span><span class="identifier">number</span><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">multiprecision</span><span class="special">::</span><span class="identifier">cpp_dec_float</span><span class="special">&lt;</span><span class="number">50</span><span class="special">&gt;,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">multiprecision</span><span class="special">::</span><span class="identifier">et_off</span><span class="special">&gt;</span>
60 <span class="identifier">cpp_dec_float_50_noet</span><span class="special">;</span>
61 </pre>
62 <p>
63         You can reduce typing with a <code class="computeroutput"><span class="keyword">using</span></code>
64         directive <code class="computeroutput"><span class="keyword">using</span> <span class="keyword">namespace</span>
65         <span class="identifier">boost</span><span class="special">::</span><span class="identifier">multiprecision</span><span class="special">;</span></code>
66         if desired, as shown below.
67       </p>
68 <pre class="programlisting"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">multiprecision</span><span class="special">;</span>
69 </pre>
70 <p>
71         Now <code class="computeroutput"><span class="identifier">cpp_dec_float_50_noet</span></code>
72         or <code class="computeroutput"><span class="identifier">cpp_dec_float_50_et</span></code> can
73         be used as a direct replacement for built-in types like <code class="computeroutput"><span class="keyword">double</span></code>
74         etc.
75       </p>
76 <pre class="programlisting"><span class="identifier">BOOST_AUTO_TEST_CASE</span><span class="special">(</span><span class="identifier">cpp_float_test_check_close_noet</span><span class="special">)</span>
77 <span class="special">{</span> <span class="comment">// No expression templates/</span>
78   <span class="keyword">typedef</span> <span class="identifier">number</span><span class="special">&lt;</span><span class="identifier">cpp_dec_float</span><span class="special">&lt;</span><span class="number">50</span><span class="special">&gt;,</span> <span class="identifier">et_off</span><span class="special">&gt;</span> <span class="identifier">cpp_dec_float_50_noet</span><span class="special">;</span>
79
80   <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">.</span><span class="identifier">precision</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">cpp_dec_float_50_noet</span><span class="special">&gt;::</span><span class="identifier">digits10</span><span class="special">);</span> <span class="comment">// All significant digits.</span>
81   <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">showpoint</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> <span class="comment">// Show trailing zeros.</span>
82
83   <span class="identifier">cpp_dec_float_50_noet</span> <span class="identifier">a</span> <span class="special">(</span><span class="string">"1.0"</span><span class="special">);</span>
84   <span class="identifier">cpp_dec_float_50_noet</span> <span class="identifier">b</span> <span class="special">(</span><span class="string">"1.0"</span><span class="special">);</span>
85   <span class="identifier">b</span> <span class="special">+=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">cpp_dec_float_50_noet</span><span class="special">&gt;::</span><span class="identifier">epsilon</span><span class="special">();</span> <span class="comment">// Increment least significant decimal digit.</span>
86
87   <span class="identifier">cpp_dec_float_50_noet</span> <span class="identifier">eps</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">cpp_dec_float_50_noet</span><span class="special">&gt;::</span><span class="identifier">epsilon</span><span class="special">();</span>
88
89   <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span><span class="string">"a = "</span> <span class="special">&lt;&lt;</span> <span class="identifier">a</span> <span class="special">&lt;&lt;</span> <span class="string">",\nb = "</span> <span class="special">&lt;&lt;</span> <span class="identifier">b</span> <span class="special">&lt;&lt;</span> <span class="string">",\neps = "</span> <span class="special">&lt;&lt;</span> <span class="identifier">eps</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
90
91   <span class="identifier">BOOST_CHECK_CLOSE</span><span class="special">(</span><span class="identifier">a</span><span class="special">,</span> <span class="identifier">b</span><span class="special">,</span> <span class="identifier">eps</span> <span class="special">*</span> <span class="number">100</span><span class="special">);</span> <span class="comment">// Expected to pass (because tolerance is as percent).</span>
92   <span class="identifier">BOOST_CHECK_CLOSE_FRACTION</span><span class="special">(</span><span class="identifier">a</span><span class="special">,</span> <span class="identifier">b</span><span class="special">,</span> <span class="identifier">eps</span><span class="special">);</span> <span class="comment">// Expected to pass (because tolerance is as fraction).</span>
93
94
95
96 <span class="special">}</span> <span class="comment">// BOOST_AUTO_TEST_CASE(cpp_float_test_check_close)</span>
97
98 <span class="identifier">BOOST_AUTO_TEST_CASE</span><span class="special">(</span><span class="identifier">cpp_float_test_check_close_et</span><span class="special">)</span>
99 <span class="special">{</span> <span class="comment">// Using expression templates.</span>
100   <span class="keyword">typedef</span> <span class="identifier">number</span><span class="special">&lt;</span><span class="identifier">cpp_dec_float</span><span class="special">&lt;</span><span class="number">50</span><span class="special">&gt;,</span> <span class="identifier">et_on</span><span class="special">&gt;</span> <span class="identifier">cpp_dec_float_50_et</span><span class="special">;</span>
101
102   <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">.</span><span class="identifier">precision</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">cpp_dec_float_50_et</span><span class="special">&gt;::</span><span class="identifier">digits10</span><span class="special">);</span> <span class="comment">// All significant digits.</span>
103   <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">showpoint</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> <span class="comment">// Show trailing zeros.</span>
104
105   <span class="identifier">cpp_dec_float_50_et</span> <span class="identifier">a</span><span class="special">(</span><span class="string">"1.0"</span><span class="special">);</span>
106   <span class="identifier">cpp_dec_float_50_et</span> <span class="identifier">b</span><span class="special">(</span><span class="string">"1.0"</span><span class="special">);</span>
107   <span class="identifier">b</span> <span class="special">+=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">cpp_dec_float_50_et</span><span class="special">&gt;::</span><span class="identifier">epsilon</span><span class="special">();</span> <span class="comment">// Increment least significant decimal digit.</span>
108
109   <span class="identifier">cpp_dec_float_50_et</span> <span class="identifier">eps</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">cpp_dec_float_50_et</span><span class="special">&gt;::</span><span class="identifier">epsilon</span><span class="special">();</span>
110
111   <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"a = "</span> <span class="special">&lt;&lt;</span> <span class="identifier">a</span> <span class="special">&lt;&lt;</span> <span class="string">",\nb = "</span> <span class="special">&lt;&lt;</span> <span class="identifier">b</span> <span class="special">&lt;&lt;</span> <span class="string">",\neps = "</span> <span class="special">&lt;&lt;</span> <span class="identifier">eps</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
112
113   <span class="identifier">BOOST_CHECK_CLOSE</span><span class="special">(</span><span class="identifier">a</span><span class="special">,</span> <span class="identifier">b</span><span class="special">,</span> <span class="identifier">eps</span> <span class="special">*</span> <span class="number">100</span><span class="special">);</span> <span class="comment">// Expected to pass (because tolerance is as percent).</span>
114   <span class="identifier">BOOST_CHECK_CLOSE_FRACTION</span><span class="special">(</span><span class="identifier">a</span><span class="special">,</span> <span class="identifier">b</span><span class="special">,</span> <span class="identifier">eps</span><span class="special">);</span> <span class="comment">// Expected to pass (because tolerance is as fraction).</span>
115 </pre>
116 <p>
117         Using <code class="computeroutput"><span class="identifier">cpp_dec_float_50</span></code> with
118         the default expression template use switched on, the compiler error message
119         for `BOOST_CHECK_CLOSE_FRACTION(a, b, eps); would be:
120       </p>
121 <pre class="programlisting"><span class="comment">// failure floating_point_comparison.hpp(59): error C2440: 'static_cast' :</span>
122 <span class="comment">// cannot convert from 'int' to 'boost::multiprecision::detail::expression&lt;tag,Arg1,Arg2,Arg3,Arg4&gt;'</span>
123 </pre>
124 <p>
125         A full example code is at <a href="../../../../example/test_cpp_float_close_fraction.cpp" target="_top">test_cpp_float_close_fraction.cpp</a>
126       </p>
127 </div>
128 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
129 <td align="left"></td>
130 <td align="right"><div class="copyright-footer">Copyright &#169; 2006-2019 Nikhar
131       Agrawal, Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos,
132       Hubert Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Matthew Pulver, Johan
133       R&#229;de, Gautam Sewani, Benjamin Sobotta, Nicholas Thompson, Thijs van den Berg,
134       Daryle Walker and Xiaogang Zhang<p>
135         Distributed under the Boost Software License, Version 1.0. (See accompanying
136         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>)
137       </p>
138 </div></td>
139 </tr></table>
140 <hr>
141 <div class="spirit-nav">
142 <a accesskey="p" href="use_ntl.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../high_precision.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="../real_concepts.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
143 </div>
144 </body>
145 </html>