Move _dl_important_hwcaps to dl-hwcaps.c
[platform/upstream/glibc.git] / math / basic-test.c
1 /* Copyright (C) 1999, 2007 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by Andreas Jaeger <aj@suse.de>, 1999.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, see
17    <http://www.gnu.org/licenses/>.  */
18
19 #include <math.h>
20 #include <float.h>
21 #include <stdio.h>
22
23 static int errors = 0;
24
25
26 static void
27 check (const char *testname, int result)
28 {
29   if (!result) {
30     printf ("Failure: %s\n", testname);
31     errors++;
32   }
33 }
34
35 #define TEST_FUNC(NAME, FLOAT, NANFUNC, EPSILON, HUGEVAL) \
36 static void                                                                   \
37 NAME (void)                                                                   \
38 {                                                                             \
39   /* Variables are declared volatile to forbid some compiler                  \
40      optimizations.  */                                                       \
41   volatile FLOAT Inf_var, NaN_var, zero_var, one_var;                         \
42   FLOAT x1, x2;                                                               \
43                                                                               \
44   zero_var = 0.0;                                                             \
45   one_var = 1.0;                                                              \
46   NaN_var = zero_var / zero_var;                                              \
47   Inf_var = one_var / zero_var;                                               \
48                                                                               \
49   (void) &zero_var;                                                           \
50   (void) &one_var;                                                            \
51   (void) &NaN_var;                                                            \
52   (void) &Inf_var;                                                            \
53                                                                               \
54                                                                               \
55   check (#FLOAT " isinf (inf) == 1", isinf (Inf_var) == 1);                   \
56   check (#FLOAT " isinf (-inf) == -1", isinf (-Inf_var) == -1);               \
57   check (#FLOAT " !isinf (1)", !(isinf (one_var)));                           \
58   check (#FLOAT " !isinf (NaN)", !(isinf (NaN_var)));                         \
59                                                                               \
60   check (#FLOAT " isnan (NaN)", isnan (NaN_var));                             \
61   check (#FLOAT " isnan (-NaN)", isnan (-NaN_var));                           \
62   check (#FLOAT " !isnan (1)", !(isnan (one_var)));                           \
63   check (#FLOAT " !isnan (inf)", !(isnan (Inf_var)));                         \
64                                                                               \
65   check (#FLOAT " inf == inf", Inf_var == Inf_var);                           \
66   check (#FLOAT " -inf == -inf", -Inf_var == -Inf_var);                       \
67   check (#FLOAT " inf != -inf", Inf_var != -Inf_var);                         \
68   check (#FLOAT " NaN != NaN", NaN_var != NaN_var);                           \
69                                                                               \
70   /*                                                                          \
71      the same tests but this time with NAN from <bits/nan.h>                  \
72      NAN is a double const                                                    \
73    */                                                                         \
74   check (#FLOAT " isnan (NAN)", isnan (NAN));                                 \
75   check (#FLOAT " isnan (-NAN)", isnan (-NAN));                               \
76   check (#FLOAT " !isinf (NAN)", !(isinf (NAN)));                             \
77   check (#FLOAT " !isinf (-NAN)", !(isinf (-NAN)));                           \
78   check (#FLOAT " NAN != NAN", NAN != NAN);                                   \
79                                                                               \
80   /*                                                                          \
81      And again with the value returned by the `nan' function.                 \
82    */                                                                         \
83   check (#FLOAT " isnan (NAN)", isnan (NANFUNC ("")));                        \
84   check (#FLOAT " isnan (-NAN)", isnan (-NANFUNC ("")));                      \
85   check (#FLOAT " !isinf (NAN)", !(isinf (NANFUNC (""))));                    \
86   check (#FLOAT " !isinf (-NAN)", !(isinf (-NANFUNC (""))));                  \
87   check (#FLOAT " NAN != NAN", NANFUNC ("") != NANFUNC (""));                 \
88                                                                               \
89   /* test if EPSILON is ok */                                                 \
90   x1 = 1.0;                                                                   \
91   x2 = x1 + EPSILON;                                                          \
92   check (#FLOAT " 1 != 1+EPSILON", x1 != x2);                                 \
93                                                                               \
94   x1 = 1.0;                                                                   \
95   x2 = x1 - EPSILON;                                                          \
96   check (#FLOAT " 1 != 1-EPSILON", x1 != x2);                                 \
97                                                                               \
98   /* test if HUGE_VALx is ok */                                               \
99   x1 = HUGEVAL;                                                               \
100   check (#FLOAT " isinf (HUGE_VALx) == +1", isinf (x1) == +1);                \
101   x1 = - HUGEVAL;                                                             \
102   check (#FLOAT " isinf (-HUGE_VALx) == -1", isinf (x1) == -1);               \
103 }
104
105 #define TEST_TRUNC(NAME, FLOAT, DOUBLE) \
106 void                                                                          \
107 NAME (void)                                                                   \
108 {                                                                             \
109   volatile DOUBLE Inf_var, NaN_var, zero_var, one_var;                        \
110   FLOAT x1, x2;                                                               \
111                                                                               \
112   zero_var = 0.0;                                                             \
113   one_var = 1.0;                                                              \
114   NaN_var = zero_var / zero_var;                                              \
115   Inf_var = one_var / zero_var;                                               \
116                                                                               \
117   (void) &NaN_var;                                                            \
118   (void) &Inf_var;                                                            \
119                                                                               \
120   x1 = (FLOAT) NaN_var;                                                       \
121   check (" "#FLOAT" x = ("#FLOAT") ("#DOUBLE") NaN", isnan (x1) != 0);        \
122   x2 = (FLOAT) Inf_var;                                                       \
123   check (" "#FLOAT" x = ("#FLOAT") ("#DOUBLE") Inf", isinf (x2) != 0);        \
124 }
125
126 TEST_FUNC (float_test, float, nanf, FLT_EPSILON, HUGE_VALF)
127 TEST_FUNC (double_test, double, nan, DBL_EPSILON, HUGE_VAL)
128 TEST_TRUNC (truncdfsf_test, float, double)
129 #ifndef NO_LONG_DOUBLE
130 TEST_FUNC (ldouble_test, long double, nanl, LDBL_EPSILON, HUGE_VALL)
131 TEST_TRUNC (trunctfsf_test, float, long double)
132 TEST_TRUNC (trunctfdf_test, double, long double)
133 #endif
134
135 int
136 do_test (void)
137 {
138   float_test ();
139   double_test ();
140   truncdfsf_test();
141
142 #ifndef NO_LONG_DOUBLE
143   ldouble_test ();
144   trunctfsf_test();
145   trunctfdf_test();
146 #endif
147
148   return errors != 0;
149 }
150
151 #define TEST_FUNCTION do_test ()
152 #include "../test-skeleton.c"