]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | <html> |
2 | <head> | |
3 | <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> | |
4 | <title>Distribution Construction Examples</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="../weg.html" title="Worked Examples"> | |
9 | <link rel="prev" href="../weg.html" title="Worked Examples"> | |
10 | <link rel="next" href="st_eg.html" title="Student's t Distribution Examples"> | |
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="../weg.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../weg.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="st_eg.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> | |
24 | </div> | |
25 | <div class="section"> | |
26 | <div class="titlepage"><div><div><h4 class="title"> | |
27 | <a name="math_toolkit.stat_tut.weg.dist_construct_eg"></a><a class="link" href="dist_construct_eg.html" title="Distribution Construction Examples">Distribution | |
28 | Construction Examples</a> | |
29 | </h4></div></div></div> | |
30 | <p> | |
31 | The structure of distributions is rather different from some other statistical | |
32 | libraries, for example, those written in less object-oriented language | |
33 | like FORTRAN and C: these provide a few arguments to each free function. | |
34 | </p> | |
35 | <p> | |
36 | Boost.Math library provides each distribution as a template C++ class. | |
37 | A distribution is constructed with a few arguments, and then member and | |
38 | non-member functions are used to find values of the distribution, often | |
39 | a function of a random variate. | |
40 | </p> | |
41 | <p> | |
42 | For this demonstration, first we need some includes to access the negative | |
43 | binomial distribution (and the binomial, beta and gamma distributions too). | |
44 | </p> | |
45 | <p> | |
46 | To demonstrate the use with a high precision User-defined floating-point | |
47 | type <code class="computeroutput"><span class="identifier">cpp_dec_float</span></code> we also | |
48 | need an include from Boost.Multiprecision. | |
49 | </p> | |
50 | <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">distributions</span><span class="special">/</span><span class="identifier">negative_binomial</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> <span class="comment">// for negative_binomial_distribution</span> | |
51 | <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">negative_binomial_distribution</span><span class="special">;</span> <span class="comment">// default type is double.</span> | |
52 | <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">negative_binomial</span><span class="special">;</span> <span class="comment">// typedef provides default type is double.</span> | |
53 | <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">distributions</span><span class="special">/</span><span class="identifier">binomial</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> <span class="comment">// for binomial_distribution.</span> | |
54 | <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">distributions</span><span class="special">/</span><span class="identifier">beta</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> <span class="comment">// for beta_distribution.</span> | |
55 | <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">distributions</span><span class="special">/</span><span class="identifier">gamma</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> <span class="comment">// for gamma_distribution.</span> | |
56 | <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">distributions</span><span class="special">/</span><span class="identifier">normal</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> <span class="comment">// for normal_distribution.</span> | |
57 | ||
58 | <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> <span class="comment">// for cpp_dec_float_100</span> | |
59 | </pre> | |
60 | <p> | |
61 | Several examples of constructing distributions follow: | |
62 | </p> | |
63 | <p> | |
64 | First, a negative binomial distribution with 8 successes and a success | |
65 | fraction 0.25, 25% or 1 in 4, is constructed like this: | |
66 | </p> | |
67 | <pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">negative_binomial_distribution</span><span class="special"><</span><span class="keyword">double</span><span class="special">></span> <span class="identifier">mydist0</span><span class="special">(</span><span class="number">8.</span><span class="special">,</span> <span class="number">0.25</span><span class="special">);</span> | |
68 | </pre> | |
69 | <p> | |
70 | But this is inconveniently long, so we might be tempted to write | |
71 | </p> | |
72 | <pre class="programlisting"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">;</span> | |
73 | </pre> | |
74 | <p> | |
75 | but this might risk ambiguity with names in <code class="computeroutput"><span class="identifier">std</span> | |
76 | <span class="identifier">random</span></code> so <span class="bold"><strong>much</strong></span> | |
77 | better is explicit <code class="computeroutput"><span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span></code> | |
78 | statements, for example: | |
79 | </p> | |
80 | <pre class="programlisting"><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">negative_binomial_distribution</span><span class="special">;</span> | |
81 | </pre> | |
82 | <p> | |
83 | and we can still reduce typing. | |
84 | </p> | |
85 | <p> | |
86 | Since the vast majority of applications use will be using <code class="computeroutput"><span class="keyword">double</span></code> precision, the template argument | |
87 | to the distribution (<code class="computeroutput"><span class="identifier">RealType</span></code>) | |
88 | defaults to type <code class="computeroutput"><span class="keyword">double</span></code>, so | |
89 | we can also write: | |
90 | </p> | |
91 | <pre class="programlisting"><span class="identifier">negative_binomial_distribution</span><span class="special"><></span> <span class="identifier">mydist9</span><span class="special">(</span><span class="number">8.</span><span class="special">,</span> <span class="number">0.25</span><span class="special">);</span> <span class="comment">// Uses default `RealType = double`.</span> | |
92 | </pre> | |
93 | <p> | |
94 | But the name <code class="computeroutput"><span class="identifier">negative_binomial_distribution</span></code> | |
95 | is still inconveniently long, so, for most distributions, a convenience | |
96 | <code class="computeroutput"><span class="keyword">typedef</span></code> is provided, for example: | |
97 | </p> | |
98 | <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">negative_binomial_distribution</span><span class="special"><</span><span class="keyword">double</span><span class="special">></span> <span class="identifier">negative_binomial</span><span class="special">;</span> <span class="comment">// Reserved name of type double.</span> | |
99 | </pre> | |
100 | <div class="caution"><table border="0" summary="Caution"> | |
101 | <tr> | |
102 | <td rowspan="2" align="center" valign="top" width="25"><img alt="[Caution]" src="../../../../../../../doc/src/images/caution.png"></td> | |
103 | <th align="left">Caution</th> | |
104 | </tr> | |
105 | <tr><td align="left" valign="top"><p> | |
106 | This convenience typedef is <span class="bold"><strong>not provided</strong></span> | |
107 | if a clash would occur with the name of a function: currently only <code class="computeroutput"><span class="identifier">beta</span></code> and <code class="computeroutput"><span class="identifier">gamma</span></code> | |
108 | fall into this category. | |
109 | </p></td></tr> | |
110 | </table></div> | |
111 | <p> | |
112 | So, after a using statement, | |
113 | </p> | |
114 | <pre class="programlisting"><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">negative_binomial</span><span class="special">;</span> | |
115 | </pre> | |
116 | <p> | |
117 | we have a convenient typedef to <code class="computeroutput"><span class="identifier">negative_binomial_distribution</span><span class="special"><</span><span class="keyword">double</span><span class="special">></span></code>: | |
118 | </p> | |
119 | <pre class="programlisting"><span class="identifier">negative_binomial</span> <span class="identifier">mydist</span><span class="special">(</span><span class="number">8.</span><span class="special">,</span> <span class="number">0.25</span><span class="special">);</span> | |
120 | </pre> | |
121 | <p> | |
122 | Some more examples using the convenience typedef: | |
123 | </p> | |
124 | <pre class="programlisting"><span class="identifier">negative_binomial</span> <span class="identifier">mydist10</span><span class="special">(</span><span class="number">5.</span><span class="special">,</span> <span class="number">0.4</span><span class="special">);</span> <span class="comment">// Both arguments double.</span> | |
125 | </pre> | |
126 | <p> | |
127 | And automatic conversion takes place, so you can use integers and floats: | |
128 | </p> | |
129 | <pre class="programlisting"><span class="identifier">negative_binomial</span> <span class="identifier">mydist11</span><span class="special">(</span><span class="number">5</span><span class="special">,</span> <span class="number">0.4</span><span class="special">);</span> <span class="comment">// Using provided typedef double, int and double arguments.</span> | |
130 | </pre> | |
131 | <p> | |
132 | This is probably the most common usage. | |
133 | </p> | |
134 | <pre class="programlisting"><span class="identifier">negative_binomial</span> <span class="identifier">mydist12</span><span class="special">(</span><span class="number">5.</span><span class="special">,</span> <span class="number">0.4F</span><span class="special">);</span> <span class="comment">// Double and float arguments.</span> | |
135 | <span class="identifier">negative_binomial</span> <span class="identifier">mydist13</span><span class="special">(</span><span class="number">5</span><span class="special">,</span> <span class="number">1</span><span class="special">);</span> <span class="comment">// Both arguments integer.</span> | |
136 | </pre> | |
137 | <p> | |
138 | Similarly for most other distributions like the binomial. | |
139 | </p> | |
140 | <pre class="programlisting"><span class="identifier">binomial</span> <span class="identifier">mybinomial</span><span class="special">(</span><span class="number">1</span><span class="special">,</span> <span class="number">0.5</span><span class="special">);</span> <span class="comment">// is more concise than</span> | |
141 | <span class="identifier">binomial_distribution</span><span class="special"><></span> <span class="identifier">mybinomd1</span><span class="special">(</span><span class="number">1</span><span class="special">,</span> <span class="number">0.5</span><span class="special">);</span> | |
142 | </pre> | |
143 | <p> | |
144 | For cases when the typdef distribution name would clash with a math special | |
145 | function (currently only beta and gamma) the typedef is deliberately not | |
146 | provided, and the longer version of the name must be used. For example | |
147 | do not use: | |
148 | </p> | |
149 | <pre class="programlisting"><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">beta</span><span class="special">;</span> | |
150 | <span class="identifier">beta</span> <span class="identifier">mybetad0</span><span class="special">(</span><span class="number">1</span><span class="special">,</span> <span class="number">0.5</span><span class="special">);</span> <span class="comment">// Error beta is a math FUNCTION!</span> | |
151 | </pre> | |
152 | <p> | |
153 | Which produces the error messages: | |
154 | </p> | |
155 | <pre class="programlisting">error C2146: syntax error : missing ';' before identifier 'mybetad0' | |
156 | warning C4551: function call missing argument list | |
157 | error C3861: 'mybetad0': identifier not found | |
158 | </pre> | |
159 | <p> | |
160 | Instead you should use: | |
161 | </p> | |
162 | <pre class="programlisting"><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">beta_distribution</span><span class="special">;</span> | |
163 | <span class="identifier">beta_distribution</span><span class="special"><></span> <span class="identifier">mybetad1</span><span class="special">(</span><span class="number">1</span><span class="special">,</span> <span class="number">0.5</span><span class="special">);</span> | |
164 | </pre> | |
165 | <p> | |
166 | or for the gamma distribution: | |
167 | </p> | |
168 | <pre class="programlisting"><span class="identifier">gamma_distribution</span><span class="special"><></span> <span class="identifier">mygammad1</span><span class="special">(</span><span class="number">1</span><span class="special">,</span> <span class="number">0.5</span><span class="special">);</span> | |
169 | </pre> | |
170 | <p> | |
171 | We can, of course, still provide the type explicitly thus: | |
172 | </p> | |
173 | <pre class="programlisting"><span class="comment">// Explicit double precision: both arguments are double:</span> | |
174 | <span class="identifier">negative_binomial_distribution</span><span class="special"><</span><span class="keyword">double</span><span class="special">></span> <span class="identifier">mydist1</span><span class="special">(</span><span class="number">8.</span><span class="special">,</span> <span class="number">0.25</span><span class="special">);</span> | |
175 | ||
176 | <span class="comment">// Explicit float precision, double arguments are truncated to float:</span> | |
177 | <span class="identifier">negative_binomial_distribution</span><span class="special"><</span><span class="keyword">float</span><span class="special">></span> <span class="identifier">mydist2</span><span class="special">(</span><span class="number">8.</span><span class="special">,</span> <span class="number">0.25</span><span class="special">);</span> | |
178 | ||
179 | <span class="comment">// Explicit float precision, integer & double arguments converted to float:</span> | |
180 | <span class="identifier">negative_binomial_distribution</span><span class="special"><</span><span class="keyword">float</span><span class="special">></span> <span class="identifier">mydist3</span><span class="special">(</span><span class="number">8</span><span class="special">,</span> <span class="number">0.25</span><span class="special">);</span> | |
181 | ||
182 | <span class="comment">// Explicit float precision, float arguments, so no conversion:</span> | |
183 | <span class="identifier">negative_binomial_distribution</span><span class="special"><</span><span class="keyword">float</span><span class="special">></span> <span class="identifier">mydist4</span><span class="special">(</span><span class="number">8.F</span><span class="special">,</span> <span class="number">0.25F</span><span class="special">);</span> | |
184 | ||
185 | <span class="comment">// Explicit float precision, integer arguments promoted to float.</span> | |
186 | <span class="identifier">negative_binomial_distribution</span><span class="special"><</span><span class="keyword">float</span><span class="special">></span> <span class="identifier">mydist5</span><span class="special">(</span><span class="number">8</span><span class="special">,</span> <span class="number">1</span><span class="special">);</span> | |
187 | ||
188 | <span class="comment">// Explicit double precision:</span> | |
189 | <span class="identifier">negative_binomial_distribution</span><span class="special"><</span><span class="keyword">double</span><span class="special">></span> <span class="identifier">mydist6</span><span class="special">(</span><span class="number">8.</span><span class="special">,</span> <span class="number">0.25</span><span class="special">);</span> | |
190 | ||
191 | <span class="comment">// Explicit long double precision:</span> | |
192 | <span class="identifier">negative_binomial_distribution</span><span class="special"><</span><span class="keyword">long</span> <span class="keyword">double</span><span class="special">></span> <span class="identifier">mydist7</span><span class="special">(</span><span class="number">8.</span><span class="special">,</span> <span class="number">0.25</span><span class="special">);</span> | |
193 | </pre> | |
194 | <p> | |
195 | And you can use your own RealType, for example, <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">math</span><span class="special">::</span><span class="identifier">cpp_dec_float_50</span></code> | |
196 | (an arbitrary 50 decimal digits precision type), then we can write: | |
197 | </p> | |
198 | <pre class="programlisting"> <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">multiprecision</span><span class="special">;</span> | |
199 | ||
200 | <span class="identifier">negative_binomial_distribution</span><span class="special"><</span><span class="identifier">cpp_dec_float_50</span><span class="special">></span> <span class="identifier">mydist8</span><span class="special">(</span><span class="number">8</span><span class="special">,</span> <span class="number">0.25</span><span class="special">);</span> | |
201 | <span class="comment">// `integer` arguments are promoted to your RealType exactly, but</span> | |
202 | <span class="comment">// `double` argument are converted to RealType,</span> | |
203 | <span class="comment">// possibly losing precision, so don't write:</span> | |
204 | ||
205 | <span class="identifier">negative_binomial_distribution</span><span class="special"><</span><span class="identifier">cpp_dec_float_50</span><span class="special">></span> <span class="identifier">mydist20</span><span class="special">(</span><span class="number">8</span><span class="special">,</span> <span class="number">0.23456789012345678901234567890</span><span class="special">);</span> | |
206 | <span class="comment">// to avoid truncation of second parameter to `0.2345678901234567`.</span> | |
207 | ||
208 | <span class="identifier">negative_binomial_distribution</span><span class="special"><</span><span class="identifier">cpp_dec_float_50</span><span class="special">></span> <span class="identifier">mydist21</span><span class="special">(</span><span class="number">8</span><span class="special">,</span> <span class="identifier">cpp_dec_float_50</span><span class="special">(</span><span class="string">"0.23456789012345678901234567890"</span><span class="special">)</span> <span class="special">);</span> | |
209 | ||
210 | <span class="comment">// Ensure that all potentially significant digits are shown.</span> | |
211 | <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> | |
212 | <span class="identifier">cpp_dec_float_50</span> <span class="identifier">x</span><span class="special">(</span><span class="string">"1.23456789012345678901234567890"</span><span class="special">);</span> | |
213 | <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">pdf</span><span class="special">(</span><span class="identifier">mydist8</span><span class="special">,</span> <span class="identifier">x</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> | |
214 | </pre> | |
215 | <pre class="programlisting"><span class="identifier">showing</span> <span class="number">0.00012630010495970320103876754721976419438231705359935</span> | |
216 | </pre> | |
217 | <div class="warning"><table border="0" summary="Warning"> | |
218 | <tr> | |
219 | <td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../../../../../doc/src/images/warning.png"></td> | |
220 | <th align="left">Warning</th> | |
221 | </tr> | |
222 | <tr><td align="left" valign="top"><p> | |
223 | When using multiprecision, it is all too easy to get accidental truncation! | |
224 | </p></td></tr> | |
225 | </table></div> | |
226 | <p> | |
227 | For example, if you write | |
228 | </p> | |
229 | <pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">pdf</span><span class="special">(</span><span class="identifier">mydist8</span><span class="special">,</span> <span class="number">1.23456789012345678901234567890</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> | |
230 | </pre> | |
231 | <p> | |
232 | showing 0.00012630010495970318465064569310967179576805651692929, which | |
233 | is wrong at about the 17th decimal digit! | |
234 | </p> | |
235 | <p> | |
236 | This is because the value provided is truncated to a <code class="computeroutput"><span class="keyword">double</span></code>, | |
237 | effectively <code class="computeroutput"><span class="keyword">double</span> <span class="identifier">x</span> | |
238 | <span class="special">=</span> <span class="number">1.23456789012345678901234567890</span><span class="special">;</span></code> | |
239 | </p> | |
240 | <p> | |
241 | Then the now <code class="computeroutput"><span class="keyword">double</span> <span class="identifier">x</span></code> | |
242 | is passed to function <code class="computeroutput"><span class="identifier">pdf</span></code>, | |
243 | and this truncated <code class="computeroutput"><span class="keyword">double</span></code> | |
244 | value is finally promoted to <code class="computeroutput"><span class="identifier">cpp_dec_float_50</span></code>. | |
245 | </p> | |
246 | <p> | |
247 | Another way of quietly getting the wrong answer is to write: | |
248 | </p> | |
249 | <pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">pdf</span><span class="special">(</span><span class="identifier">mydist8</span><span class="special">,</span> <span class="identifier">cpp_dec_float_50</span><span class="special">(</span><span class="number">1.23456789012345678901234567890</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> | |
250 | </pre> | |
251 | <p> | |
252 | A correct way from a multi-digit string value is | |
253 | </p> | |
254 | <pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">pdf</span><span class="special">(</span><span class="identifier">mydist8</span><span class="special">,</span> <span class="identifier">cpp_dec_float_50</span><span class="special">(</span><span class="string">"1.23456789012345678901234567890"</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> | |
255 | </pre> | |
256 | <div class="tip"><table border="0" summary="Tip"> | |
257 | <tr> | |
258 | <td rowspan="2" align="center" valign="top" width="25"><img alt="[Tip]" src="../../../../../../../doc/src/images/tip.png"></td> | |
259 | <th align="left">Tip</th> | |
260 | </tr> | |
261 | <tr><td align="left" valign="top"><p> | |
262 | Getting about 17 decimal digits followed by many zeros is often a sign | |
263 | of accidental truncation. | |
264 | </p></td></tr> | |
265 | </table></div> | |
266 | <h5> | |
267 | <a name="math_toolkit.stat_tut.weg.dist_construct_eg.h0"></a> | |
268 | <span class="phrase"><a name="math_toolkit.stat_tut.weg.dist_construct_eg.default_arguments_to_distributio"></a></span><a class="link" href="dist_construct_eg.html#math_toolkit.stat_tut.weg.dist_construct_eg.default_arguments_to_distributio">Default | |
269 | arguments to distribution constructors.</a> | |
270 | </h5> | |
271 | <p> | |
272 | Note that default constructor arguments are only provided for some distributions. | |
273 | So if you wrongly assume a default argument, you will get an error message, | |
274 | for example: | |
275 | </p> | |
276 | <pre class="programlisting"><span class="identifier">negative_binomial_distribution</span><span class="special"><></span> <span class="identifier">mydist8</span><span class="special">;</span> | |
277 | </pre> | |
278 | <pre class="programlisting">error C2512 no appropriate default constructor available.</pre> | |
279 | <p> | |
280 | No default constructors are provided for the <code class="computeroutput"><span class="identifier">negative</span> | |
281 | <span class="identifier">binomial</span></code> distribution, because | |
282 | it is difficult to chose any sensible default values for this distribution. | |
283 | </p> | |
284 | <p> | |
285 | For other distributions, like the normal distribution, it is obviously | |
286 | very useful to provide 'standard' defaults for the mean (zero) and standard | |
287 | deviation (unity) thus: | |
288 | </p> | |
289 | <pre class="programlisting"><span class="identifier">normal_distribution</span><span class="special">(</span><span class="identifier">RealType</span> <span class="identifier">mean</span> <span class="special">=</span> <span class="number">0</span><span class="special">,</span> <span class="identifier">RealType</span> <span class="identifier">sd</span> <span class="special">=</span> <span class="number">1</span><span class="special">);</span> | |
290 | </pre> | |
291 | <p> | |
292 | So in this case we can write: | |
293 | </p> | |
294 | <pre class="programlisting"> <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">normal</span><span class="special">;</span> | |
295 | ||
296 | <span class="identifier">normal</span> <span class="identifier">norm1</span><span class="special">;</span> <span class="comment">// Standard normal distribution.</span> | |
297 | <span class="identifier">normal</span> <span class="identifier">norm2</span><span class="special">(</span><span class="number">2</span><span class="special">);</span> <span class="comment">// Mean = 2, std deviation = 1.</span> | |
298 | <span class="identifier">normal</span> <span class="identifier">norm3</span><span class="special">(</span><span class="number">2</span><span class="special">,</span> <span class="number">3</span><span class="special">);</span> <span class="comment">// Mean = 2, std deviation = 3.</span> | |
299 | ||
300 | <span class="special">}</span> | |
301 | <span class="keyword">catch</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">exception</span> <span class="special">&</span><span class="identifier">ex</span><span class="special">)</span> | |
302 | <span class="special">{</span> | |
303 | <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">ex</span><span class="special">.</span><span class="identifier">what</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> | |
304 | <span class="special">}</span> | |
305 | ||
306 | <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span> | |
307 | <span class="special">}</span> <span class="comment">// int main()</span> | |
308 | </pre> | |
309 | <p> | |
310 | There is no useful output from this demonstration program, of course. | |
311 | </p> | |
312 | <p> | |
313 | See <a href="../../../../../example/distribution_construction.cpp" target="_top">distribution_construction.cpp</a> | |
314 | for full source code. | |
315 | </p> | |
316 | </div> | |
317 | <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> | |
318 | <td align="left"></td> | |
319 | <td align="right"><div class="copyright-footer">Copyright © 2006-2010, 2012-2014 Nikhar Agrawal, | |
320 | Anton Bikineev, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert | |
321 | Holin, Bruno Lalande, John Maddock, Jeremy Murphy, Johan Råde, Gautam Sewani, | |
322 | Benjamin Sobotta, Thijs van den Berg, Daryle Walker and Xiaogang Zhang<p> | |
323 | Distributed under the Boost Software License, Version 1.0. (See accompanying | |
324 | 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>) | |
325 | </p> | |
326 | </div></td> | |
327 | </tr></table> | |
328 | <hr> | |
329 | <div class="spirit-nav"> | |
330 | <a accesskey="p" href="../weg.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../weg.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="st_eg.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> | |
331 | </div> | |
332 | </body> | |
333 | </html> |