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.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="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:
61 Using <code class="computeroutput"><span class="keyword">typedef</span> <span class="identifier">cpp_dec_float_50</span></code>
62 hides the complexity of multiprecision, allows us to define variables with
63 50 decimal digit precision just like built-in <code class="computeroutput"><span class="keyword">double</span></code>.
65 <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>
67 <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> <span class="comment">// 1 / 7</span>
70 By default, output would only show the standard 6 decimal digits, so set
71 precision to show all 50 significant digits, including any trailing zeros.
73 <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>
74 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">showpoint</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> <span class="comment">// Append any trailing zeros.</span>
75 <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>
80 <pre class="programlisting"><span class="number">0.14285714285714285714285714285714285714285714285714</span>
83 We can also use Boost.Math <a class="link" href="../constants.html" title="The Mathematical Constants">constants</a>
84 like π, guaranteed to be initialized with the very last bit of precision for
85 the floating-point type.
87 <pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"pi = "</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="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
88 <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>
89 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"c = "</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>
94 <pre class="programlisting"><span class="identifier">pi</span> <span class="special">=</span> <span class="number">3.1415926535897932384626433832795028841971693993751</span>
96 <span class="identifier">c</span> <span class="special">=</span> <span class="number">0.89759790102565521098932668093700082405633411410717</span>
99 The full source of this example is at <a href="../../../../example/big_seventh.cpp" target="_top">big_seventh.cpp</a>
102 <a name="math_toolkit.high_precision.use_multiprecision.h1"></a>
103 <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
104 Boost.Multiprecision to generate a high-precision array of sine coefficents
105 for use with FFT.</a>
108 The Boost.Multiprecision library can be used for computations requiring precision
109 exceeding that of standard built-in types such as <code class="computeroutput"><span class="keyword">float</span></code>,
110 <code class="computeroutput"><span class="keyword">double</span></code> and <code class="computeroutput"><span class="keyword">long</span>
111 <span class="keyword">double</span></code>. For extended-precision calculations,
112 Boost.Multiprecision supplies a template data type called <code class="computeroutput"><span class="identifier">cpp_bin_float</span></code>.
113 The number of decimal digits of precision is fixed at compile-time via a
117 One often needs to compute tables of numbers in mathematical software. To
118 avoid the <a href="https://en.wikipedia.org/wiki/Rounding#Table-maker's_dilemma" target="_top">Table-maker's
119 dilemma</a> it is necessary to use a higher precision type to compute
120 the table values so that they have the nearest representable bit-pattern
121 for the type, say <code class="computeroutput"><span class="keyword">double</span></code>, of
125 This example is a program <code class="computeroutput"><span class="identifier">fft_since_table</span><span class="special">.</span><span class="identifier">cpp</span></code> that
126 writes a header file <code class="computeroutput"><span class="identifier">sines</span><span class="special">.</span><span class="identifier">hpp</span></code> containing
127 an array of sine coefficients for use with a Fast Fourier Transform (FFT),
128 that can be included by the FFT program.
131 To use Boost.Multiprecision's high-precision floating-point types and constants,
132 we need some includes:
134 <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>
135 <span class="comment">// using boost::math::constants::pi;</span>
137 <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_bin_float</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> <span class="comment">// for</span>
138 <span class="comment">// using boost::multiprecision::cpp_bin_float and</span>
139 <span class="comment">// using boost::multiprecision::cpp_bin_float_50;</span>
140 <span class="comment">// using boost::multiprecision::cpp_bin_float_quad;</span>
142 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">array</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> <span class="comment">// or <array> for std::array</span>
144 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span>
145 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">limits</span><span class="special">></span>
146 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">vector</span><span class="special">></span>
147 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">algorithm</span><span class="special">></span>
148 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iomanip</span><span class="special">></span>
149 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iterator</span><span class="special">></span>
150 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">fstream</span><span class="special">></span>
153 First, this example defines a prolog text string which is a C++ comment with
154 the program licence, copyright etc. (You would of course, tailor this to
155 your needs, including <span class="bold"><strong>your</strong></span> copyright claim).
156 This will appear at the top of the written header file <code class="computeroutput"><span class="identifier">sines</span><span class="special">.</span><span class="identifier">hpp</span></code>.
158 <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_bin_float_50</span><span class="special">;</span>
159 <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>
162 A fast Fourier transform (FFT), for example, may use a table of the values
163 of sin((π/2<sup>n</sup>) in its implementation details. In order to maximize the precision
164 in the FFT implementation, the precision of the tabulated trigonometric values
165 should exceed that of the built-in floating-point type used in the FFT.
168 The sample below computes a table of the values of sin(π/2<sup>n</sup>) in the range
172 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_bin_float_50</span></code> for a precision of 50
173 decimal digits from Boost.Multiprecision, the value of constant π retrieved
174 from Boost.Math, guaranteed to be initialized with the very last bit of precision
175 for the type, here <code class="computeroutput"><span class="identifier">cpp_bin_float_50</span></code>,
176 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>.
179 define the number of values (32) in the array of sines.
181 <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>
182 <span class="comment">//cpp_bin_float_50 p = pi<cpp_bin_float_50>();</span>
183 <span class="identifier">cpp_bin_float_50</span> <span class="identifier">p</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_bin_float_50</span><span class="special">>();</span>
185 <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span> <span class="special"><</span><span class="identifier">cpp_bin_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>
186 <span class="keyword">unsigned</span> <span class="identifier">n</span> <span class="special">=</span> <span class="number">1U</span><span class="special">;</span>
187 <span class="comment">// Generate the sine values.</span>
188 <span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span>
189 <span class="special">(</span>
190 <span class="identifier">sin_values</span><span class="special">.</span><span class="identifier">begin</span> <span class="special">(),</span>
191 <span class="identifier">sin_values</span><span class="special">.</span><span class="identifier">end</span> <span class="special">(),</span>
192 <span class="special">[&</span><span class="identifier">n</span><span class="special">](</span><span class="identifier">cpp_bin_float_50</span><span class="special">&</span> <span class="identifier">y</span><span class="special">)</span>
193 <span class="special">{</span>
194 <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_bin_float_50</span><span class="special">>()</span> <span class="special">/</span> <span class="identifier">pow</span><span class="special">(</span><span class="identifier">cpp_bin_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>
195 <span class="special">++</span><span class="identifier">n</span><span class="special">;</span>
196 <span class="special">}</span>
197 <span class="special">);</span>
200 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,
201 or <code class="computeroutput"><span class="keyword">long</span> <span class="keyword">double</span></code>,
202 or a user defined type like <code class="computeroutput"><span class="identifier">cpp_bin_float_50</span></code>.
204 <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>
206 <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>
207 <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>
210 By default, output would only show the standard 6 decimal digits, so set
211 precision to show enough significant digits for the chosen floating-point
212 type. For <code class="computeroutput"><span class="identifier">cpp_bin_float_50</span></code>
213 is 50. (50 decimal digits should be ample for most applications).
215 <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_bin_float_50</span><span class="special">>::</span><span class="identifier">digits10</span><span class="special">;</span>
217 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Sines table precision is "</span> <span class="special"><<</span> <span class="identifier">precision</span> <span class="special"><<</span> <span class="string">" decimal digits. "</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
220 Of course, one could also choose a lower precision for the table values,
224 <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">streamsize</span> <span class="identifier">precision</span>
225 <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_bin_float_quad</span><span class="special">>::</span><span class="identifier">max_digits10</span><span class="special">;</span></code>
228 128-bit 'quad' precision of 36 decimal digits would be sufficient for the
229 most precise current <code class="computeroutput"><span class="keyword">long</span> <span class="keyword">double</span></code>
230 implementations using 128-bit. In general, it should be a couple of decimal
231 digits more (guard digits) than <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>
232 for the target system floating-point type. (If the implementation does not
233 provide <code class="computeroutput"><span class="identifier">max_digits10</span></code>, the
234 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> <span class="special">*</span> <span class="number">3010</span><span class="special">/</span><span class="number">10000</span>
235 <span class="special">+</span> <span class="number">2</span></code>
236 can be used instead).
239 The compiler will read these values as decimal digits strings and use the
240 nearest representation for the floating-point type.
243 Now output all the sine table, to a file of your chosen name.
245 <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">// Assuming in same directory as .exe</span>
247 <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>
248 <span class="comment">// & uses default overwrite/ ios::replace.</span>
249 <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>
250 <span class="special">{</span> <span class="comment">// failed to open OK!</span>
251 <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>
252 <span class="keyword">return</span> <span class="identifier">EXIT_FAILURE</span><span class="special">;</span>
253 <span class="special">}</span>
254 <span class="keyword">else</span>
255 <span class="special">{</span> <span class="comment">// Write prolog etc as a C++ comment.</span>
256 <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>
257 <span class="identifier">fout</span> <span class="special"><<</span> <span class="identifier">prolog</span>
258 <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>
259 <span class="special"><<</span> <span class="identifier">precision</span> <span class="special"><<</span> <span class="string">" decimal digits precision,\n"</span>
260 <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>
262 <span class="identifier">fout</span> <span class="special"><<</span> <span class="string">"#include <array> // std::array"</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
264 <span class="comment">// Write the table of sines as a C++ array.</span>
265 <span class="identifier">fout</span> <span class="special"><<</span> <span class="string">"\nstatic const std::array<double, "</span> <span class="special"><<</span> <span class="identifier">size</span> <span class="special"><<</span> <span class="string">"> sines =\n"</span>
266 <span class="string">"{{\n"</span><span class="special">;</span> <span class="comment">// 2nd { needed for some old GCC compiler versions.</span>
267 <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>
269 <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>
270 <span class="special">{</span>
271 <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>
272 <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>
273 <span class="special">{</span> <span class="comment">// next is last value.</span>
274 <span class="identifier">fout</span> <span class="special"><<</span> <span class="string">"\n}}; // array sines\n"</span><span class="special">;</span> <span class="comment">// 2nd } needed for some old GCC compiler versions.</span>
275 <span class="keyword">break</span><span class="special">;</span>
276 <span class="special">}</span>
277 <span class="keyword">else</span>
278 <span class="special">{</span>
279 <span class="identifier">fout</span> <span class="special"><<</span> <span class="string">",\n"</span><span class="special">;</span>
280 <span class="identifier">i</span><span class="special">++;</span>
281 <span class="special">}</span>
282 <span class="special">}</span> <span class="comment">// for</span>
284 <span class="identifier">fout</span><span class="special">.</span><span class="identifier">close</span><span class="special">();</span>
285 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Closed file "</span> <span class="special"><<</span> <span class="identifier">sines_name</span> <span class="special"><<</span> <span class="string">" for output."</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 The full source of this example is at <a href="../../../../example/fft_sines_table.cpp" target="_top">fft_sines_table.cpp</a>
351 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
352 <td align="left"></td>
353 <td align="right"><div class="copyright-footer">Copyright © 2006-2019 Nikhar
354 Agrawal, Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos,
355 Hubert Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Matthew Pulver, Johan
356 Råde, Gautam Sewani, Benjamin Sobotta, Nicholas Thompson, Thijs van den Berg,
357 Daryle Walker and Xiaogang Zhang<p>
358 Distributed under the Boost Software License, Version 1.0. (See accompanying
359 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>)
364 <div class="spirit-nav">
365 <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>