mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-30 12:30:23 -04:00 
			
		
		
		
	
		
			
	
	
		
			134 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			134 lines
		
	
	
		
			4.0 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!
 | ||
|  | 
 | ||
|  | #ifdef _MSC_VER
 | ||
|  | # pragma warning (disable : 4100) // unreferenced formal parameters
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #include <iostream>
 | ||
|  | using std::cout;  using std::endl; using std::cerr; | ||
|  | 
 | ||
|  | //[policy_eg_8
 | ||
|  | 
 | ||
|  | /*`
 | ||
|  | Suppose we want our own user-defined error handlers rather than the | ||
|  | any of the default ones supplied by the library to be used. | ||
|  | If we set the policy for a specific type of error to `user_error` | ||
|  | then the library will call a user-supplied error handler. | ||
|  | These are forward declared, but not defined in | ||
|  | boost/math/policies/error_handling.hpp like this: | ||
|  | 
 | ||
|  |    namespace boost{ namespace math{ namespace policies{ | ||
|  | 
 | ||
|  |    template <class T> | ||
|  |    T user_domain_error(const char* function, const char* message, const T& val); | ||
|  |    template <class T> | ||
|  |    T user_pole_error(const char* function, const char* message, const T& val); | ||
|  |    template <class T> | ||
|  |    T user_overflow_error(const char* function, const char* message, const T& val); | ||
|  |    template <class T> | ||
|  |    T user_underflow_error(const char* function, const char* message, const T& val); | ||
|  |    template <class T> | ||
|  |    T user_denorm_error(const char* function, const char* message, const T& val); | ||
|  |    template <class T> | ||
|  |    T user_evaluation_error(const char* function, const char* message, const T& val); | ||
|  |    template <class T, class TargetType> | ||
|  |    T user_rounding_error(const char* function, const char* message, const T& val, const TargetType& t); | ||
|  |    template <class T> | ||
|  |    T user_indeterminate_result_error(const char* function, const char* message, const T& val); | ||
|  | 
 | ||
|  |    }}} // namespaces
 | ||
|  | 
 | ||
|  | So out first job is to include the header we want to use, and then | ||
|  | provide definitions for our user-defined error handlers that we want to use. | ||
|  | We only provide our special domain and pole error handlers; | ||
|  | other errors like overflow and underflow use the default. | ||
|  | */ | ||
|  | 
 | ||
|  | #include <boost/math/special_functions.hpp>
 | ||
|  | 
 | ||
|  | namespace boost{ namespace math | ||
|  | { | ||
|  |   namespace policies | ||
|  |   { | ||
|  |     template <class T> | ||
|  |     T user_domain_error(const char* function, const char* message, const T& val) | ||
|  |     { // Ignoring function, message and val for this example, perhaps unhelpfully.
 | ||
|  |        cerr << "Domain Error!" << endl; | ||
|  |        return std::numeric_limits<T>::quiet_NaN(); | ||
|  |     } | ||
|  | 
 | ||
|  |     template <class T> | ||
|  |     T user_pole_error(const char* function, const char* message, const T& val) | ||
|  |     { // Ignoring function, message and val for this example, perhaps unhelpfully.
 | ||
|  |        cerr << "Pole Error!" << endl; | ||
|  |        return std::numeric_limits<T>::quiet_NaN(); | ||
|  |     } | ||
|  |   } // namespace policies
 | ||
|  | }} // namespace boost{ namespace math
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /*`
 | ||
|  | Now we'll need to define a suitable policy that will call these handlers, | ||
|  | and define some forwarding functions that make use of the policy: | ||
|  | */ | ||
|  | 
 | ||
|  | namespace mymath{ | ||
|  | 
 | ||
|  | using namespace boost::math::policies; | ||
|  | 
 | ||
|  | typedef policy< | ||
|  |    domain_error<user_error>, | ||
|  |    pole_error<user_error> | ||
|  | > user_error_policy; | ||
|  | 
 | ||
|  | BOOST_MATH_DECLARE_SPECIAL_FUNCTIONS(user_error_policy) | ||
|  | 
 | ||
|  | } // close unnamed namespace
 | ||
|  | 
 | ||
|  | /*`
 | ||
|  | We now have a set of forwarding functions defined in namespace mymath | ||
|  | that all look something like this: | ||
|  | 
 | ||
|  | `` | ||
|  | template <class RealType> | ||
|  | inline typename boost::math::tools::promote_args<RT>::type | ||
|  |    tgamma(RT z) | ||
|  | { | ||
|  |    return boost::math::tgamma(z, user_error_policy()); | ||
|  | } | ||
|  | `` | ||
|  | 
 | ||
|  | So that when we call `mymath::tgamma(z)` we really end up calling | ||
|  | `boost::math::tgamma(z, user_error_policy())`, and any | ||
|  | errors will get directed to our own error handlers. | ||
|  | */ | ||
|  | 
 | ||
|  | int main() | ||
|  | { | ||
|  |    cout << "Result of erf_inv(-10) is: " | ||
|  |       << mymath::erf_inv(-10) << endl; | ||
|  |    cout << "Result of tgamma(-10) is: " | ||
|  |       << mymath::tgamma(-10) << endl; | ||
|  | } | ||
|  | 
 | ||
|  | /*`
 | ||
|  | 
 | ||
|  | Which outputs: | ||
|  | 
 | ||
|  | [pre | ||
|  |   Domain Error! | ||
|  |   Pole Error! | ||
|  |   Result of erf_inv(-10) is: 1.#QNAN | ||
|  |   Result of tgamma(-10) is: 1.#QNAN | ||
|  | ] | ||
|  | */ | ||
|  | 
 | ||
|  | //] // //[/policy_eg_8]
 |