123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- /** 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
- */
|