|
Teuchos Package Browser (Single Doxygen Collection)
Version of the Day
|
00001 // @HEADER 00002 // *********************************************************************** 00003 // 00004 // Tpetra: Templated Linear Algebra Services Package 00005 // Copyright (2008) Sandia Corporation 00006 // 00007 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, 00008 // the U.S. Government retains certain rights in this software. 00009 // 00010 // Redistribution and use in source and binary forms, with or without 00011 // modification, are permitted provided that the following conditions are 00012 // met: 00013 // 00014 // 1. Redistributions of source code must retain the above copyright 00015 // notice, this list of conditions and the following disclaimer. 00016 // 00017 // 2. Redistributions in binary form must reproduce the above copyright 00018 // notice, this list of conditions and the following disclaimer in the 00019 // documentation and/or other materials provided with the distribution. 00020 // 00021 // 3. Neither the name of the Corporation nor the names of the 00022 // contributors may be used to endorse or promote products derived from 00023 // this software without specific prior written permission. 00024 // 00025 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY 00026 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00027 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 00028 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE 00029 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 00030 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 00031 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 00032 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 00033 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 00034 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 00035 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00036 // 00037 // Questions? Contact Michael A. Heroux (maherou@sandia.gov) 00038 // 00039 // ************************************************************************ 00040 // @HEADER 00041 00042 #ifndef __Teuchos_MatrixMarket_SetScientific_hpp 00043 #define __Teuchos_MatrixMarket_SetScientific_hpp 00044 00045 #include <Teuchos_as.hpp> 00046 #include <Teuchos_ScalarTraits.hpp> 00047 #include <string> 00048 00049 00050 namespace Teuchos { 00051 namespace MatrixMarket { 00052 namespace details { 00077 template<class Scalar> 00078 class SetScientific { 00079 public: 00081 typedef Scalar scalar_type; 00082 00087 SetScientific (std::ostream& out) : 00088 out_ (out), originalFlags_ (out.flags()) 00089 { 00090 typedef Teuchos::ScalarTraits<scalar_type> STS; 00091 typedef typename STS::magnitudeType magnitude_type; 00092 typedef Teuchos::ScalarTraits<magnitude_type> STM; 00093 00094 // Print floating-point values in scientific notation. 00095 out << std::scientific; 00096 00097 // We're writing decimal digits, so compute the number of 00098 // digits we need to get reasonable accuracy when reading 00099 // values back in. 00100 // 00101 // There is actually an algorithm, due to Guy Steele (yes, 00102 // Java's Guy Steele) et al., for idempotent printing of 00103 // finite-length floating-point values. We should actually 00104 // implement that algorithm, but I don't have time for that 00105 // now. Currently, I just print no more than (one decimal 00106 // digit more than (the number of decimal digits justified 00107 // by the precision of magnitude_type)). 00108 // 00109 // We need to use STM's log10() rather than (say) std::log10 00110 // here, because STM::base() returns a magnitude_type, not 00111 // one of C++'s standard integer types. 00112 const magnitude_type numDecDigits = STM::t() * STM::log10 (STM::base()); 00113 00114 // Round and add one. The cast to int should not overflow 00115 // unless STM::t() is _extremely_ large, so we don't need to 00116 // check for that case here. 00117 const magnitude_type one = STM::one(); 00118 const magnitude_type two = one + one; 00119 // Cast from magnitude_type to int, since std::ostream's 00120 // precision() method expects an int input. 00121 const int prec = 1 + Teuchos::as<int> ((two*numDecDigits + one) / two); 00122 00123 // Set the number of (decimal) digits after the decimal 00124 // point to print. 00125 out.precision (prec); 00126 } 00127 00133 ~SetScientific () { 00134 out_.flags (originalFlags_); 00135 } 00136 00137 private: 00139 std::ostream& out_; 00140 00142 std::ios_base::fmtflags originalFlags_; 00143 }; 00144 00145 } // namespace details 00146 } // namespace MatrixMarket 00147 } // namespace Teuchos 00148 00149 #endif // __Teuchos_MatrixMarket_SetScientific_hpp
1.7.6.1