2.5-18.1
[jlayton/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, write to the Free
17    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18    02111-1307 USA.  */
19
20 #include <math.h>
21 #include <float.h>
22 #include <stdio.h>
23
24 static int errors = 0;
25
26
27 static void
28 check (const char *testname, int result)
29 {
30   if (!result) {
31     printf ("Failure: %s\n", testname);
32     errors++;
33   }
34 }
35
36 #define TEST_FUNC(NAME, FLOAT, NANFUNC, EPSILON, HUGEVAL) \
37 static void                                                                   \
38 NAME (void)                                                                   \
39 {                                                                             \
40   /* Variables are declared volatile to forbid some compiler                  \
41      optimizations.  */                                                       \
42   volatile FLOAT Inf_var, NaN_var, zero_var, one_var;                         \
43   FLOAT x1, x2;                                                               \
44                                                                               \
45   zero_var = 0.0;                                                             \
46   one_var = 1.0;                                                              \
47   NaN_var = zero_var / zero_var;                                              \
48   Inf_var = one_var / zero_var;                                               \
49                                                                               \
50   (void) &zero_var;                                                           \
51   (void) &one_var;                                                            \
52   (void) &NaN_var;                                                            \
53   (void) &Inf_var;                                                            \
54                                                                               \
55                                                                               \
56   check (#FLOAT " isinf (inf) == 1", isinf (Inf_var) == 1);                   \
57   check (#FLOAT " isinf (-inf) == -1", isinf (-Inf_var) == -1);               \
58   check (#FLOAT " !isinf (1)", !(isinf (one_var)));                           \
59   check (#FLOAT " !isinf (NaN)", !(isinf (NaN_var)));                         \
60                                                                               \
61   check (#FLOAT " isnan (NaN)", isnan (NaN_var));                             \
62   check (#FLOAT " isnan (-NaN)", isnan (-NaN_var));                           \
63   check (#FLOAT " !isnan (1)", !(isnan (one_var)));                           \
64   check (#FLOAT " !isnan (inf)", !(isnan (Inf_var)));                         \
65                                                                               \
66   check (#FLOAT " inf == inf", Inf_var == Inf_var);                           \
67   check (#FLOAT " -inf == -inf", -Inf_var == -Inf_var);                       \
68   check (#FLOAT " inf != -inf", Inf_var != -Inf_var);                         \
69   check (#FLOAT " NaN != NaN", NaN_var != NaN_var);                           \
70                                                                               \
71   /*                                                                          \
72      the same tests but this time with NAN from <bits/nan.h>                  \
73      NAN is a double const                                                    \
74    */                                                                         \
75   check (#FLOAT " isnan (NAN)", isnan (NAN));                                 \
76   check (#FLOAT " isnan (-NAN)", isnan (-NAN));                               \
77   check (#FLOAT " !isinf (NAN)", !(isinf (NAN)));                             \
78   check (#FLOAT " !isinf (-NAN)", !(isinf (-NAN)));                           \
79   check (#FLOAT " NAN != NAN", NAN != NAN);                                   \
80                                                                               \
81   /*                                                                          \
82      And again with the value returned by the `nan' function.                 \
83    */                                                                         \
84   check (#FLOAT " isnan (NAN)", isnan (NANFUNC ("")));                        \
85   check (#FLOAT " isnan (-NAN)", isnan (-NANFUNC ("")));                      \
86   check (#FLOAT " !isinf (NAN)", !(isinf (NANFUNC (""))));                    \
87   check (#FLOAT " !isinf (-NAN)", !(isinf (-NANFUNC (""))));                  \
88   check (#FLOAT " NAN != NAN", NANFUNC ("") != NANFUNC (""));                 \
89                                                                               \
90   /* test if EPSILON is ok */                                                 \
91   x1 = 1.0;                                                                   \
92   x2 = x1 + EPSILON;                                                          \
93   check (#FLOAT " 1 != 1+EPSILON", x1 != x2);                                 \
94                                                                               \
95   x1 = 1.0;                                                                   \
96   x2 = x1 - EPSILON;                                                          \
97   check (#FLOAT " 1 != 1-EPSILON", x1 != x2);                                 \
98                                                                               \
99   /* test if HUGE_VALx is ok */                                               \
100   x1 = HUGEVAL;                                                               \
101   check (#FLOAT " isinf (HUGE_VALx) == +1", isinf (x1) == +1);                \
102   x1 = - HUGEVAL;                                                             \
103   check (#FLOAT " isinf (-HUGE_VALx) == -1", isinf (x1) == -1);               \
104 }
105
106 #define TEST_TRUNC(NAME, FLOAT, DOUBLE) \
107 void                                                                          \
108 NAME (void)                                                                   \
109 {                                                                             \
110   volatile DOUBLE Inf_var, NaN_var, zero_var, one_var;                        \
111   FLOAT x1, x2;                                                               \
112                                                                               \
113   zero_var = 0.0;                                                             \
114   one_var = 1.0;                                                              \
115   NaN_var = zero_var / zero_var;                                              \
116   Inf_var = one_var / zero_var;                                               \
117                                                                               \
118   (void) &NaN_var;                                                            \
119   (void) &Inf_var;                                                            \
120                                                                               \
121   x1 = (FLOAT) NaN_var;                                                       \
122   check (" "#FLOAT" x = ("#FLOAT") ("#DOUBLE") NaN", isnan (x1) != 0);        \
123   x2 = (FLOAT) Inf_var;                                                       \
124   check (" "#FLOAT" x = ("#FLOAT") ("#DOUBLE") Inf", isinf (x2) != 0);        \
125 }
126
127 TEST_FUNC (float_test, float, nanf, FLT_EPSILON, HUGE_VALF)
128 TEST_FUNC (double_test, double, nan, DBL_EPSILON, HUGE_VAL)
129 TEST_TRUNC (truncdfsf_test, float, double)
130 #ifndef NO_LONG_DOUBLE
131 TEST_FUNC (ldouble_test, long double, nanl, LDBL_EPSILON, HUGE_VALL)
132 TEST_TRUNC (trunctfsf_test, float, long double)
133 TEST_TRUNC (trunctfdf_test, double, long double)
134 #endif
135
136 int
137 do_test (void)
138 {
139   float_test ();
140   double_test ();
141   truncdfsf_test();
142
143 #ifndef NO_LONG_DOUBLE
144   ldouble_test ();
145   trunctfsf_test();
146   trunctfdf_test();
147 #endif
148
149   return errors != 0;
150 }
151
152 #define TEST_FUNCTION do_test ()
153 #include "../test-skeleton.c"