mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-31 13:10:19 -04:00 
			
		
		
		
	
		
			
	
	
		
			184 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			184 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
|  | //  Copyright John Maddock 2007.
 | ||
|  | //  Copyright Paul A. Bristow 2010
 | ||
|  | //  Use, modification and distribution are subject to the
 | ||
|  | //  Boost Software License, Version 1.0. (See accompanying file
 | ||
|  | //  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 | ||
|  | 
 | ||
|  | // Note that this file contains quickbook mark-up as well as code
 | ||
|  | // and comments, don't change any of the special comment mark-ups!
 | ||
|  | 
 | ||
|  | //[policy_eg_10
 | ||
|  | 
 | ||
|  | /*`
 | ||
|  | 
 | ||
|  | To understand how the rounding policies for  | ||
|  | the discrete distributions can be used, we'll | ||
|  | use the 50-sample binomial distribution with a  | ||
|  | success fraction of 0.5 once again, and calculate | ||
|  | all the possible quantiles at 0.05 and 0.95. | ||
|  | 
 | ||
|  | Begin by including the needed headers (and some using statements for conciseness): | ||
|  | 
 | ||
|  | */ | ||
|  | #include <iostream>
 | ||
|  | using std::cout; using std::endl; | ||
|  | using std::left; using std::fixed; using std::right; using std::scientific; | ||
|  | #include <iomanip>
 | ||
|  | using std::setw; | ||
|  | using std::setprecision; | ||
|  | 
 | ||
|  | #include <boost/math/distributions/binomial.hpp>
 | ||
|  | /*`
 | ||
|  | 
 | ||
|  | Next we'll bring the needed declarations into scope, and | ||
|  | define distribution types for all the available rounding policies: | ||
|  | 
 | ||
|  | */ | ||
|  | // Avoid 
 | ||
|  | // using namespace std; // and 
 | ||
|  | // using namespace boost::math;
 | ||
|  | // to avoid potential ambiguity of names, like binomial.
 | ||
|  | // using namespace boost::math::policies; is small risk, but
 | ||
|  | // the necessary items are brought into scope thus:
 | ||
|  | 
 | ||
|  | using boost::math::binomial_distribution; | ||
|  | using boost::math::policies::policy; | ||
|  | using boost::math::policies::discrete_quantile; | ||
|  | 
 | ||
|  | using boost::math::policies::integer_round_outwards; | ||
|  | using boost::math::policies::integer_round_down; | ||
|  | using boost::math::policies::integer_round_up; | ||
|  | using boost::math::policies::integer_round_nearest; | ||
|  | using boost::math::policies::integer_round_inwards; | ||
|  | using boost::math::policies::real; | ||
|  | 
 | ||
|  | using boost::math::binomial_distribution; // Not std::binomial_distribution.
 | ||
|  | 
 | ||
|  | typedef binomial_distribution< | ||
|  |             double,  | ||
|  |             policy<discrete_quantile<integer_round_outwards> > >  | ||
|  |         binom_round_outwards; | ||
|  | 
 | ||
|  | typedef binomial_distribution< | ||
|  |             double,  | ||
|  |             policy<discrete_quantile<integer_round_inwards> > >  | ||
|  |         binom_round_inwards; | ||
|  | 
 | ||
|  | typedef binomial_distribution< | ||
|  |             double,  | ||
|  |             policy<discrete_quantile<integer_round_down> > >  | ||
|  |         binom_round_down; | ||
|  | 
 | ||
|  | typedef binomial_distribution< | ||
|  |             double,  | ||
|  |             policy<discrete_quantile<integer_round_up> > >  | ||
|  |         binom_round_up; | ||
|  | 
 | ||
|  | typedef binomial_distribution< | ||
|  |             double,  | ||
|  |             policy<discrete_quantile<integer_round_nearest> > >  | ||
|  |         binom_round_nearest; | ||
|  | 
 | ||
|  | typedef binomial_distribution< | ||
|  |             double,  | ||
|  |             policy<discrete_quantile<real> > >  | ||
|  |         binom_real_quantile; | ||
|  | 
 | ||
|  | /*`
 | ||
|  | Now let's set to work calling those quantiles: | ||
|  | */ | ||
|  | 
 | ||
