summaryrefslogtreecommitdiff
path: root/libs/math/doc/sf_and_dist/html/math_toolkit/special/factorials/sf_double_factorial.html
blob: ddd30492a407d5f785645528a116fdbe2017112e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Double Factorial</title>
<link rel="stylesheet" href="../../../../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
<link rel="home" href="../../../index.html" title="Math Toolkit">
<link rel="up" href="../factorials.html" title="Factorials and Binomial Coefficients">
<link rel="prev" href="sf_factorial.html" title="Factorial">
<link rel="next" href="sf_rising_factorial.html" title="Rising Factorial">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../../boost.png"></td>
<td align="center"><a href="../../../../../../../../index.html">Home</a></td>
<td align="center"><a href="../../../../../../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../../../../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="sf_factorial.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../factorials.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="sf_rising_factorial.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section math_toolkit_special_factorials_sf_double_factorial">
<div class="titlepage"><div><div><h4 class="title">
<a name="math_toolkit.special.factorials.sf_double_factorial"></a><a class="link" href="sf_double_factorial.html" title="Double Factorial">Double
        Factorial</a>
</h4></div></div></div>
<p>
</p>
<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">special_functions</span><span class="special">/</span><span class="identifier">factorials</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
</pre>
<p>
        </p>
<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">math</span><span class="special">{</span>

<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="identifier">T</span> <span class="identifier">double_factorial</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">i</span><span class="special">);</span>

<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <a class="link" href="../../policy.html" title="Policies">Policy</a><span class="special">&gt;</span>
<span class="identifier">T</span> <span class="identifier">double_factorial</span><span class="special">(</span><span class="keyword">unsigned</span> <span class="identifier">i</span><span class="special">,</span> <span class="keyword">const</span> <a class="link" href="../../policy.html" title="Policies">Policy</a><span class="special">&amp;);</span>

<span class="special">}}</span> <span class="comment">// namespaces</span>
</pre>
<p>
          Returns <code class="literal">i!!</code>.
        </p>
<p>
          The final <a class="link" href="../../policy.html" title="Policies">Policy</a> argument is
          optional and can be used to control the behaviour of the function: how
          it handles errors, what level of precision to use etc. Refer to the <a class="link" href="../../policy.html" title="Policies">policy documentation for more details</a>.
        </p>
<p>
          May return the result of <a class="link" href="../../main_overview/error_handling.html#overflow_error">overflow_error</a>
          if the result is too large to represent in type T. The implementation is
          designed to be optimised for small <span class="emphasis"><em>i</em></span> where table lookup
          of i! is possible.
        </p>
<div class="important"><table border="0" summary="Important">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../../../../../../doc/src/images/important.png"></td>
<th align="left">Important</th>
</tr>
<tr><td align="left" valign="top">
<p>
            The functions described above are templates where the template argument
            T can not be deduced from the arguments passed to the function. Therefore
            if you write something like:
          </p>
<p>
            <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">double_factorial</span><span class="special">(</span><span class="number">2</span><span class="special">);</span></code>
          </p>
<p>
            You will get a (possibly perplexing) compiler error, ususally indicating
            that there is no such function to be found. Instead you need to specifiy
            the return type explicity and write:
          </p>
<p>
            <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">double_factorial</span><span class="special">&lt;</span><span class="keyword">double</span><span class="special">&gt;(</span><span class="number">2</span><span class="special">);</span></code>
          </p>
<p>
            So that the return type is known. Further, the template argument must
            be a real-valued type such as <code class="computeroutput"><span class="keyword">float</span></code>
            or <code class="computeroutput"><span class="keyword">double</span></code> and not an integer
            type - that would overflow far too easily!
          </p>
<p>
            The source code <code class="computeroutput"><span class="identifier">static_assert</span></code>
            and comment just after the will be:
          </p>
<p>
</p>
<pre class="programlisting"><span class="identifier">BOOST_STATIC_ASSERT</span><span class="special">(!</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">is_integral</span><span class="special">&lt;</span><span class="identifier">T</span><span class="special">&gt;::</span><span class="identifier">value</span><span class="special">);</span>
<span class="comment">// factorial&lt;unsigned int&gt;(n) is not implemented</span>
<span class="comment">// because it would overflow integral type T for too small n</span>
<span class="comment">// to be useful. Use instead a floating-point type,</span>
<span class="comment">// and convert to an unsigned type if essential, for example:</span>
<span class="comment">// unsigned int nfac = static_cast&lt;unsigned int&gt;(factorial&lt;double&gt;(n));</span>
<span class="comment">// See factorial documentation for more detail.</span>
</pre>
<p>
          </p>
</td></tr>
</table></div>
<h5>
<a name="math_toolkit.special.factorials.sf_double_factorial.h0"></a>
          <span><a name="math_toolkit.special.factorials.sf_double_factorial.accuracy"></a></span><a class="link" href="sf_double_factorial.html#math_toolkit.special.factorials.sf_double_factorial.accuracy">Accuracy</a>
        </h5>
<p>
          The implementation uses a trivial adaptation of the factorial function,
          so error rates should be no more than a couple of epsilon higher.
        </p>
<h5>
<a name="math_toolkit.special.factorials.sf_double_factorial.h1"></a>
          <span><a name="math_toolkit.special.factorials.sf_double_factorial.testing"></a></span><a class="link" href="sf_double_factorial.html#math_toolkit.special.factorials.sf_double_factorial.testing">Testing</a>
        </h5>
<p>
          The spot tests for the double factorial use data generated by functions.wolfram.com.
        </p>
<h5>
<a name="math_toolkit.special.factorials.sf_double_factorial.h2"></a>
          <span><a name="math_toolkit.special.factorials.sf_double_factorial.implementation"></a></span><a class="link" href="sf_double_factorial.html#math_toolkit.special.factorials.sf_double_factorial.implementation">Implementation</a>
        </h5>
<p>
          The double factorial is implemented in terms of the factorial and gamma
          functions using the relations:
        </p>
<p>
          (2n)!! = 2<sup>n </sup> * n!
        </p>
<p>
          (2n+1)!! = (2n+1)! / (2<sup>n </sup> n!)
        </p>
<p>
          and
        </p>
<p>
          (2n-1)!! = &#915;((2n+1)/2) * 2<sup>n </sup> / sqrt(pi)
        </p>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2006-2010 John Maddock, Paul A. Bristow, Hubert Holin, Xiaogang Zhang, Bruno
      Lalande, Johan R&#229;de, Gautam Sewani and Thijs van den Berg<p>
        Distributed under the Boost Software License, Version 1.0. (See accompanying
        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>)
      </p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="sf_factorial.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../factorials.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="sf_rising_factorial.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>