Teuchos Package Browser (Single Doxygen Collection)  Version of the Day
float128.cpp
Go to the documentation of this file.
1 // @HEADER
2 // ***********************************************************************
3 //
4 // Teuchos: Common Tools Package
5 // Copyright (2004) Sandia Corporation
6 //
7 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8 // license for use of this work by or on behalf of the U.S. Government.
9 //
10 // Redistribution and use in source and binary forms, with or without
11 // modification, are permitted provided that the following conditions are
12 // met:
13 //
14 // 1. Redistributions of source code must retain the above copyright
15 // notice, this list of conditions and the following disclaimer.
16 //
17 // 2. Redistributions in binary form must reproduce the above copyright
18 // notice, this list of conditions and the following disclaimer in the
19 // documentation and/or other materials provided with the distribution.
20 //
21 // 3. Neither the name of the Corporation nor the names of the
22 // contributors may be used to endorse or promote products derived from
23 // this software without specific prior written permission.
24 //
25 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 //
37 // Questions? Contact Michael A. Heroux (maherou@sandia.gov)
38 //
39 // ***********************************************************************
40 // @HEADER
41 
42 #include "Teuchos_Array.hpp"
43 #include "Teuchos_ScalarTraits.hpp" // operator<< and operator>> overloads
44 #include "Teuchos_Tuple.hpp"
46 
47 namespace { // (anonymous)
48 
49 using std::endl;
50 
51 TEUCHOS_UNIT_TEST( Float128, OutputStreamOp )
52 {
53  Teuchos::OSTab tab0 (out);
54 
55 #ifdef HAVE_TEUCHOSCORE_QUADMATH
56  out << "Test operator<< (std::ostream&, __float128)" << endl;
57 
58  __float128 x = 1.0;
59  __float128 y = strtoflt128 ("1.111112222233333", NULL);
60  // __float128 has enough digits to represent this exactly, but
61  // double precision would round.
62  __float128 z = strtoflt128 ("1.111112222233333444445555566666", NULL);
63 
64  // FIXME (mfh 04 Sep 2015) The results of printing could depend on
65  // the locale. This works fine for the default locale on my system.
66  {
67  std::ostringstream os;
68  os << x;
69  TEST_EQUALITY_CONST( os.str (), "1.000000000000000000000000000000e+00" );
70  }
71  {
72  std::ostringstream os;
73  os << y;
74  TEST_EQUALITY_CONST( os.str (), "1.111112222233333000000000000000e+00" );
75  }
76  {
77  std::ostringstream os;
78  os << z;
79  TEST_EQUALITY_CONST( os.str (), "1.111112222233333444445555566666e+00" );
80  }
81 
82  // Test that operator<< (std::ostream&, __float128) works. The
83  // operator<< overload MUST be defined in the std namespace. If
84  // defined in the global namespace, the compiler will have trouble
85  // with the TEST_COMPARE_ARRAYS expression below.
86 
87  out << "Test chaining operator<<:" << endl
88  << "z = " << z << ", it really does." << endl;
89 
90  // Test op<<, but make the __float128 arguments entries of an array.
91  // (Make sure that this compiles without "ambiguous overload"
92  // errors.)
93  __float128 a[3];
94  a[0] = x;
95  a[1] = y;
96  a[2] = z;
97  out << "Testing chaining operator<< with array entries:" << endl
98  << "a[0] = " << a[0] << ", a[1] = " << a[1] << ", a[2] = " << a[2]
99  << endl;
100 
101  Teuchos::Array<__float128> arrayOfFloat128 (1);
102  Teuchos::Tuple<__float128, 1> tupleOfFloat128;
103  arrayOfFloat128[0] = z;
104  tupleOfFloat128[0] = z;
105  Teuchos::ArrayView<__float128> arrayViewOfFloat128 = arrayOfFloat128 ();
106  // mfh 04 Sep 2015: If operator<< (std::ostream&, __float128) is
107  // defined in the global namespace, instead of in the std namespace,
108  // the TEST_COMPARE_ARRAYS expression will fail to compile. GCC
109  // 5.2.0 complains about the following line of
110  // Teuchos::compareArrays (in
111  // teuchos/core/src/Teuchos_TestingHelpers.hpp):
112  //
113  // out << "\nError, "<<a1_name<<"["<<i<<"] = "<<a1[i]<<" == "
114  // << a2_name<<"["<<i<<"] = "<<a2[i]<<": failed!\n";
115  //
116  // where a1 is a Teuchos::ArrayView<__float128> and a2 is a
117  // Teuchos::Tuple<__float128, 1>. The compiler claims an ambiguous
118  // overload. It has something to do with compareArrays (and
119  // analogous functions in that file) being templated on Array types,
120  // as I don't see that when I directly imitate what that line of
121  // code does (see below).
122 
123  TEST_COMPARE_ARRAYS( arrayViewOfFloat128, tupleOfFloat128 );
124 
125  std::string s1 ("Some string");
126  out << "Hello there! \"" << s1 << "\" is a string that doesn't mean anything "
127  "on its own, but just makes this line of code more like the line of code "
128  "that doesn't compile. arrayViewOfFloat128[0] = " << arrayViewOfFloat128[0]
129  << " and tupleOfFloat128[0] = " << tupleOfFloat128[0] << "." << endl;
130 
131  // Test that operator>> (std::istream&, __float128&) works.
132  {
133  // Use enough digits in the example to catch "cheats" that
134  // truncate to double.
135  const std::string z_str ("1.111112222233333444445555566666");
136  std::istringstream is (z_str);
137  __float128 z_copy = 0.0;
138  is >> z_copy;
139  TEST_EQUALITY_CONST( z, z_copy );
140  }
141 
142 #else
143  out << "This test only makes sense to run with libquadmath enabled." << endl;
144 #endif // HAVE_TEUCHOSCORE_QUADMATH
145 }
146 
147 } // namespace (anonymous)
#define TEUCHOS_UNIT_TEST(TEST_GROUP, TEST_NAME)
Macro for defining a (non-templated) unit test.
Tabbing class for helping to create formated, indented output for a basic_FancyOStream object...
Statically sized simple array (tuple) class.
Unit testing support.
#define TEST_EQUALITY_CONST(v1, v2)
Assert the equality of v1 and constant v2.
Templated array class derived from the STL std::vector.
#define TEST_COMPARE_ARRAYS(a1, a2)
Assert that a1.size()==a2.size() and a[i]==b[i], i=0....
Nonowning array view.
Defines basic traits for the scalar field type.
Replacement for std::vector that is compatible with the Teuchos Memory Management classes...