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.77.1">
7 <link rel=
"home" href=
"../../index.html" title=
"Math Toolkit 2.5.1">
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>