Ne.app NeANT
The Ne.app NeANT User module of the NeANT distribution.
27.ostream.inserters.stdcxx-51.cpp
Go to the documentation of this file.
1
29#include <cassert>
30#include <cstdio>
31#include <limits>
32#include <sstream>
33
34
35template <class FloatT>
36bool test (const char *tname)
37{
38 // zero and one used to verify sanity
39 const FloatT zero = FloatT ();
40 const FloatT pone = +FloatT (1);
41 const FloatT none = -FloatT (1);
42
43 // positive and negative Infinity
44 const FloatT pinf = +std::numeric_limits<FloatT>::infinity ();
45 const FloatT ninf = -std::numeric_limits<FloatT>::infinity ();
46
47 // positive and negative Quiet NaN
48 const FloatT pqnan = +std::numeric_limits<FloatT>::quiet_NaN ();
49 const FloatT nqnan = -std::numeric_limits<FloatT>::quiet_NaN ();
50
51 // positive and negative Signaling NaN
52 const FloatT psnan = +std::numeric_limits<FloatT>::signaling_NaN ();
53 const FloatT nsnan = -std::numeric_limits<FloatT>::signaling_NaN ();
54
55 std::ostringstream out;
56
57 out << " 0.0: " << zero << '\n'
58 << " +/-1.0: " << pone << ' ' << none << '\n'
59 << " +/-INF: " << pinf << ' ' << ninf << '\n'
60 << " +/-QNAN: " << pqnan << ' ' << nqnan << '\n'
61 << " +/-SNAN: " << psnan << ' ' << nsnan << '\n';
62
63 // expected output
64 const char expect[] = {
65 " 0.0: 0\n"
66 " +/-1.0: 1 -1\n"
67 " +/-INF: inf -inf\n"
68 " +/-QNAN: qnan -qnan\n"
69 " +/-SNAN: snan -snan\n"
70 };
71
72 bool pass = true;
73
74 if (expect != out.str ()) {
75 std::fprintf (stderr, "Expected (%s):\n%s\nGot:\n%s\n",
76 tname, expect, out.str ().c_str ());
77 pass = false;
78 }
79
80 // clear string and set the uppercase bit in flags
81 out.str ("");
82 out.setf (out.uppercase);
83
84 out << " 0.0: " << zero << '\n'
85 << " +/-1.0: " << pone << ' ' << none << '\n'
86 << " +/-INF: " << pinf << ' ' << ninf << '\n'
87 << " +/-QNAN: " << pqnan << ' ' << nqnan << '\n'
88 << " +/-SNAN: " << psnan << ' ' << nsnan << '\n';
89
90 // expected output
91 const char EXPECT[] = {
92 " 0.0: 0\n"
93 " +/-1.0: 1 -1\n"
94 " +/-INF: INF -INF\n"
95 " +/-QNAN: QNAN -QNAN\n"
96 " +/-SNAN: SNAN -SNAN\n"
97 };
98
99 if (EXPECT != out.str ()) {
100 std::fprintf (stderr, "Expected (%s):\n%s\nGot:\n%s\n",
101 tname, EXPECT, out.str ().c_str ());
102 pass = false;
103 }
104
105 return pass;
106}
107
108
109int main ()
110{
111 bool pass;
112
113 // exercise the formatting of Infinities and NaNs
114 pass = test<float>("float");
115 pass = test<double>("double") && pass;
116
117#ifndef _RWSTD_NO_LONG_DOUBLE
118
119 pass = test<long double>("long double") && pass;
120
121#endif // _RWSTD_NO_LONG_DOUBLE
122
123 assert (pass);
124
125 return 0;
126}
const int out
volatile int zero
Definition LIMITS.cpp:60
#define assert(expr)
Definition _cassert.h:40
#define stderr