3 <meta http-equiv=
"Content-Type" content=
"text/html; charset=US-ASCII">
4 <title>Calculating an Integral
</title>
5 <link rel=
"stylesheet" href=
"../../../../../../../../doc/src/boostbook.css" type=
"text/css">
6 <meta name=
"generator" content=
"DocBook XSL Stylesheets V1.77.1">
7 <link rel=
"home" href=
"../../../../index.html" title=
"Chapter 1. Boost.Multiprecision">
8 <link rel=
"up" href=
"../fp_eg.html" title=
"Examples">
9 <link rel=
"prev" href=
"nd.html" title=
"Calculating a Derivative">
10 <link rel=
"next" href=
"poly_eg.html" title=
"Polynomial Evaluation">
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=
"nd.html"><img src=
"../../../../../../../../doc/src/images/prev.png" alt=
"Prev"></a><a accesskey=
"u" href=
"../fp_eg.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=
"poly_eg.html"><img src=
"../../../../../../../../doc/src/images/next.png" alt=
"Next"></a>
26 <div class=
"titlepage"><div><div><h5 class=
"title">
27 <a name=
"boost_multiprecision.tut.floats.fp_eg.gi"></a><a class=
"link" href=
"gi.html" title=
"Calculating an Integral">Calculating
29 </h5></div></div></div>
31 Similar to the generic derivative example, we can calculate integrals
34 <pre class=
"programlisting"><span class=
"keyword">template
</span><span class=
"special"><</span><span class=
"keyword">typename
</span> <span class=
"identifier">value_type
</span><span class=
"special">,
</span> <span class=
"keyword">typename
</span> <span class=
"identifier">function_type
</span><span class=
"special">></span>
35 <span class=
"keyword">inline
</span> <span class=
"identifier">value_type
</span> <span class=
"identifier">integral
</span><span class=
"special">(
</span><span class=
"keyword">const
</span> <span class=
"identifier">value_type
</span> <span class=
"identifier">a
</span><span class=
"special">,
</span>
36 <span class=
"keyword">const
</span> <span class=
"identifier">value_type
</span> <span class=
"identifier">b
</span><span class=
"special">,
</span>
37 <span class=
"keyword">const
</span> <span class=
"identifier">value_type
</span> <span class=
"identifier">tol
</span><span class=
"special">,
</span>
38 <span class=
"identifier">function_type
</span> <span class=
"identifier">func
</span><span class=
"special">)
</span>
39 <span class=
"special">{
</span>
40 <span class=
"keyword">unsigned
</span> <span class=
"identifier">n
</span> <span class=
"special">=
</span> <span class=
"number">1U</span><span class=
"special">;
</span>
42 <span class=
"identifier">value_type
</span> <span class=
"identifier">h
</span> <span class=
"special">=
</span> <span class=
"special">(
</span><span class=
"identifier">b
</span> <span class=
"special">-
</span> <span class=
"identifier">a
</span><span class=
"special">);
</span>
43 <span class=
"identifier">value_type
</span> <span class=
"identifier">I
</span> <span class=
"special">=
</span> <span class=
"special">(
</span><span class=
"identifier">func
</span><span class=
"special">(
</span><span class=
"identifier">a
</span><span class=
"special">)
</span> <span class=
"special">+
</span> <span class=
"identifier">func
</span><span class=
"special">(
</span><span class=
"identifier">b
</span><span class=
"special">))
</span> <span class=
"special">*
</span> <span class=
"special">(
</span><span class=
"identifier">h
</span> <span class=
"special">/
</span> <span class=
"number">2</span><span class=
"special">);
</span>
45 <span class=
"keyword">for
</span><span class=
"special">(
</span><span class=
"keyword">unsigned
</span> <span class=
"identifier">k
</span> <span class=
"special">=
</span> <span class=
"number">0U</span><span class=
"special">;
</span> <span class=
"identifier">k
</span> <span class=
"special"><</span> <span class=
"number">8U</span><span class=
"special">;
</span> <span class=
"identifier">k
</span><span class=
"special">++)
</span>
46 <span class=
"special">{
</span>
47 <span class=
"identifier">h
</span> <span class=
"special">/=
</span> <span class=
"number">2</span><span class=
"special">;
</span>
49 <span class=
"identifier">value_type
</span> <span class=
"identifier">sum
</span><span class=
"special">(
</span><span class=
"number">0</span><span class=
"special">);
</span>
50 <span class=
"keyword">for
</span><span class=
"special">(
</span><span class=
"keyword">unsigned
</span> <span class=
"identifier">j
</span> <span class=
"special">=
</span> <span class=
"number">1U</span><span class=
"special">;
</span> <span class=
"identifier">j
</span> <span class=
"special"><=
</span> <span class=
"identifier">n
</span><span class=
"special">;
</span> <span class=
"identifier">j
</span><span class=
"special">++)
</span>
51 <span class=
"special">{
</span>
52 <span class=
"identifier">sum
</span> <span class=
"special">+=
</span> <span class=
"identifier">func
</span><span class=
"special">(
</span><span class=
"identifier">a
</span> <span class=
"special">+
</span> <span class=
"special">(
</span><span class=
"identifier">value_type
</span><span class=
"special">((
</span><span class=
"identifier">j
</span> <span class=
"special">*
</span> <span class=
"number">2</span><span class=
"special">)
</span> <span class=
"special">-
</span> <span class=
"number">1</span><span class=
"special">)
</span> <span class=
"special">*
</span> <span class=
"identifier">h
</span><span class=
"special">));
</span>
53 <span class=
"special">}
</span>
55 <span class=
"keyword">const
</span> <span class=
"identifier">value_type
</span> <span class=
"identifier">I0
</span> <span class=
"special">=
</span> <span class=
"identifier">I
</span><span class=
"special">;
</span>
56 <span class=
"identifier">I
</span> <span class=
"special">=
</span> <span class=
"special">(
</span><span class=
"identifier">I
</span> <span class=
"special">/
</span> <span class=
"number">2</span><span class=
"special">)
</span> <span class=
"special">+
</span> <span class=
"special">(
</span><span class=
"identifier">h
</span> <span class=
"special">*
</span> <span class=
"identifier">sum
</span><span class=
"special">);
</span>
58 <span class=
"keyword">const
</span> <span class=
"identifier">value_type
</span> <span class=
"identifier">ratio
</span> <span class=
"special">=
</span> <span class=
"identifier">I0
</span> <span class=
"special">/
</span> <span class=
"identifier">I
</span><span class=
"special">;
</span>
59 <span class=
"keyword">const
</span> <span class=
"identifier">value_type
</span> <span class=
"identifier">delta
</span> <span class=
"special">=
</span> <span class=
"identifier">ratio
</span> <span class=
"special">-
</span> <span class=
"number">1</span><span class=
"special">;
</span>
60 <span class=
"keyword">const
</span> <span class=
"identifier">value_type
</span> <span class=
"identifier">delta_abs
</span> <span class=
"special">=
</span> <span class=
"special">((
</span><span class=
"identifier">delta
</span> <span class=
"special"><</span> <span class=
"number">0</span><span class=
"special">)
</span> <span class=
"special">?
</span> <span class=
"special">-
</span><span class=
"identifier">delta
</span> <span class=
"special">:
</span> <span class=
"identifier">delta
</span><span class=
"special">);
</span>
62 <span class=
"keyword">if
</span><span class=
"special">((
</span><span class=
"identifier">k
</span> <span class=
"special">></span> <span class=
"number">1U</span><span class=
"special">)
</span> <span class=
"special">&&</span> <span class=
"special">(
</span><span class=
"identifier">delta_abs
</span> <span class=
"special"><</span> <span class=
"identifier">tol
</span><span class=
"special">))
</span>
63 <span class=
"special">{
</span>
64 <span class=
"keyword">break
</span><span class=
"special">;
</span>
65 <span class=
"special">}
</span>
67 <span class=
"identifier">n
</span> <span class=
"special">*=
</span> <span class=
"number">2U</span><span class=
"special">;
</span>
68 <span class=
"special">}
</span>
70 <span class=
"keyword">return
</span> <span class=
"identifier">I
</span><span class=
"special">;
</span>
71 <span class=
"special">}
</span>
74 The following sample program shows how the function can be called, we
75 begin by defining a function object, which when integrated should yield
76 the Bessel J function:
78 <pre class=
"programlisting"><span class=
"keyword">template
</span><span class=
"special"><</span><span class=
"keyword">typename
</span> <span class=
"identifier">value_type
</span><span class=
"special">></span>
79 <span class=
"keyword">class
</span> <span class=
"identifier">cyl_bessel_j_integral_rep
</span>
80 <span class=
"special">{
</span>
81 <span class=
"keyword">public
</span><span class=
"special">:
</span>
82 <span class=
"identifier">cyl_bessel_j_integral_rep
</span><span class=
"special">(
</span><span class=
"keyword">const
</span> <span class=
"keyword">unsigned
</span> <span class=
"identifier">N
</span><span class=
"special">,
</span>
83 <span class=
"keyword">const
</span> <span class=
"identifier">value_type
</span><span class=
"special">&</span> <span class=
"identifier">X
</span><span class=
"special">)
</span> <span class=
"special">:
</span> <span class=
"identifier">n
</span><span class=
"special">(
</span><span class=
"identifier">N
</span><span class=
"special">),
</span> <span class=
"identifier">x
</span><span class=
"special">(
</span><span class=
"identifier">X
</span><span class=
"special">)
</span> <span class=
"special">{
</span> <span class=
"special">}
</span>
85 <span class=
"identifier">value_type
</span> <span class=
"keyword">operator
</span><span class=
"special">()(
</span><span class=
"keyword">const
</span> <span class=
"identifier">value_type
</span><span class=
"special">&</span> <span class=
"identifier">t
</span><span class=
"special">)
</span> <span class=
"keyword">const
</span>
86 <span class=
"special">{
</span>
87 <span class=
"comment">// pi * Jn(x) = Int_0^pi [cos(x * sin(t) - n*t) dt]
</span>
88 <span class=
"keyword">return
</span> <span class=
"identifier">cos
</span><span class=
"special">(
</span><span class=
"identifier">x
</span> <span class=
"special">*
</span> <span class=
"identifier">sin
</span><span class=
"special">(
</span><span class=
"identifier">t
</span><span class=
"special">)
</span> <span class=
"special">-
</span> <span class=
"special">(
</span><span class=
"identifier">n
</span> <span class=
"special">*
</span> <span class=
"identifier">t
</span><span class=
"special">));
</span>
89 <span class=
"special">}
</span>
91 <span class=
"keyword">private
</span><span class=
"special">:
</span>
92 <span class=
"keyword">const
</span> <span class=
"keyword">unsigned
</span> <span class=
"identifier">n
</span><span class=
"special">;
</span>
93 <span class=
"keyword">const
</span> <span class=
"identifier">value_type
</span> <span class=
"identifier">x
</span><span class=
"special">;
</span>
94 <span class=
"special">};
</span>
96 <pre class=
"programlisting"> <span class=
"comment">/* The function can now be called as follows: */
</span>
97 <span class=
"keyword">int
</span> <span class=
"identifier">main
</span><span class=
"special">(
</span><span class=
"keyword">int
</span><span class=
"special">,
</span> <span class=
"keyword">char
</span><span class=
"special">**)
</span>
98 <span class=
"special">{
</span>
99 <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>
100 <span class=
"keyword">typedef
</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=
"identifier">mp_type
</span><span class=
"special">;
</span>
102 <span class=
"keyword">const
</span> <span class=
"keyword">float
</span> <span class=
"identifier">j2_f
</span> <span class=
"special">=
</span>
103 <span class=
"identifier">integral
</span><span class=
"special">(
</span><span class=
"number">0.0F
</span><span class=
"special">,
</span>
104 <span class=
"identifier">pi
</span><span class=
"special"><</span><span class=
"keyword">float
</span><span class=
"special">>(),
</span>
105 <span class=
"number">0.01F
</span><span class=
"special">,
</span>
106 <span class=
"identifier">cyl_bessel_j_integral_rep
</span><span class=
"special"><</span><span class=
"keyword">float
</span><span class=
"special">>(
</span><span class=
"number">2U</span><span class=
"special">,
</span> <span class=
"number">1.23F
</span><span class=
"special">))
</span> <span class=
"special">/
</span> <span class=
"identifier">pi
</span><span class=
"special"><</span><span class=
"keyword">float
</span><span class=
"special">>();
</span>
108 <span class=
"keyword">const
</span> <span class=
"keyword">double
</span> <span class=
"identifier">j2_d
</span> <span class=
"special">=
</span>
109 <span class=
"identifier">integral
</span><span class=
"special">(
</span><span class=
"number">0.0</span><span class=
"special">,
</span>
110 <span class=
"identifier">pi
</span><span class=
"special"><</span><span class=
"keyword">double
</span><span class=
"special">>(),
</span>
111 <span class=
"number">0.0001</span><span class=
"special">,
</span>
112 <span class=
"identifier">cyl_bessel_j_integral_rep
</span><span class=
"special"><</span><span class=
"keyword">double
</span><span class=
"special">>(
</span><span class=
"number">2U</span><span class=
"special">,
</span> <span class=
"number">1.23</span><span class=
"special">))
</span> <span class=
"special">/
</span> <span class=
"identifier">pi
</span><span class=
"special"><</span><span class=
"keyword">double
</span><span class=
"special">>();
</span>
114 <span class=
"keyword">const
</span> <span class=
"identifier">mp_type
</span> <span class=
"identifier">j2_mp
</span> <span class=
"special">=
</span>
115 <span class=
"identifier">integral
</span><span class=
"special">(
</span><span class=
"identifier">mp_type
</span><span class=
"special">(
</span><span class=
"number">0</span><span class=
"special">),
</span>
116 <span class=
"identifier">pi
</span><span class=
"special"><</span><span class=
"identifier">mp_type
</span><span class=
"special">>(),
</span>
117 <span class=
"identifier">mp_type
</span><span class=
"special">(
</span><span class=
"number">1.0E-20</span><span class=
"special">),
</span>
118 <span class=
"identifier">cyl_bessel_j_integral_rep
</span><span class=
"special"><</span><span class=
"identifier">mp_type
</span><span class=
"special">>(
</span><span class=
"number">2U</span><span class=
"special">,
</span> <span class=
"identifier">mp_type
</span><span class=
"special">(
</span><span class=
"number">123</span><span class=
"special">)
</span> <span class=
"special">/
</span> <span class=
"number">100</span><span class=
"special">))
</span> <span class=
"special">/
</span> <span class=
"identifier">pi
</span><span class=
"special"><</span><span class=
"identifier">mp_type
</span><span class=
"special">>();
</span>
120 <span class=
"comment">//
0.166369</span>
121 <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">cout
</span>
122 <span class=
"special"><<</span> <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">setprecision
</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=
"keyword">float
</span><span class=
"special">>::
</span><span class=
"identifier">digits10
</span><span class=
"special">)
</span>
123 <span class=
"special"><<</span> <span class=
"identifier">j2_f
</span>
124 <span class=
"special"><<</span> <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">endl
</span><span class=
"special">;
</span>
126 <span class=
"comment">//
0.166369383786814</span>
127 <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">cout
</span>
128 <span class=
"special"><<</span> <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">setprecision
</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=
"keyword">double
</span><span class=
"special">>::
</span><span class=
"identifier">digits10
</span><span class=
"special">)
</span>
129 <span class=
"special"><<</span> <span class=
"identifier">j2_d
</span>
130 <span class=
"special"><<</span> <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">endl
</span><span class=
"special">;
</span>
132 <span class=
"comment">//
0.16636938378681407351267852431513159437103348245333</span>
133 <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">cout
</span>
134 <span class=
"special"><<</span> <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">setprecision
</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">mp_type
</span><span class=
"special">>::
</span><span class=
"identifier">digits10
</span><span class=
"special">)
</span>
135 <span class=
"special"><<</span> <span class=
"identifier">j2_mp
</span>
136 <span class=
"special"><<</span> <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">endl
</span><span class=
"special">;
</span>
138 <span class=
"comment">//
</span>
139 <span class=
"comment">// Print true value for comparison:
</span>
140 <span class=
"comment">//
0.166369383786814073512678524315131594371033482453329</span>
141 <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">cout
</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">cyl_bessel_j
</span><span class=
"special">(
</span><span class=
"number">2</span><span class=
"special">,
</span> <span class=
"identifier">mp_type
</span><span class=
"special">(
</span><span class=
"number">123</span><span class=
"special">)
</span> <span class=
"special">/
</span> <span class=
"number">100</span><span class=
"special">)
</span> <span class=
"special"><<</span> <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">endl
</span><span class=
"special">;
</span>
142 <span class=
"special">}
</span>
145 <table xmlns:
rev=
"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width=
"100%"><tr>
146 <td align=
"left"></td>
147 <td align=
"right"><div class=
"copyright-footer">Copyright
© 2002-
2013 John Maddock and Christopher Kormanyos
<p>
148 Distributed under the Boost Software License, Version
1.0. (See accompanying
149 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>)
154 <div class=
"spirit-nav">
155 <a accesskey=
"p" href=
"nd.html"><img src=
"../../../../../../../../doc/src/images/prev.png" alt=
"Prev"></a><a accesskey=
"u" href=
"../fp_eg.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=
"poly_eg.html"><img src=
"../../../../../../../../doc/src/images/next.png" alt=
"Next"></a>