]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | <html> |
2 | <head> | |
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"> | |
11 | </head> | |
12 | <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> | |
13 | <table cellpadding="2" width="100%"><tr> | |
14 | <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td> | |
15 | <td align="center"><a href="../../../../../../index.html">Home</a></td> | |
16 | <td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td> | |
17 | <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> | |
18 | <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> | |
19 | <td align="center"><a href="../../../../../../more/index.htm">More</a></td> | |
20 | </tr></table> | |
21 | <hr> | |
22 | <div class="spirit-nav"> | |
23 | <a accesskey="p" href="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> | |
24 | </div> | |
25 | <div class="section"> | |
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> | |
30 | <p> | |
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> | |
32 | </p> | |
33 | <h6> | |
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> | |
38 | </h6> | |
39 | <p> | |
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. | |
45 | </p> | |
46 | <p> | |
47 | To use these floating-point types and constants, we need some includes: | |
48 | </p> | |
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> | |
50 | ||
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> | |
53 | ||
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> | |
56 | </pre> | |
57 | <p> | |
58 | So now we can demonstrate with some trivial calculations: | |
59 | </p> | |
60 | <pre class="programlisting"><span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> | |
61 | <span class="special">{</span> | |
62 | </pre> | |
63 | <p> | |
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>. | |
67 | </p> | |
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> | |
69 | ||
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> | |
71 | </pre> | |
72 | <p> | |
73 | By default, output would only show the standard 6 decimal digits, so set | |
74 | precision to show all 50 significant digits. | |
75 | </p> | |
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> | |
78 | </pre> | |
79 | <p> | |
80 | which outputs: | |
81 | </p> | |
82 | <pre class="programlisting"><span class="number">0.14285714285714285714285714285714285714285714285714</span> | |
83 | </pre> | |
84 | <p> | |
85 | We can also use constants, guaranteed to be initialized with the very last | |
86 | bit of precision. | |
87 | </p> | |
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> | |
89 | ||
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> | |
91 | </pre> | |
92 | <p> | |
93 | which outputs | |
94 | </p> | |
95 | <pre class="programlisting"><span class="number">0.89759790102565521098932668093700082405633411410717</span> | |
96 | </pre> | |
97 | <h6> | |
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> | |
102 | </h6> | |
103 | <p> | |
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 | |
110 | parameter. | |
111 | </p> | |
112 | <p> | |
113 | To use these floating-point types and constants, we need some includes: | |
114 | </p> | |
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> | |
117 | ||
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> | |
120 | ||
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> | |
128 | </pre> | |
129 | <p> | |
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. | |
136 | </p> | |
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> | |
143 | ||
144 | <span class="string">"// Copyright ???? 2013.\n\n"</span> | |
145 | ||
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> | |
153 | ||
154 | ||
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> | |
159 | ||
160 | <span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> | |
161 | <span class="special">{</span> | |
162 | </pre> | |
163 | <p> | |
164 | One often needs to compute tables of numbers in mathematical software. | |
165 | </p> | |
166 | <p> | |
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. | |
171 | </p> | |
172 | <p> | |
173 | The sample below computes a table of the values of sin(π/2<sup>n</sup>) in the range | |
174 | 1 <= n <= 31. | |
175 | </p> | |
176 | <p> | |
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>. | |
182 | </p> | |
183 | <p> | |
184 | define the number of values in the array. | |
185 | </p> | |
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> | |
189 | ||
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> | |
203 | </pre> | |
204 | <p> | |
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>. | |
208 | </p> | |
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> | |
210 | ||
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> | |
213 | </pre> | |
214 | <p> | |
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). | |
219 | </p> | |
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> | |
221 | ||
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> | |
224 | </pre> | |
225 | <p> | |
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. | |
235 | </p> | |
236 | <p> | |
237 | The compiler will read these values as decimal digits strings and use the | |
238 | nearest representation for the floating-point type. | |
239 | </p> | |
240 | <p> | |
241 | Now output all the sine table, to a file of your chosen name. | |
242 | </p> | |
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> | |
244 | ||
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> | |
258 | ||
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> | |
267 | ||
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> | |
282 | ||
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> | |
285 | ||
286 | <span class="special">}</span> | |
287 | </pre> | |
288 | <p> | |
289 | The output file generated can be seen at <a href="../../../../example/sines.hpp" target="_top">../../example/sines.hpp</a> | |
290 | </p> | |
291 | <p> | |
292 | The table output is: | |
293 | </p> | |
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> | |
295 | ||
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> | |
328 | </pre> | |
329 | <p> | |
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. | |
333 | </p> | |
334 | <p> | |
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 | |
338 | the command: | |
339 | </p> | |
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> | |
341 | </pre> | |
342 | <p> | |
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. | |
346 | </p> | |
347 | </div> | |
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>) | |
356 | </p> | |
357 | </div></td> | |
358 | </tr></table> | |
359 | <hr> | |
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> | |
362 | </div> | |
363 | </body> | |
364 | </html> |