/** 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 #include #include #include using std::cout; using std::endl; using std::hex; #include #include // 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::infinity (); const double nan = +std::numeric_limits::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); 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(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(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 */