35template <
class FloatT>
36bool test (
const char *tname)
39 const FloatT
zero = FloatT ();
40 const FloatT pone = +FloatT (1);
41 const FloatT none = -FloatT (1);
44 const FloatT pinf = +std::numeric_limits<FloatT>::infinity ();
45 const FloatT ninf = -std::numeric_limits<FloatT>::infinity ();
48 const FloatT pqnan = +std::numeric_limits<FloatT>::quiet_NaN ();
49 const FloatT nqnan = -std::numeric_limits<FloatT>::quiet_NaN ();
52 const FloatT psnan = +std::numeric_limits<FloatT>::signaling_NaN ();
53 const FloatT nsnan = -std::numeric_limits<FloatT>::signaling_NaN ();
55 std::ostringstream
out;
58 <<
" +/-1.0: " << pone <<
' ' << none <<
'\n'
59 <<
" +/-INF: " << pinf <<
' ' << ninf <<
'\n'
60 <<
" +/-QNAN: " << pqnan <<
' ' << nqnan <<
'\n'
61 <<
" +/-SNAN: " << psnan <<
' ' << nsnan <<
'\n';
64 const char expect[] = {
68 " +/-QNAN: qnan -qnan\n"
69 " +/-SNAN: snan -snan\n"
74 if (expect !=
out.str ()) {
75 std::fprintf (
stderr,
"Expected (%s):\n%s\nGot:\n%s\n",
76 tname, expect,
out.str ().c_str ());
85 <<
" +/-1.0: " << pone <<
' ' << none <<
'\n'
86 <<
" +/-INF: " << pinf <<
' ' << ninf <<
'\n'
87 <<
" +/-QNAN: " << pqnan <<
' ' << nqnan <<
'\n'
88 <<
" +/-SNAN: " << psnan <<
' ' << nsnan <<
'\n';
91 const char EXPECT[] = {
95 " +/-QNAN: QNAN -QNAN\n"
96 " +/-SNAN: SNAN -SNAN\n"
99 if (EXPECT !=
out.str ()) {
100 std::fprintf (
stderr,
"Expected (%s):\n%s\nGot:\n%s\n",
101 tname, EXPECT,
out.str ().c_str ());
114 pass = test<float>(
"float");
115 pass = test<double>(
"double") &&
pass;
117#ifndef _RWSTD_NO_LONG_DOUBLE
119 pass = test<long double>(
"long double") &&
pass;