|  | int main() | ||
|  | { | ||
|  |    cout <<  | ||
|  |       "Testing rounding policies for a 50 sample binomial distribution,\n" | ||
|  |       "with a success fraction of 0.5.\n\n" | ||
|  |       "Lower quantiles are calculated at p = 0.05\n\n" | ||
|  |       "Upper quantiles at p = 0.95.\n\n"; | ||
|  | 
 | ||
|  |    cout << setw(25) << right | ||
|  |       << "Policy"<< setw(18) << right  | ||
|  |       << "Lower Quantile" << setw(18) << right  | ||
|  |       << "Upper Quantile" << endl; | ||
|  |     | ||
|  |    // Test integer_round_outwards:
 | ||
|  |    cout << setw(25) << right | ||
|  |       << "integer_round_outwards" | ||
|  |       << setw(18) << right | ||
|  |       << quantile(binom_round_outwards(50, 0.5), 0.05) | ||
|  |       << setw(18) << right | ||
|  |       << quantile(binom_round_outwards(50, 0.5), 0.95)  | ||
|  |       << endl; | ||
|  |     | ||
|  |    // Test integer_round_inwards:
 | ||
|  |    cout << setw(25) << right | ||
|  |       << "integer_round_inwards" | ||
|  |       << setw(18) << right | ||
|  |       << quantile(binom_round_inwards(50, 0.5), 0.05) | ||
|  |       << setw(18) << right | ||
|  |       << quantile(binom_round_inwards(50, 0.5), 0.95)  | ||
|  |       << endl; | ||
|  |     | ||
|  |    // Test integer_round_down:
 | ||
|  |    cout << setw(25) << right | ||
|  |       << "integer_round_down" | ||
|  |       << setw(18) << right | ||
|  |       << quantile(binom_round_down(50, 0.5), 0.05) | ||
|  |       << setw(18) << right | ||
|  |       << quantile(binom_round_down(50, 0.5), 0.95)  | ||
|  |       << endl; | ||
|  |     | ||
|  |    // Test integer_round_up:
 | ||
|  |    cout << setw(25) << right | ||
|  |       << "integer_round_up" | ||
|  |       << setw(18) << right | ||
|  |       << quantile(binom_round_up(50, 0.5), 0.05) | ||
|  |       << setw(18) << right | ||
|  |       << quantile(binom_round_up(50, 0.5), 0.95)  | ||
|  |       << endl; | ||
|  |     | ||
|  |    // Test integer_round_nearest:
 | ||
|  |    cout << setw(25) << right | ||
|  |       << "integer_round_nearest" | ||
|  |       << setw(18) << right | ||
|  |       << quantile(binom_round_nearest(50, 0.5), 0.05) | ||
|  |       << setw(18) << right | ||
|  |       << quantile(binom_round_nearest(50, 0.5), 0.95)  | ||
|  |       << endl; | ||
|  |     | ||
|  |    // Test real:
 | ||
|  |    cout << setw(25) << right | ||
|  |       << "real" | ||
|  |       << setw(18) << right | ||
|  |       << quantile(binom_real_quantile(50, 0.5), 0.05) | ||
|  |       << setw(18) << right | ||
|  |       << quantile(binom_real_quantile(50, 0.5), 0.95)  | ||
|  |       << endl; | ||
|  | } // int main()
 | ||
|  | 
 | ||
|  | /*`
 | ||
|  | 
 | ||
|  | Which produces the program output: | ||
|  | 
 | ||
|  | [pre | ||
|  |   policy_eg_10.vcxproj -> J:\Cpp\MathToolkit\test\Math_test\Release\policy_eg_10.exe | ||
|  |   Testing rounding policies for a 50 sample binomial distribution, | ||
|  |   with a success fraction of 0.5. | ||
|  |    | ||
|  |   Lower quantiles are calculated at p = 0.05 | ||
|  |    | ||
|  |   Upper quantiles at p = 0.95. | ||
|  |    | ||
|  |                      Policy    Lower Quantile    Upper Quantile | ||
|  |      integer_round_outwards                18                31 | ||
|  |       integer_round_inwards                19                30 | ||
|  |          integer_round_down                18                30 | ||
|  |            integer_round_up                19                31 | ||
|  |       integer_round_nearest                19                30 | ||
|  |                        real            18.701            30.299 | ||
|  | ] | ||
|  | 
 | ||
|  | */ | ||
|  | 
 | ||
|  | //] //[policy_eg_10] ends quickbook import.
 |