3 <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
4 <title>Using Boost.Multiprecision</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.5.2">
8 <link rel="up" href="../high_precision.html" title="Using Boost.Math with High-Precision Floating-Point Libraries">
9 <link rel="prev" href="why_high_precision.html" title="Why use a high-precision library rather than built-in floating-point types?">
10 <link rel="next" href="float128.html" title="Using with GCC's __float128 datatype">
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="why_high_precision.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="float128.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
26 <div class="titlepage"><div><div><h3 class="title">
27 <a name="math_toolkit.high_precision.use_multiprecision"></a><a class="link" href="use_multiprecision.html" title="Using Boost.Multiprecision">Using
28 Boost.Multiprecision</a>
29 </h3></div></div></div>
31 <span class="bold"><strong>All new projects are recommended to use <a href="../../../../../../libs/multiprecision/doc/html/index.html" target="_top">Boost.Multiprecision</a>.</strong></span>
34 <a name="math_toolkit.high_precision.use_multiprecision.h0"></a>
35 <span class="phrase"><a name="math_toolkit.high_precision.use_multiprecision.using_boost_multiprecision_cpp_f"></a></span><a class="link" href="use_multiprecision.html#math_toolkit.high_precision.use_multiprecision.using_boost_multiprecision_cpp_f">Using
36 Boost.Multiprecision <code class="computeroutput"><span class="identifier">cpp_float</span></code>
37 for numerical calculations with high precision.</a>
40 The Boost.Multiprecision library can be used for computations requiring precision
41 exceeding that of standard built-in types such as float, double and long
42 double. For extended-precision calculations, Boost.Multiprecision supplies
43 a template data type called cpp_dec_float. The number of decimal digits of
44 precision is fixed at compile-time via template parameter.
47 To use these floating-point types and constants, we need some includes:
49 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">math</span><span class="special">/</span><span class="identifier">constants</span><span class="special">/</span><span class="identifier">constants</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
51 <span class="preprocessor">#include</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">cpp_dec_float</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
52 <span class="comment">// using boost::multiprecision::cpp_dec_float</span>
54 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span>
55 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">limits</span><span class="special">></span>
58 So now we can demonstrate with some trivial calculations:
60 <pre class="programlisting"><span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
61 <span class="special">{</span>
64 Using <code class="computeroutput"><span class="keyword">typedef</span> <span class="identifier">cpp_dec_float_50</span></code>
65 hides the complexity of multiprecision to allow us to define variables with
66 50 decimal digit precision just like built-in <code class="computeroutput"><span class="keyword">double</span></code>.
68 <pre class="programlisting"><span class="keyword">using</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_50</span><span class="special">;</span>
70 <span class="identifier">cpp_dec_float_50</span> <span class="identifier">seventh</span> <span class="special">=</span> <span class="identifier">cpp_dec_float_50</span><span class="special">(</span><span class="number">1</span><span class="special">)</span> <span class="special">/</span> <span class="number">7</span><span class="special">;</span>
73 By default, output would only show the standard 6 decimal digits, so set
74 precision to show all 50 significant digits.
76 <pre class="programlisting"><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"><</span><span class="identifier">cpp_dec_float_50</span><span class="special">>::</span><span class="identifier">digits10</span><span class="special">);</span>
77 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">seventh</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
82 <pre class="programlisting"><span class="number">0.14285714285714285714285714285714285714285714285714</span>
85 We can also use constants, guaranteed to be initialized with the very last
88 <pre class="programlisting"><span class="identifier">cpp_dec_float_50</span> <span class="identifier">circumference</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">constants</span><span class="special">::</span><span class="identifier">pi</span><span class="special"><</span><span class="identifier">cpp_dec_float_50</span><span class="special">>()</span> <span class="special">*</span> <span class="number">2</span> <span class="special">*</span> <span class="identifier">seventh</span><span class="special">;</span>
90 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">circumference</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
95 <pre class="programlisting"><span class="number">0.89759790102565521098932668093700082405633411410717</span>
98 <a name="math_toolkit.high_precision.use_multiprecision.h1"></a>
99 <span class="phrase"><a name="math_toolkit.high_precision.use_multiprecision.using_boost_multiprecision_to_ge"></a></span><a class="link" href="use_multiprecision.html#math_toolkit.high_precision.use_multiprecision.using_boost_multiprecision_to_ge">Using
100 Boost.Multiprecision to generate a high-precision array of sin coefficents
101 for use with FFT.</a>
104 The Boost.Multiprecision library can be used for computations requiring precision
105 exceeding that of standard built-in types such as <code class="computeroutput"><span class="keyword">float</span></code>,
106 <code class="computeroutput"><span class="keyword">double</span></code> and <code class="computeroutput"><span class="keyword">long</span>
107 <span class="keyword">double</span></code>. For extended-precision calculations,
108 Boost.Multiprecision supplies a template data type called <code class="computeroutput"><span class="identifier">cpp_dec_float</span></code>.
109 The number of decimal digits of precision is fixed at compile-time via template
113 To use these floating-point types and constants, we need some includes:
115 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">math</span><span class="special">/</span><span class="identifier">constants</span><span class="special">/</span><span class="identifier">constants</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
116 <span class="comment">// using boost::math::constants::pi;</span>
118 <span class="preprocessor">#include</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">cpp_dec_float</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
119 <span class="comment">// using boost::multiprecision::cpp_dec_float</span>
121 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span>
122 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">limits</span><span class="special">></span>
123 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">vector</span><span class="special">></span>
124 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">algorithm</span><span class="special">></span>
125 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iomanip</span><span class="special">></span>
126 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iterator</span><span class="special">></span>
127 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">fstream</span><span class="special">></span>
130 Define a text string which is a C++ comment with the program licence, copyright
131 etc. You could of course, tailor this to your needs, including your copyright
132 claim. There are versions of <code class="computeroutput"><span class="identifier">array</span></code>
133 provided by Boost.Array in <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">array</span></code>
134 or the C++11 std::array, but since not all platforms provide C++11 support,
135 this program provides the Boost version as fallback.
137 <pre class="programlisting"><span class="keyword">static</span> <span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">prolog</span> <span class="special">=</span>
138 <span class="special">{</span>
139 <span class="string">"// Use, modification and distribution are subject to the\n"</span>
140 <span class="string">"// Boost Software License, Version 1.0.\n"</span>
141 <span class="string">"// (See accompanying file LICENSE_1_0.txt\n"</span>
142 <span class="string">"// or copy at "</span><span class="string">"http://www.boost.org/LICENSE_1_0.txt)\n\n"</span>
144 <span class="string">"// Copyright ???? 2013.\n\n"</span>
146 <span class="string">"// Use boost/array if std::array (C++11 feature) is not available.\n"</span>
147 <span class="string">"#ifdef BOOST_NO_CXX11_HDR_ARRAY\n"</span>
148 <span class="string">"#include <boost/array/array.hpp>\n"</span>
149 <span class="string">"#else\n"</span>
150 <span class="string">"#include <array>\n"</span>
151 <span class="string">"#endif\n\n"</span>
152 <span class="special">};</span>
155 <span class="keyword">using</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_50</span><span class="special">;</span>
156 <span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">constants</span><span class="special">::</span><span class="identifier">pi</span><span class="special">;</span>
157 <span class="comment">// VS 2010 (wrongly) requires these at file scope, not local scope in `main`.</span>
158 <span class="comment">// This program also requires `-std=c++11` option to compile using Clang and GCC.</span>
160 <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
161 <span class="special">{</span>
164 One often needs to compute tables of numbers in mathematical software.
167 A fast Fourier transform (FFT), for example, may use a table of the values
168 of sin((π/2<sup>n</sup>) in its implementation details. In order to maximize the precision
169 in the FFT implementation, the precision of the tabulated trigonometric values
170 should exceed that of the built-in floating-point type used in the FFT.
173 The sample below computes a table of the values of sin(π/2<sup>n</sup>) in the range
177 This program makes use of, among other program elements, the data type <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">multiprecision</span><span class="special">::</span><span class="identifier">cpp_dec_float_50</span></code> for a precision of 50
178 decimal digits from Boost.Multiprecision, the value of constant π retrieved
179 from Boost.Math, guaranteed to be initialized with the very last bit of precision
180 for the type, here <code class="computeroutput"><span class="identifier">cpp_dec_float_50</span></code>,
181 and a C++11 lambda function combined with <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span><span class="special">()</span></code>.
184 define the number of values in the array.
186 <pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">size</span> <span class="special">=</span> <span class="number">32U</span><span class="special">;</span>
187 <span class="identifier">cpp_dec_float_50</span> <span class="identifier">p</span> <span class="special">=</span> <span class="identifier">pi</span><span class="special"><</span><span class="identifier">cpp_dec_float_50</span><span class="special">>();</span>
188 <span class="identifier">cpp_dec_float_50</span> <span class="identifier">p2</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">constants</span><span class="special">::</span><span class="identifier">pi</span><span class="special"><</span><span class="identifier">cpp_dec_float_50</span><span class="special">>();</span>
190 <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span> <span class="special"><</span><span class="identifier">cpp_dec_float_50</span><span class="special">></span> <span class="identifier">sin_values</span> <span class="special">(</span><span class="identifier">size</span><span class="special">);</span>
191 <span class="keyword">unsigned</span> <span class="identifier">n</span> <span class="special">=</span> <span class="number">1U</span><span class="special">;</span>
192 <span class="comment">// Generate the sine values.</span>
193 <span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span>
194 <span class="special">(</span>
195 <span class="identifier">sin_values</span><span class="special">.</span><span class="identifier">begin</span> <span class="special">(),</span>
196 <span class="identifier">sin_values</span><span class="special">.</span><span class="identifier">end</span> <span class="special">(),</span>
197 <span class="special">[&</span><span class="identifier">n</span><span class="special">](</span><span class="identifier">cpp_dec_float_50</span><span class="special">&</span> <span class="identifier">y</span><span class="special">)</span>
198 <span class="special">{</span>
199 <span class="identifier">y</span> <span class="special">=</span> <span class="identifier">sin</span><span class="special">(</span> <span class="identifier">pi</span><span class="special"><</span><span class="identifier">cpp_dec_float_50</span><span class="special">>()</span> <span class="special">/</span> <span class="identifier">pow</span><span class="special">(</span><span class="identifier">cpp_dec_float_50</span> <span class="special">(</span><span class="number">2</span><span class="special">),</span> <span class="identifier">n</span><span class="special">));</span>
200 <span class="special">++</span><span class="identifier">n</span><span class="special">;</span>
201 <span class="special">}</span>
202 <span class="special">);</span>
205 Define the floating-point type for the generated file, either built-in <code class="computeroutput"><span class="keyword">double</span><span class="special">,</span> </code>float,
206 or <code class="computeroutput"><span class="keyword">long</span> <span class="keyword">double</span></code>,
207 or a user defined type like <code class="computeroutput"><span class="identifier">cpp_dec_float_50</span></code>.
209 <pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">fp_type</span> <span class="special">=</span> <span class="string">"double"</span><span class="special">;</span>
211 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Generating an `std::array` or `boost::array` for floating-point type: "</span>
212 <span class="special"><<</span> <span class="identifier">fp_type</span> <span class="special"><<</span> <span class="string">". "</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
215 By default, output would only show the standard 6 decimal digits, so set
216 precision to show enough significant digits for the chosen floating-point
217 type. For <code class="computeroutput"><span class="identifier">cpp_dec_float_50</span></code>
218 is 50. (50 decimal digits should be ample for most applications).
220 <pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">streamsize</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"><</span><span class="identifier">cpp_dec_float_50</span><span class="special">>::</span><span class="identifier">digits10</span><span class="special">;</span>
222 <span class="comment">// std::cout.precision(std::numeric_limits<cpp_dec_float_50>::digits10);</span>
223 <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="string">" decimal digits precision. "</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
226 Of course, one could also choose less, for example, 36 would be sufficient
227 for the most precise current <code class="computeroutput"><span class="keyword">long</span>
228 <span class="keyword">double</span></code> implementations using 128-bit.
229 In general, it should be a couple of decimal digits more (guard digits) than
230 <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">RealType</span><span class="special">>::</span><span class="identifier">max_digits10</span></code> for the target system floating-point
231 type. If the implementation does not provide <code class="computeroutput"><span class="identifier">max_digits10</span></code>,
232 the the Kahan formula <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">RealType</span><span class="special">>::</span><span class="identifier">digits</span>
233 <span class="special">*</span> <span class="number">3010</span><span class="special">/</span><span class="number">10000</span> <span class="special">+</span>
234 <span class="number">2</span></code> can be used instead.
237 The compiler will read these values as decimal digits strings and use the
238 nearest representation for the floating-point type.
241 Now output all the sine table, to a file of your chosen name.
243 <pre class="programlisting"> <span class="keyword">const</span> <span class="keyword">char</span> <span class="identifier">sines_name</span><span class="special">[]</span> <span class="special">=</span> <span class="string">"sines.hpp"</span><span class="special">;</span> <span class="comment">// In same directory as .exe</span>
245 <span class="identifier">std</span><span class="special">::</span><span class="identifier">ofstream</span> <span class="identifier">fout</span><span class="special">(</span><span class="identifier">sines_name</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">ios_base</span><span class="special">::</span><span class="identifier">out</span><span class="special">);</span> <span class="comment">// Creates if no file exists,</span>
246 <span class="comment">// & uses default overwrite/ ios::replace.</span>
247 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">fout</span><span class="special">.</span><span class="identifier">is_open</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">false</span><span class="special">)</span>
248 <span class="special">{</span> <span class="comment">// failed to open OK!</span>
249 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Open file "</span> <span class="special"><<</span> <span class="identifier">sines_name</span> <span class="special"><<</span> <span class="string">" failed!"</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
250 <span class="keyword">return</span> <span class="identifier">EXIT_FAILURE</span><span class="special">;</span>
251 <span class="special">}</span>
252 <span class="keyword">else</span>
253 <span class="special">{</span>
254 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Open file "</span> <span class="special"><<</span> <span class="identifier">sines_name</span> <span class="special"><<</span> <span class="string">" for output OK."</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
255 <span class="identifier">fout</span> <span class="special"><<</span> <span class="identifier">prolog</span> <span class="special"><<</span> <span class="string">"// Table of "</span> <span class="special"><<</span> <span class="identifier">sin_values</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special"><<</span> <span class="string">" values with "</span>
256 <span class="special"><<</span> <span class="identifier">precision</span> <span class="special"><<</span> <span class="string">" decimal digits precision,\n"</span>
257 <span class="string">"// generated by program fft_sines_table.cpp.\n"</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
259 <span class="identifier">fout</span> <span class="special"><<</span>
260 <span class="string">"#ifdef BOOST_NO_CXX11_HDR_ARRAY"</span><span class="string">"\n"</span>
261 <span class="string">" static const boost::array<double, "</span> <span class="special"><<</span> <span class="identifier">size</span> <span class="special"><<</span> <span class="string">"> sines =\n"</span>
262 <span class="string">"#else"</span><span class="string">"\n"</span>
263 <span class="string">" static const std::array<double, "</span> <span class="special"><<</span> <span class="identifier">size</span> <span class="special"><<</span> <span class="string">"> sines =\n"</span>
264 <span class="string">"#endif"</span><span class="string">"\n"</span>
265 <span class="string">"{{\n"</span><span class="special">;</span> <span class="comment">// 2nd { needed for some GCC compiler versions.</span>
266 <span class="identifier">fout</span><span class="special">.</span><span class="identifier">precision</span><span class="special">(</span><span class="identifier">precision</span><span class="special">);</span>
268 <span class="keyword">for</span> <span class="special">(</span><span class="keyword">unsigned</span> <span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0U</span><span class="special">;</span> <span class="special">;)</span>
269 <span class="special">{</span>
270 <span class="identifier">fout</span> <span class="special"><<</span> <span class="string">" "</span> <span class="special"><<</span> <span class="identifier">sin_values</span><span class="special">[</span><span class="identifier">i</span><span class="special">];</span>
271 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">i</span> <span class="special">==</span> <span class="identifier">sin_values</span><span class="special">.</span><span class="identifier">size</span><span class="special">()-</span><span class="number">1</span><span class="special">)</span>
272 <span class="special">{</span> <span class="comment">// next is last value.</span>
273 <span class="identifier">fout</span> <span class="special"><<</span> <span class="string">"\n}};\n"</span><span class="special">;</span> <span class="comment">// 2nd } needed for some earlier GCC compiler versions.</span>
274 <span class="keyword">break</span><span class="special">;</span>
275 <span class="special">}</span>
276 <span class="keyword">else</span>
277 <span class="special">{</span>
278 <span class="identifier">fout</span> <span class="special"><<</span> <span class="string">",\n"</span><span class="special">;</span>
279 <span class="identifier">i</span><span class="special">++;</span>
280 <span class="special">}</span>
281 <span class="special">}</span>
283 <span class="identifier">fout</span><span class="special">.</span><span class="identifier">close</span><span class="special">();</span>
284 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Close file "</span> <span class="special"><<</span> <span class="identifier">sines_name</span> <span class="special"><<</span> <span class="string">" for output OK."</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
286 <span class="special">}</span>
289 The output file generated can be seen at <a href="../../../../example/sines.hpp" target="_top">../../example/sines.hpp</a>
294 <pre class="programlisting"><span class="identifier">The</span> <span class="identifier">printed</span> <span class="identifier">table</span> <span class="identifier">is</span><span class="special">:</span>
296 <span class="number">1</span>
297 <span class="number">0.70710678118654752440084436210484903928483593768847</span>
298 <span class="number">0.38268343236508977172845998403039886676134456248563</span>
299 <span class="number">0.19509032201612826784828486847702224092769161775195</span>
300 <span class="number">0.098017140329560601994195563888641845861136673167501</span>
301 <span class="number">0.049067674327418014254954976942682658314745363025753</span>
302 <span class="number">0.024541228522912288031734529459282925065466119239451</span>
303 <span class="number">0.012271538285719926079408261951003212140372319591769</span>
304 <span class="number">0.0061358846491544753596402345903725809170578863173913</span>
305 <span class="number">0.003067956762965976270145365490919842518944610213452</span>
306 <span class="number">0.0015339801862847656123036971502640790799548645752374</span>
307 <span class="number">0.00076699031874270452693856835794857664314091945206328</span>
308 <span class="number">0.00038349518757139558907246168118138126339502603496474</span>
309 <span class="number">0.00019174759731070330743990956198900093346887403385916</span>
310 <span class="number">9.5873799095977345870517210976476351187065612851145e-05</span>
311 <span class="number">4.7936899603066884549003990494658872746866687685767e-05</span>
312 <span class="number">2.3968449808418218729186577165021820094761474895673e-05</span>
313 <span class="number">1.1984224905069706421521561596988984804731977538387e-05</span>
314 <span class="number">5.9921124526424278428797118088908617299871778780951e-06</span>
315 <span class="number">2.9960562263346607504548128083570598118251878683408e-06</span>
316 <span class="number">1.4980281131690112288542788461553611206917585861527e-06</span>
317 <span class="number">7.4901405658471572113049856673065563715595930217207e-07</span>
318 <span class="number">3.7450702829238412390316917908463317739740476297248e-07</span>
319 <span class="number">1.8725351414619534486882457659356361712045272098287e-07</span>
320 <span class="number">9.3626757073098082799067286680885620193236507169473e-08</span>
321 <span class="number">4.681337853654909269511551813854009695950362701667e-08</span>
322 <span class="number">2.3406689268274552759505493419034844037886207223779e-08</span>
323 <span class="number">1.1703344634137277181246213503238103798093456639976e-08</span>
324 <span class="number">5.8516723170686386908097901008341396943900085051757e-09</span>
325 <span class="number">2.9258361585343193579282304690689559020175857150074e-09</span>
326 <span class="number">1.4629180792671596805295321618659637103742615227834e-09</span>
327 <span class="special">*/</span>
330 The output can be copied as text and readily integrated into a given source
331 code. Alternatively, the output can be written to a text or even be used
332 within a self-written automatic code generator as this example.
335 A computer algebra system can be used to verify the results obtained from
336 Boost.Math and Boost.Multiprecision. For example, the <a href="http://www.wolfram.com/products/mathematica/index.html" target="_top">Wolfram
337 Mathematica</a> computer algebra system can obtain a similar table with
340 <pre class="programlisting"><span class="identifier">Table</span><span class="special">[</span><span class="identifier">N</span><span class="special">[</span><span class="identifier">Sin</span><span class="special">[</span><span class="identifier">Pi</span> <span class="special">/</span> <span class="special">(</span><span class="number">2</span><span class="special">^</span><span class="identifier">n</span><span class="special">)],</span> <span class="number">50</span><span class="special">],</span> <span class="special">{</span><span class="identifier">n</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="number">31</span><span class="special">,</span> <span class="number">1</span><span class="special">}]</span>
343 The <a href="http://www.wolframalpha.com/" target="_top">Wolfram Alpha</a> computational
344 knowledge engine can also be used to generate this table. The same command
345 can be pasted into the compute box.
348 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
349 <td align="left"></td>
350 <td align="right"><div class="copyright-footer">Copyright © 2006-2010, 2012-2014 Nikhar Agrawal,
351 Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert
352 Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Johan Råde, Gautam Sewani,
353 Benjamin Sobotta, Thijs van den Berg, Daryle Walker and Xiaogang Zhang<p>
354 Distributed under the Boost Software License, Version 1.0. (See accompanying
355 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>)
360 <div class="spirit-nav">
361 <a accesskey="p" href="why_high_precision.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="float128.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>