Initial commit
This commit is contained in:
115
libs/math/example/nonfinite_num_facet_trap.cpp
Normal file
115
libs/math/example/nonfinite_num_facet_trap.cpp
Normal file
@@ -0,0 +1,115 @@
|
||||
|
||||
/** 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
|
||||
|
||||
*/
|
||||
Reference in New Issue
Block a user