• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<html>
2<head>
3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
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.12.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">
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_to_ge"></a></span><a class="link" href="use_multiprecision.html#math_toolkit.high_precision.use_multiprecision.using_boost_multiprecision_to_ge">Using
36        Boost.Multiprecision to generate a high-precision array of sine coefficients
37        for use with FFT.</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 <code class="computeroutput"><span class="keyword">float</span></code>,
42        <code class="computeroutput"><span class="keyword">double</span></code> and <code class="computeroutput"><span class="keyword">long</span>
43        <span class="keyword">double</span></code>. For extended-precision calculations,
44        Boost.Multiprecision supplies a template data type called <code class="computeroutput"><span class="identifier">cpp_bin_float</span></code>.
45        The number of decimal digits of precision is fixed at compile-time via a
46        template parameter.
47      </p>
48<p>
49        One often needs to compute tables of numbers in mathematical software. To
50        avoid the <a href="https://en.wikipedia.org/wiki/Rounding#Table-maker's_dilemma" target="_top">Table-maker's
51        dilemma</a> it is necessary to use a higher precision type to compute
52        the table values so that they have the nearest representable bit-pattern
53        for the type, say <code class="computeroutput"><span class="keyword">double</span></code>, of
54        the table value.
55      </p>
56<p>
57        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
58        writes a header file <code class="computeroutput"><span class="identifier">sines</span><span class="special">.</span><span class="identifier">hpp</span></code> containing
59        an array of sine coefficients for use with a Fast Fourier Transform (FFT),
60        that can be included by the FFT program.
61      </p>
62<p>
63        To use Boost.Multiprecision's high-precision floating-point types and constants,
64        we need some includes:
65      </p>
66<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">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">&gt;</span>
67<span class="comment">// using boost::math::constants::pi;</span>
68
69<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">multiprecision</span><span class="special">/</span><span class="identifier">cpp_bin_float</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span> <span class="comment">// for</span>
70<span class="comment">// using boost::multiprecision::cpp_bin_float and</span>
71<span class="comment">// using boost::multiprecision::cpp_bin_float_50;</span>
72<span class="comment">// using boost::multiprecision::cpp_bin_float_quad;</span>
73
74<span class="preprocessor">#include</span> <span class="special">&lt;</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">&gt;</span> <span class="comment">// or &lt;array&gt; for std::array</span>
75
76<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>
77<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">limits</span><span class="special">&gt;</span>
78<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">vector</span><span class="special">&gt;</span>
79<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">algorithm</span><span class="special">&gt;</span>
80<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iomanip</span><span class="special">&gt;</span>
81<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iterator</span><span class="special">&gt;</span>
82<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">fstream</span><span class="special">&gt;</span>
83</pre>
84<p>
85        First, this example defines a prolog text string which is a C++ comment with
86        the program licence, copyright etc. (You would of course, tailor this to
87        your needs, including <span class="bold"><strong>your</strong></span> copyright claim).
88        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>.
89      </p>
90<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>
91<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>
92</pre>
93<p>
94        A fast Fourier transform (FFT), for example, may use a table of the values
95        of sin((π/2<sup>n</sup>) in its implementation details. In order to maximize the precision
96        in the FFT implementation, the precision of the tabulated trigonometric values
97        should exceed that of the built-in floating-point type used in the FFT.
98      </p>
99<p>
100        The sample below computes a table of the values of sin(π/2<sup>n</sup>) in the range
101        1 &lt;= n &lt;= 31.
102      </p>
103<p>
104        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
105        decimal digits from Boost.Multiprecision, the value of constant π retrieved
106        from Boost.Math, guaranteed to be initialized with the very last bit of precision
107        for the type, here <code class="computeroutput"><span class="identifier">cpp_bin_float_50</span></code>,
108        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>.
109      </p>
110<p>
111        define the number of values (32) in the array of sines.
112      </p>
113<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>
114<span class="comment">//cpp_bin_float_50 p = pi&lt;cpp_bin_float_50&gt;();</span>
115<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">&lt;</span><span class="identifier">cpp_bin_float_50</span><span class="special">&gt;();</span>
116
117<span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span> <span class="special">&lt;</span><span class="identifier">cpp_bin_float_50</span><span class="special">&gt;</span> <span class="identifier">sin_values</span> <span class="special">(</span><span class="identifier">size</span><span class="special">);</span>
118<span class="keyword">unsigned</span> <span class="identifier">n</span> <span class="special">=</span> <span class="number">1U</span><span class="special">;</span>
119<span class="comment">// Generate the sine values.</span>
120<span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span>
121<span class="special">(</span>
122  <span class="identifier">sin_values</span><span class="special">.</span><span class="identifier">begin</span> <span class="special">(),</span>
123  <span class="identifier">sin_values</span><span class="special">.</span><span class="identifier">end</span> <span class="special">(),</span>
124  <span class="special">[&amp;</span><span class="identifier">n</span><span class="special">](</span><span class="identifier">cpp_bin_float_50</span><span class="special">&amp;</span> <span class="identifier">y</span><span class="special">)</span>
125  <span class="special">{</span>
126    <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">&lt;</span><span class="identifier">cpp_bin_float_50</span><span class="special">&gt;()</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>
127    <span class="special">++</span><span class="identifier">n</span><span class="special">;</span>
128  <span class="special">}</span>
129<span class="special">);</span>
130</pre>
131<p>
132        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,
133        or <code class="computeroutput"><span class="keyword">long</span> <span class="keyword">double</span></code>,
134        or a user defined type like <code class="computeroutput"><span class="identifier">cpp_bin_float_50</span></code>.
135      </p>
136<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>
137
138<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"Generating an `std::array` or `boost::array` for floating-point type: "</span>
139  <span class="special">&lt;&lt;</span> <span class="identifier">fp_type</span> <span class="special">&lt;&lt;</span> <span class="string">". "</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
140</pre>
141<p>
142        By default, output would only show the standard 6 decimal digits, so set
143        precision to show enough significant digits for the chosen floating-point
144        type. For <code class="computeroutput"><span class="identifier">cpp_bin_float_50</span></code>
145        is 50. (50 decimal digits should be ample for most applications).
146      </p>
147<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">&lt;</span><span class="identifier">cpp_bin_float_50</span><span class="special">&gt;::</span><span class="identifier">digits10</span><span class="special">;</span>
148
149<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"Sines table precision is "</span> <span class="special">&lt;&lt;</span> <span class="identifier">precision</span> <span class="special">&lt;&lt;</span> <span class="string">" decimal digits. "</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
150</pre>
151<p>
152        Of course, one could also choose a lower precision for the table values,
153        for example,
154      </p>
155<p>
156        <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">streamsize</span> <span class="identifier">precision</span>
157        <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">cpp_bin_float_quad</span><span class="special">&gt;::</span><span class="identifier">max_digits10</span><span class="special">;</span></code>
158      </p>
159<p>
160        128-bit 'quad' precision of 36 decimal digits would be sufficient for the
161        most precise current <code class="computeroutput"><span class="keyword">long</span> <span class="keyword">double</span></code>
162        implementations using 128-bit. In general, it should be a couple of decimal
163        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">&lt;</span><span class="identifier">RealType</span><span class="special">&gt;::</span><span class="identifier">max_digits10</span></code>
164        for the target system floating-point type. (If the implementation does not
165        provide <code class="computeroutput"><span class="identifier">max_digits10</span></code>, the
166        the Kahan formula <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">RealType</span><span class="special">&gt;::</span><span class="identifier">digits</span> <span class="special">*</span> <span class="number">3010</span><span class="special">/</span><span class="number">10000</span>
167        <span class="special">+</span> <span class="number">2</span></code>
168        can be used instead).
169      </p>
170<p>
171        The compiler will read these values as decimal digits strings and use the
172        nearest representation for the floating-point type.
173      </p>
174<p>
175        Now output all the sine table, to a file of your chosen name.
176      </p>
177<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>
178
179<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>
180<span class="comment">// &amp; uses default overwrite/ ios::replace.</span>
181<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>
182<span class="special">{</span>  <span class="comment">// failed to open OK!</span>
183  <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"Open file "</span> <span class="special">&lt;&lt;</span> <span class="identifier">sines_name</span> <span class="special">&lt;&lt;</span> <span class="string">" failed!"</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
184  <span class="keyword">return</span> <span class="identifier">EXIT_FAILURE</span><span class="special">;</span>
185<span class="special">}</span>
186<span class="keyword">else</span>
187<span class="special">{</span> <span class="comment">// Write prolog etc as a C++ comment.</span>
188  <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"Open file "</span> <span class="special">&lt;&lt;</span> <span class="identifier">sines_name</span> <span class="special">&lt;&lt;</span> <span class="string">" for output OK."</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
189  <span class="identifier">fout</span> <span class="special">&lt;&lt;</span> <span class="identifier">prolog</span>
190  <span class="special">&lt;&lt;</span> <span class="string">"// Table of "</span> <span class="special">&lt;&lt;</span> <span class="identifier">sin_values</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">&lt;&lt;</span> <span class="string">" values with "</span>
191    <span class="special">&lt;&lt;</span> <span class="identifier">precision</span> <span class="special">&lt;&lt;</span> <span class="string">" decimal digits precision,\n"</span>
192    <span class="string">"// generated by program fft_sines_table.cpp.\n"</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
193
194<span class="identifier">fout</span> <span class="special">&lt;&lt;</span> <span class="string">"#include &lt;array&gt; // std::array"</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
195
196<span class="comment">// Write the table of sines as a C++ array.</span>
197  <span class="identifier">fout</span> <span class="special">&lt;&lt;</span>  <span class="string">"\nstatic const std::array&lt;double, "</span> <span class="special">&lt;&lt;</span> <span class="identifier">size</span> <span class="special">&lt;&lt;</span> <span class="string">"&gt; sines =\n"</span>
198  <span class="string">"{{\n"</span><span class="special">;</span> <span class="comment">// 2nd { needed for some old GCC compiler versions.</span>
199  <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>
200
201  <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>
202  <span class="special">{</span>
203    <span class="identifier">fout</span> <span class="special">&lt;&lt;</span> <span class="string">"  "</span> <span class="special">&lt;&lt;</span> <span class="identifier">sin_values</span><span class="special">[</span><span class="identifier">i</span><span class="special">];</span>
204    <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>
205    <span class="special">{</span> <span class="comment">// next is last value.</span>
206      <span class="identifier">fout</span> <span class="special">&lt;&lt;</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>
207      <span class="keyword">break</span><span class="special">;</span>
208    <span class="special">}</span>
209    <span class="keyword">else</span>
210    <span class="special">{</span>
211      <span class="identifier">fout</span> <span class="special">&lt;&lt;</span> <span class="string">",\n"</span><span class="special">;</span>
212      <span class="identifier">i</span><span class="special">++;</span>
213    <span class="special">}</span>
214  <span class="special">}</span> <span class="comment">// for</span>
215
216  <span class="identifier">fout</span><span class="special">.</span><span class="identifier">close</span><span class="special">();</span>
217  <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"Closed file "</span> <span class="special">&lt;&lt;</span> <span class="identifier">sines_name</span> <span class="special">&lt;&lt;</span> <span class="string">" for output."</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
218<span class="special">}</span>
219</pre>
220<p>
221        The output file generated can be seen at <a href="../../../../example/sines.hpp" target="_top">../../example/sines.hpp</a>
222      </p>
223<p>
224        The table output is:
225      </p>
226<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>
227
228  <span class="number">1</span>
229  <span class="number">0.70710678118654752440084436210484903928483593768847</span>
230  <span class="number">0.38268343236508977172845998403039886676134456248563</span>
231  <span class="number">0.19509032201612826784828486847702224092769161775195</span>
232  <span class="number">0.098017140329560601994195563888641845861136673167501</span>
233  <span class="number">0.049067674327418014254954976942682658314745363025753</span>
234  <span class="number">0.024541228522912288031734529459282925065466119239451</span>
235  <span class="number">0.012271538285719926079408261951003212140372319591769</span>
236  <span class="number">0.0061358846491544753596402345903725809170578863173913</span>
237  <span class="number">0.003067956762965976270145365490919842518944610213452</span>
238  <span class="number">0.0015339801862847656123036971502640790799548645752374</span>
239  <span class="number">0.00076699031874270452693856835794857664314091945206328</span>
240  <span class="number">0.00038349518757139558907246168118138126339502603496474</span>
241  <span class="number">0.00019174759731070330743990956198900093346887403385916</span>
242  <span class="number">9.5873799095977345870517210976476351187065612851145e-05</span>
243  <span class="number">4.7936899603066884549003990494658872746866687685767e-05</span>
244  <span class="number">2.3968449808418218729186577165021820094761474895673e-05</span>
245  <span class="number">1.1984224905069706421521561596988984804731977538387e-05</span>
246  <span class="number">5.9921124526424278428797118088908617299871778780951e-06</span>
247  <span class="number">2.9960562263346607504548128083570598118251878683408e-06</span>
248  <span class="number">1.4980281131690112288542788461553611206917585861527e-06</span>
249  <span class="number">7.4901405658471572113049856673065563715595930217207e-07</span>
250  <span class="number">3.7450702829238412390316917908463317739740476297248e-07</span>
251  <span class="number">1.8725351414619534486882457659356361712045272098287e-07</span>
252  <span class="number">9.3626757073098082799067286680885620193236507169473e-08</span>
253  <span class="number">4.681337853654909269511551813854009695950362701667e-08</span>
254  <span class="number">2.3406689268274552759505493419034844037886207223779e-08</span>
255  <span class="number">1.1703344634137277181246213503238103798093456639976e-08</span>
256  <span class="number">5.8516723170686386908097901008341396943900085051757e-09</span>
257  <span class="number">2.9258361585343193579282304690689559020175857150074e-09</span>
258  <span class="number">1.4629180792671596805295321618659637103742615227834e-09</span>
259<span class="special">*/</span>
260</pre>
261<p>
262        The output can be copied as text and readily integrated into a given source
263        code. Alternatively, the output can be written to a text or even be used
264        within a self-written automatic code generator as this example.
265      </p>
266<p>
267        A computer algebra system can be used to verify the results obtained from
268        Boost.Math and Boost.Multiprecision. For example, the <a href="http://www.wolfram.com/products/mathematica/index.html" target="_top">Wolfram
269        Mathematica</a> computer algebra system can obtain a similar table with
270        the command:
271      </p>
272<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>
273</pre>
274<p>
275        The <a href="http://www.wolframalpha.com/" target="_top">Wolfram Alpha</a> computational
276        knowledge engine can also be used to generate this table. The same command
277        can be pasted into the compute box.
278      </p>
279<p>
280        The full source of this example is at <a href="../../../../example/fft_sines_table.cpp" target="_top">fft_sines_table.cpp</a>
281      </p>
282</div>
283<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
284<td align="left"></td>
285<td align="right"><div class="copyright-footer">Copyright © 2006-2019 Nikhar
286      Agrawal, Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos,
287      Hubert Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Matthew Pulver, Johan
288      Råde, Gautam Sewani, Benjamin Sobotta, Nicholas Thompson, Thijs van den Berg,
289      Daryle Walker and Xiaogang Zhang<p>
290        Distributed under the Boost Software License, Version 1.0. (See accompanying
291        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>)
292      </p>
293</div></td>
294</tr></table>
295<hr>
296<div class="spirit-nav">
297<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>
298</div>
299</body>
300</html>
301