mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-27 11:00:32 -04:00 
			
		
		
		
	
		
			
	
	
		
			154 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			154 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
|  | // example_error_handling.cpp
 | ||
|  | 
 | ||
|  | // Copyright Paul A. Bristow 2007, 2010.
 | ||
|  | // Copyright John Maddock 2007.
 | ||
|  | 
 | ||
|  | // 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 markup as well as code
 | ||
|  | // and comments, don't change any of the special comment markups!
 | ||
|  | 
 | ||
|  | // Optional macro definitions described in text below:
 | ||
|  | //   #define BOOST_MATH_DOMAIN_ERROR_POLICY ignore_error
 | ||
|  | //   #define BOOST_MATH_DOMAIN_ERROR_POLICY errno_on_error
 | ||
|  | //   #define BOOST_MATH_DOMAIN_ERROR_POLICY is set to: throw_on_error
 | ||
|  | 
 | ||
|  | //[error_handling_example
 | ||
|  | /*`
 | ||
|  | The following example demonstrates the effect of | ||
|  | setting the macro BOOST_MATH_DOMAIN_ERROR_POLICY | ||
|  | when an invalid argument is encountered.  For the | ||
|  | purposes of this example, we'll pass a negative | ||
|  | degrees of freedom parameter to the student's t | ||
|  | distribution. | ||
|  | 
 | ||
|  | Since we know that this is a single file program we could | ||
|  | just add: | ||
|  | 
 | ||
|  |    #define BOOST_MATH_DOMAIN_ERROR_POLICY ignore_error
 | ||
|  | 
 | ||
|  | to the top of the source file to change the default policy | ||
|  | to one that simply returns a NaN when a domain error occurs. | ||
|  | Alternatively we could use: | ||
|  | 
 | ||
|  |    #define BOOST_MATH_DOMAIN_ERROR_POLICY errno_on_error
 | ||
|  | 
 | ||
|  | To ensure the `::errno` is set when a domain error occurs | ||
|  | as well as returning a NaN. | ||
|  | 
 | ||
|  | This is safe provided the program consists of a single | ||
|  | translation unit /and/ we place the define /before/ any | ||
|  | #includes.  Note that should we add the define after the includes
 | ||
|  | then it will have no effect!  A warning such as: | ||
|  | 
 | ||
|  | [pre warning C4005: 'BOOST_MATH_OVERFLOW_ERROR_POLICY' : macro redefinition] | ||
|  | 
 | ||
|  | is a certain sign that it will /not/ have the desired effect. | ||
|  | 
 | ||
|  | We'll begin our sample program with the needed includes: | ||
|  | */ | ||
|  | 
 | ||
|  | 
 | ||
|  |    #define BOOST_MATH_DOMAIN_ERROR_POLICY ignore_error
 | ||
|  | 
 | ||
|  | // Boost
 | ||
|  | #include <boost/math/distributions/students_t.hpp>
 | ||
|  |    using boost::math::students_t;  // Probability of students_t(df, t).
 | ||
|  | 
 | ||
|  | // std
 | ||
|  | #include <iostream>
 | ||
|  |    using std::cout; | ||
|  |    using std::endl; | ||
|  | 
 | ||
|  | #include <stdexcept>
 | ||
|  | 
 | ||
|  | 
 | ||
|  | #include <cstddef>
 | ||
|  |    // using ::errno
 | ||
|  | 
 | ||
|  | /*`
 | ||
|  | Next we'll define the program's main() to call the student's t | ||
|  | distribution with an invalid degrees of freedom parameter, | ||
|  | the program is set up to handle either an exception or a NaN: | ||
|  | */ | ||
|  | 
 | ||
|  | int main() | ||
|  | { | ||
|  |    cout << "Example error handling using Student's t function. " << endl; | ||
|  |    cout << "BOOST_MATH_DOMAIN_ERROR_POLICY is set to: " | ||
|  |       << BOOST_STRINGIZE(BOOST_MATH_DOMAIN_ERROR_POLICY) << endl; | ||
|  | 
 | ||
|  |    double degrees_of_freedom = -1; // A bad argument!
 | ||
|  |    double t = 10; | ||
|  | 
 | ||
|  |    try | ||
|  |    { | ||
|  |       errno = 0; // Clear/reset.
 | ||
|  |       students_t dist(degrees_of_freedom); // exception is thrown here if enabled.
 | ||
|  |       double p = cdf(dist, t); | ||
|  |       // Test for error reported by other means:
 | ||
|  |       if((boost::math::isnan)(p)) | ||
|  |       { | ||
|  |          cout << "cdf returned a NaN!" << endl; | ||
|  |          if (errno != 0) | ||
|  |          { // So errno has been set.
 | ||
|  |            cout << "errno is set to: " << errno << endl; | ||
|  |          } | ||
|  |       } | ||
|  |       else | ||
|  |          cout << "Probability of Student's t is " << p << endl; | ||
|  |    } | ||
|  |    catch(const std::exception& e) | ||
|  |    { | ||
|  |       std::cout << | ||
|  |          "\n""Message from thrown exception was:\n   " << e.what() << std::endl; | ||
|  |    } | ||
|  |    return 0; | ||
|  | } // int main()
 | ||
|  | 
 | ||
|  | /*`
 | ||
|  | 
 | ||
|  | Here's what the program output looks like with a default build | ||
|  | (one that *does throw exceptions*): | ||
|  | 
 | ||
|  | [pre | ||
|  | Example error handling using Student's t function. | ||
|  | BOOST_MATH_DOMAIN_ERROR_POLICY is set to: throw_on_error | ||
|  | 
 | ||
|  | Message from thrown exception was: | ||
|  |    Error in function boost::math::students_t_distribution<double>::students_t_distribution: | ||
|  |    Degrees of freedom argument is -1, but must be > 0 ! | ||
|  | ] | ||
|  | 
 | ||
|  | Alternatively let's build with: | ||
|  | 
 | ||
|  |    #define BOOST_MATH_DOMAIN_ERROR_POLICY ignore_error
 | ||
|  | 
 | ||
|  | Now the program output is: | ||
|  | 
 | ||
|  | [pre | ||
|  | Example error handling using Student's t function. | ||
|  | BOOST_MATH_DOMAIN_ERROR_POLICY is set to: ignore_error | ||
|  | cdf returned a NaN! | ||
|  | ] | ||
|  | 
 | ||
|  | And finally let's build with: | ||
|  | 
 | ||
|  |    #define BOOST_MATH_DOMAIN_ERROR_POLICY errno_on_error
 | ||
|  | 
 | ||
|  | Which gives the output show errno: | ||
|  | 
 | ||
|  | [pre | ||
|  | Example error handling using Student's t function. | ||
|  | BOOST_MATH_DOMAIN_ERROR_POLICY is set to: errno_on_error | ||
|  | cdf returned a NaN! | ||
|  | errno is set to: 33 | ||
|  | ] | ||
|  | 
 | ||
|  | */ | ||
|  | 
 | ||
|  | //] [error_handling_eg end quickbook markup]
 |