Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r77270 - trunk/libs/math/example
From: pbristow_at_[hidden]
Date: 2012-03-08 13:15:43


Author: pbristow
Date: 2012-03-08 13:15:42 EST (Thu, 08 Mar 2012)
New Revision: 77270
URL: http://svn.boost.org/trac/boost/changeset/77270

Log:
New example of getting and catching a thrown exception from trapping nonfinites.
Added:
   trunk/libs/math/example/nonfinite_num_facet_trap.cpp (contents, props changed)

Added: trunk/libs/math/example/nonfinite_num_facet_trap.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/math/example/nonfinite_num_facet_trap.cpp 2012-03-08 13:15:42 EST (Thu, 08 Mar 2012)
@@ -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
+
+*/


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk