mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-11-04 05:50:31 -05:00 
			
		
		
		
	
		
			
	
	
		
			116 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			116 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** nonfinite_num_facet_trap.cpp
							 | 
						||
| 
								 | 
							
								*
							 | 
						||
| 
								 | 
							
								* Copyright (c) 2012 Paul A. Bristow
							 | 
						||
| 
								 | 
							
								*
							 | 
						||
| 
								 | 
							
								* Distributed under 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)
							 | 
						||
| 
								 | 
							
								*
							 | 
						||
| 
								 | 
							
								* This very simple program illustrates how to use the
							 | 
						||
| 
								 | 
							
								* `boost/math/nonfinite_num_facets.hpp` trapping output of infinity and/or NaNs.
							 | 
						||
| 
								 | 
							
								*
							 | 
						||
| 
								 | 
							
								\file
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								\brief A very simple example of using non_finite_num facet for
							 | 
						||
| 
								 | 
							
								trapping output of infinity and/or NaNs.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								\note To actually get an exception throw by the iostream library
							 | 
						||
| 
								 | 
							
								one must enable exceptions.
							 | 
						||
| 
								 | 
							
								  `oss.exceptions(std::ios_base::failbit | std::ios_base::badbit);`
							 | 
						||
| 
								 | 
							
								\note Which bit is set is implementation dependent, so enable exceptions for both.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This is a fairly brutal method of catching nonfinites on output,
							 | 
						||
| 
								 | 
							
								but may suit some applications.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef _MSC_VER
							 | 
						||
| 
								 | 
							
								#   pragma warning(disable : 4127) // conditional expression is constant.
							 | 
						||
| 
								 | 
							
								// assumes C++ exceptions enabled /EHsc
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/cstdint.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/math/special_functions/nonfinite_num_facets.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <iostream>
							 | 
						||
| 
								 | 
							
								#include <iomanip>
							 | 
						||
| 
								 | 
							
								using std::cout;
							 | 
						||
| 
								 | 
							
								using std::endl;
							 | 
						||
| 
								 | 
							
								using std::hex;
							 | 
						||
| 
								 | 
							
								#include <exception>
							 | 
						||
| 
								 | 
							
								#include <limits> // numeric_limits
							 | 
						||
| 
								 | 
							
								using std::numeric_limits;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int main()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  using namespace boost::math;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  std::cout << "nonfinite_num_facet_trap.cpp" << std::endl;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const double inf = +std::numeric_limits<double>::infinity ();
							 | 
						||
| 
								 | 
							
								  const double nan = +std::numeric_limits<double>::quiet_NaN ();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  { // Output infinity and NaN with default flags (no trapping).
							 | 
						||
| 
								 | 
							
								    std::ostringstream oss;
							 | 
						||
| 
								 | 
							
								    std::locale default_locale (std::locale::classic ());
							 | 
						||
| 
								 | 
							
								    std::locale C99_out_locale (default_locale, new boost::math::nonfinite_num_put<char>);
							 | 
						||
| 
								 | 
							
								    oss.imbue (C99_out_locale);
							 | 
						||
| 
								 | 
							
								    oss.exceptions(std::ios_base::failbit | std::ios_base::badbit);
							 | 
						||
| 
								 | 
							
								    oss << inf <<  ' ' << nan;
							 | 
						||
| 
								 | 
							
								    cout << "oss.rdstate()  = " << hex << oss.rdstate() << endl; // 0
							 | 
						||
| 
								 | 
							
								    cout << "os.str() = " << oss.str() << endl; // os.str() = inf nan
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  try
							 | 
						||
| 
								 | 
							
								  { // // Output infinity with flags set to trap and catch any infinity.
							 | 
						||
| 
								 | 
							
								    std::ostringstream oss;
							 | 
						||
| 
								 | 
							
								    std::locale default_locale (std::locale::classic ());
							 | 
						||
| 
								 | 
							
								    std::locale C99_out_locale (default_locale, new boost::math::nonfinite_num_put<char>(trap_infinity));
							 | 
						||
| 
								 | 
							
								    oss.imbue (C99_out_locale);
							 | 
						||
| 
								 | 
							
								    oss.exceptions(std::ios_base::failbit | std::ios_base::badbit);
							 | 
						||
| 
								 | 
							
								    // Note that which bit is set is implementation dependent, so enable exceptions for both.
							 | 
						||
| 
								 | 
							
								    oss << inf;
							 | 
						||
| 
								 | 
							
								    cout << "oss.rdstate()  = " << hex << oss.rdstate() << endl;
							 | 
						||
| 
								 | 
							
								    cout << "oss.str() = " << oss.str() << endl;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  catch(const std::ios_base::failure& e)
							 | 
						||
| 
								 | 
							
								  { // Expect "Infinity".
							 | 
						||
| 
								 | 
							
								    std::cout << "\n""Message from thrown exception was: " << e.what() << std::endl;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  try
							 | 
						||
| 
								 | 
							
								  { // // Output NaN with flags set to catch any NaNs.
							 | 
						||
| 
								 | 
							
								    std::ostringstream oss;
							 | 
						||
| 
								 | 
							
								    std::locale default_locale (std::locale::classic ());
							 | 
						||
| 
								 | 
							
								    std::locale C99_out_locale (default_locale, new boost::math::nonfinite_num_put<char>(trap_nan));
							 | 
						||
| 
								 | 
							
								    oss.imbue (C99_out_locale);
							 | 
						||
| 
								 | 
							
								    oss.exceptions(std::ios_base::failbit | std::ios_base::badbit);
							 | 
						||
| 
								 | 
							
								    // Note that which bit is set is implementation dependent, so enable exceptions for both.
							 | 
						||
| 
								 | 
							
								    oss << nan;
							 | 
						||
| 
								 | 
							
								    cout << "oss.str() = " << oss.str() << endl;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  catch(const std::ios_base::failure& e)
							 | 
						||
| 
								 | 
							
								  { // Expect "Infinity".
							 | 
						||
| 
								 | 
							
								    std::cout << "\n""Message from thrown exception was: " << e.what() << std::endl;
							 | 
						||
| 
								 | 
							
								 }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return 0; // end of nonfinite_num_facet_trap.cpp
							 | 
						||
| 
								 | 
							
								} // int main()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Output:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  nonfinite_num_facet_trap.cpp
							 | 
						||
| 
								 | 
							
								  oss.rdstate()  = 0
							 | 
						||
| 
								 | 
							
								  os.str() = inf nan
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Message from thrown exception was: Infinity
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Message from thrown exception was: NaN
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								*/
							 |