xref: /openbsd-src/regress/lib/libm/cephes/testvect.c (revision d205ab02eabefec09df68de8ff35e0519ffc9a86)
1*d205ab02Skettenis /*	$OpenBSD: testvect.c,v 1.2 2013/08/02 20:23:28 kettenis Exp $	*/
2567a7532Smartynas 
3567a7532Smartynas /*
4567a7532Smartynas  * Copyright (c) 2008 Stephen L. Moshier <steve@moshier.net>
5567a7532Smartynas  *
6567a7532Smartynas  * Permission to use, copy, modify, and distribute this software for any
7567a7532Smartynas  * purpose with or without fee is hereby granted, provided that the above
8567a7532Smartynas  * copyright notice and this permission notice appear in all copies.
9567a7532Smartynas  *
10567a7532Smartynas  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11567a7532Smartynas  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12567a7532Smartynas  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13567a7532Smartynas  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14567a7532Smartynas  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15567a7532Smartynas  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16567a7532Smartynas  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17567a7532Smartynas  */
18567a7532Smartynas 
19567a7532Smartynas /* Test vectors for math functions.
20567a7532Smartynas    See C9X section F.9.  */
21567a7532Smartynas 
22567a7532Smartynas #include <stdio.h>
23567a7532Smartynas #include <stdlib.h>
24567a7532Smartynas #include <string.h>
25567a7532Smartynas int __isfinite (double);
26567a7532Smartynas 
27567a7532Smartynas /* C9X spells lgam lgamma.  */
28567a7532Smartynas #define GLIBC2 1
29567a7532Smartynas 
30567a7532Smartynas extern double PI;
31567a7532Smartynas static double MPI, PIO2, MPIO2, PIO4, MPIO4, THPIO4, MTHPIO4;
32567a7532Smartynas 
33567a7532Smartynas #if 0
34567a7532Smartynas #define PI 3.141592653589793238463E0
35567a7532Smartynas #define PIO2 1.570796326794896619231E0
36567a7532Smartynas #define PIO4 7.853981633974483096157E-1
37567a7532Smartynas #define THPIO4 2.35619449019234492884698
38567a7532Smartynas #define SQRT2 1.414213562373095048802E0
39567a7532Smartynas #define SQRTH 7.071067811865475244008E-1
40567a7532Smartynas #define INF (1.0/0.0)
41567a7532Smartynas #define MINF (-1.0/0.0)
42567a7532Smartynas #endif
43567a7532Smartynas 
44567a7532Smartynas extern double MACHEP, SQRTH, SQRT2;
45567a7532Smartynas extern double NAN, INFINITY, NEGZERO;
46567a7532Smartynas static double INF, MINF;
47567a7532Smartynas static double ZERO, MZERO, HALF, MHALF, ONE, MONE, TWO, MTWO, THREE, MTHREE;
48567a7532Smartynas /* #define NAN (1.0/0.0 - 1.0/0.0) */
49567a7532Smartynas 
50567a7532Smartynas /* Functions of one variable.  */
51567a7532Smartynas double log (double);
52567a7532Smartynas double exp ( double);
53567a7532Smartynas double atan (double);
54567a7532Smartynas double sin (double);
55567a7532Smartynas double cos (double);
56567a7532Smartynas double tan (double);
57567a7532Smartynas double acos (double);
58567a7532Smartynas double asin (double);
59567a7532Smartynas double acosh (double);
60567a7532Smartynas double asinh (double);
61567a7532Smartynas double atanh (double);
62567a7532Smartynas double sinh (double);
63567a7532Smartynas double cosh (double);
64567a7532Smartynas double tanh (double);
65567a7532Smartynas double exp2 (double);
66567a7532Smartynas double expm1 (double);
67567a7532Smartynas double log10 (double);
68567a7532Smartynas double log1p (double);
69567a7532Smartynas double log2 (double);
70567a7532Smartynas double fabs (double);
71567a7532Smartynas double erf (double);
72567a7532Smartynas double erfc (double);
73567a7532Smartynas double tgamma (double);
74567a7532Smartynas double floor (double);
75567a7532Smartynas double ceil (double);
76567a7532Smartynas double cbrt (double);
77567a7532Smartynas #if GLIBC2
78567a7532Smartynas double lgamma (double);
79567a7532Smartynas #else
80567a7532Smartynas double lgam (double);
81567a7532Smartynas #endif
82567a7532Smartynas 
83567a7532Smartynas struct oneargument
84567a7532Smartynas   {
85567a7532Smartynas     char *name;			/* Name of the function. */
86567a7532Smartynas     double (*func) (double);
87567a7532Smartynas     double *arg1;
88567a7532Smartynas     double *answer;
89567a7532Smartynas     int thresh;			/* Error report threshold. */
90567a7532Smartynas   };
91567a7532Smartynas 
92567a7532Smartynas static struct oneargument test1[] =
93567a7532Smartynas {
94567a7532Smartynas   {"atan", atan, &ONE, &PIO4, 0},
95567a7532Smartynas   {"sin", sin, &PIO2, &ONE, 0},
96567a7532Smartynas #if 0
97567a7532Smartynas   {"cos", cos, &PIO4, &SQRTH, 0},
98567a7532Smartynas   {"sin", sin, 32767., 1.8750655394138942394239E-1, 0},
99567a7532Smartynas   {"cos", cos, 32767., 9.8226335176928229845654E-1, 0},
100567a7532Smartynas   {"tan", tan, 32767., 1.9089234430221485740826E-1, 0},
101567a7532Smartynas   {"sin", sin, 8388607., 9.9234509376961249835628E-1, 0},
102567a7532Smartynas   {"cos", cos, 8388607., -1.2349580912475928183718E-1, 0},
103567a7532Smartynas   {"tan", tan, 8388607., -8.0354556223613614748329E0, 0},
104567a7532Smartynas   /*
105567a7532Smartynas   {"sin", sin, 2147483647., -7.2491655514455639054829E-1, 0},
106567a7532Smartynas   {"cos", cos, 2147483647., -6.8883669187794383467976E-1, 0},
107567a7532Smartynas   {"tan", tan, 2147483647., 1.0523779637351339136698E0, 0},
108567a7532Smartynas   */
109567a7532Smartynas   {"cos", cos, &PIO2, 6.1232339957367574e-17, 1},
110567a7532Smartynas   {"sin", sin, &PIO4, &SQRTH, 1},
111567a7532Smartynas #endif
112567a7532Smartynas   {"acos", acos, &NAN, &NAN, 0},
113567a7532Smartynas   {"acos", acos, &ONE, &ZERO, 0},
114567a7532Smartynas   {"acos", acos, &TWO, &NAN, 0},
115567a7532Smartynas   {"acos", acos, &MTWO, &NAN, 0},
116567a7532Smartynas   {"asin", asin, &NAN, &NAN, 0},
117567a7532Smartynas   {"asin", asin, &ZERO, &ZERO, 0},
118567a7532Smartynas   {"asin", asin, &MZERO, &MZERO, 0},
119567a7532Smartynas   {"asin", asin, &TWO, &NAN, 0},
120567a7532Smartynas   {"asin", asin, &MTWO, &NAN, 0},
121567a7532Smartynas   {"atan", atan, &NAN, &NAN, 0},
122567a7532Smartynas   {"atan", atan, &ZERO, &ZERO, 0},
123567a7532Smartynas   {"atan", atan, &MZERO, &MZERO, 0},
124567a7532Smartynas   {"atan", atan, &INF, &PIO2, 0},
125567a7532Smartynas   {"atan", atan, &MINF, &MPIO2, 0},
126567a7532Smartynas   {"cos", cos, &NAN, &NAN, 0},
127567a7532Smartynas   {"cos", cos, &ZERO, &ONE, 0},
128567a7532Smartynas   {"cos", cos, &MZERO, &ONE, 0},
129567a7532Smartynas   {"cos", cos, &INF, &NAN, 0},
130567a7532Smartynas   {"cos", cos, &MINF, &NAN, 0},
131567a7532Smartynas   {"sin", sin, &NAN, &NAN, 0},
132567a7532Smartynas   {"sin", sin, &MZERO, &MZERO, 0},
133567a7532Smartynas   {"sin", sin, &ZERO, &ZERO, 0},
134567a7532Smartynas   {"sin", sin, &INF, &NAN, 0},
135567a7532Smartynas   {"sin", sin, &MINF, &NAN, 0},
136567a7532Smartynas   {"tan", tan, &NAN, &NAN, 0},
137567a7532Smartynas   {"tan", tan, &ZERO, &ZERO, 0},
138567a7532Smartynas   {"tan", tan, &MZERO, &MZERO, 0},
139567a7532Smartynas   {"tan", tan, &INF, &NAN, 0},
140567a7532Smartynas   {"tan", tan, &MINF, &NAN, 0},
141567a7532Smartynas   {"acosh", acosh, &NAN, &NAN, 0},
142567a7532Smartynas   {"acosh", acosh, &ONE, &ZERO, 0},
143567a7532Smartynas   {"acosh", acosh, &INF, &INF, 0},
144567a7532Smartynas   {"acosh", acosh, &HALF, &NAN, 0},
145567a7532Smartynas   {"acosh", acosh, &MONE, &NAN, 0},
146567a7532Smartynas   {"asinh", asinh, &NAN, &NAN, 0},
147567a7532Smartynas   {"asinh", asinh, &ZERO, &ZERO, 0},
148567a7532Smartynas   {"asinh", asinh, &MZERO, &MZERO, 0},
149567a7532Smartynas   {"asinh", asinh, &INF, &INF, 0},
150567a7532Smartynas   {"asinh", asinh, &MINF, &MINF, 0},
151567a7532Smartynas   {"atanh", atanh, &NAN, &NAN, 0},
152567a7532Smartynas   {"atanh", atanh, &ZERO, &ZERO, 0},
153567a7532Smartynas   {"atanh", atanh, &MZERO, &MZERO, 0},
154567a7532Smartynas   {"atanh", atanh, &ONE, &INF, 0},
155567a7532Smartynas   {"atanh", atanh, &MONE, &MINF, 0},
156567a7532Smartynas   {"atanh", atanh, &TWO, &NAN, 0},
157567a7532Smartynas   {"atanh", atanh, &MTWO, &NAN, 0},
158567a7532Smartynas   {"cosh", cosh, &NAN, &NAN, 0},
159567a7532Smartynas   {"cosh", cosh, &ZERO, &ONE, 0},
160567a7532Smartynas   {"cosh", cosh, &MZERO, &ONE, 0},
161567a7532Smartynas   {"cosh", cosh, &INF, &INF, 0},
162567a7532Smartynas   {"cosh", cosh, &MINF, &INF, 0},
163567a7532Smartynas   {"sinh", sinh, &NAN, &NAN, 0},
164567a7532Smartynas   {"sinh", sinh, &ZERO, &ZERO, 0},
165567a7532Smartynas   {"sinh", sinh, &MZERO, &MZERO, 0},
166567a7532Smartynas   {"sinh", sinh, &INF, &INF, 0},
167567a7532Smartynas   {"sinh", sinh, &MINF, &MINF, 0},
168567a7532Smartynas   {"tanh", tanh, &NAN, &NAN, 0},
169567a7532Smartynas   {"tanh", tanh, &ZERO, &ZERO, 0},
170567a7532Smartynas   {"tanh", tanh, &MZERO, &MZERO, 0},
171567a7532Smartynas   {"tanh", tanh, &INF, &ONE, 0},
172567a7532Smartynas   {"tanh", tanh, &MINF, &MONE, 0},
173567a7532Smartynas   {"exp", exp, &NAN, &NAN, 0},
174567a7532Smartynas   {"exp", exp, &ZERO, &ONE, 0},
175567a7532Smartynas   {"exp", exp, &MZERO, &ONE, 0},
176567a7532Smartynas   {"exp", exp, &INF, &INF, 0},
177567a7532Smartynas   {"exp", exp, &MINF, &ZERO, 0},
178567a7532Smartynas #if !GLIBC2
179567a7532Smartynas   {"exp2", exp2, &NAN, &NAN, 0},
180567a7532Smartynas   {"exp2", exp2, &ZERO, &ONE, 0},
181567a7532Smartynas   {"exp2", exp2, &MZERO, &ONE, 0},
182567a7532Smartynas   {"exp2", exp2, &INF, &INF, 0},
183567a7532Smartynas   {"exp2", exp2, &MINF, &ZERO, 0},
184567a7532Smartynas #endif
185567a7532Smartynas   {"expm1", expm1, &NAN, &NAN, 0},
186567a7532Smartynas   {"expm1", expm1, &ZERO, &ZERO, 0},
187567a7532Smartynas   {"expm1", expm1, &MZERO, &MZERO, 0},
188567a7532Smartynas   {"expm1", expm1, &INF, &INF, 0},
189567a7532Smartynas   {"expm1", expm1, &MINF, &MONE, 0},
190567a7532Smartynas   {"log", log, &NAN, &NAN, 0},
191567a7532Smartynas   {"log", log, &ZERO, &MINF, 0},
192567a7532Smartynas   {"log", log, &MZERO, &MINF, 0},
193567a7532Smartynas   {"log", log, &ONE, &ZERO, 0},
194567a7532Smartynas   {"log", log, &MONE, &NAN, 0},
195567a7532Smartynas   {"log", log, &INF, &INF, 0},
196567a7532Smartynas   {"log10", log10, &NAN, &NAN, 0},
197567a7532Smartynas   {"log10", log10, &ZERO, &MINF, 0},
198567a7532Smartynas   {"log10", log10, &MZERO, &MINF, 0},
199567a7532Smartynas   {"log10", log10, &ONE, &ZERO, 0},
200567a7532Smartynas   {"log10", log10, &MONE, &NAN, 0},
201567a7532Smartynas   {"log10", log10, &INF, &INF, 0},
202567a7532Smartynas   {"log1p", log1p, &NAN, &NAN, 0},
203567a7532Smartynas   {"log1p", log1p, &ZERO, &ZERO, 0},
204567a7532Smartynas   {"log1p", log1p, &MZERO, &MZERO, 0},
205567a7532Smartynas   {"log1p", log1p, &MONE, &MINF, 0},
206567a7532Smartynas   {"log1p", log1p, &MTWO, &NAN, 0},
207567a7532Smartynas   {"log1p", log1p, &INF, &INF, 0},
208567a7532Smartynas #if !GLIBC2
209567a7532Smartynas   {"log2", log2, &NAN, &NAN, 0},
210567a7532Smartynas   {"log2", log2, &ZERO, &MINF, 0},
211567a7532Smartynas   {"log2", log2, &MZERO, &MINF, 0},
212567a7532Smartynas   {"log2", log2, &MONE, &NAN, 0},
213567a7532Smartynas   {"log2", log2, &INF, &INF, 0},
214567a7532Smartynas #endif
215567a7532Smartynas   /*  {"fabs", fabs, NAN, NAN, 0}, */
216567a7532Smartynas   {"fabs", fabs, &ONE, &ONE, 0},
217567a7532Smartynas   {"fabs", fabs, &MONE, &ONE, 0},
218567a7532Smartynas   {"fabs", fabs, &ZERO, &ZERO, 0},
219567a7532Smartynas   {"fabs", fabs, &MZERO, &ZERO, 0},
220567a7532Smartynas   {"fabs", fabs, &INF, &INF, 0},
221567a7532Smartynas   {"fabs", fabs, &MINF, &INF, 0},
222567a7532Smartynas   {"cbrt", cbrt, &NAN, &NAN, 0},
223567a7532Smartynas   {"cbrt", cbrt, &ZERO, &ZERO, 0},
224567a7532Smartynas   {"cbrt", cbrt, &MZERO, &MZERO, 0},
225567a7532Smartynas   {"cbrt", cbrt, &INF, &INF, 0},
226567a7532Smartynas   {"cbrt", cbrt, &MINF, &MINF, 0},
227567a7532Smartynas   {"erf", erf, &NAN, &NAN, 0},
228567a7532Smartynas   {"erf", erf, &ZERO, &ZERO, 0},
229567a7532Smartynas   {"erf", erf, &MZERO, &MZERO, 0},
230567a7532Smartynas   {"erf", erf, &INF, &ONE, 0},
231567a7532Smartynas   {"erf", erf, &MINF, &MONE, 0},
232567a7532Smartynas   {"erfc", erfc, &NAN, &NAN, 0},
233567a7532Smartynas   {"erfc", erfc, &INF, &ZERO, 0},
234567a7532Smartynas   {"erfc", erfc, &MINF, &TWO, 0},
235567a7532Smartynas   {"tgamma", tgamma, &NAN, &NAN, 0},
236567a7532Smartynas   {"tgamma", tgamma, &INF, &INF, 0},
237567a7532Smartynas   {"tgamma", tgamma, &MONE, &NAN, 0},
238567a7532Smartynas   {"tgamma", tgamma, &ZERO, &INF, 0},
239567a7532Smartynas   {"tgamma", tgamma, &MINF, &NAN, 0},
240567a7532Smartynas #if GLIBC2
241567a7532Smartynas   {"lgamma", lgamma, &NAN, &NAN, 0},
242567a7532Smartynas   {"lgamma", lgamma, &INF, &INF, 0},
243567a7532Smartynas   {"lgamma", lgamma, &MONE, &INF, 0},
244567a7532Smartynas   {"lgamma", lgamma, &ZERO, &INF, 0},
245567a7532Smartynas   {"lgamma", lgamma, &MINF, &INF, 0},
246567a7532Smartynas #else
247567a7532Smartynas   {"lgam", lgam, &NAN, &NAN, 0},
248567a7532Smartynas   {"lgam", lgam, &INF, &INF, 0},
249567a7532Smartynas   {"lgam", lgam, &MONE, &INF, 0},
250567a7532Smartynas   {"lgam", lgam, &ZERO, &INF, 0},
251567a7532Smartynas   {"lgam", lgam, &MINF, &INF, 0},
252567a7532Smartynas #endif
253567a7532Smartynas   {"ceil", ceil, &NAN, &NAN, 0},
254567a7532Smartynas   {"ceil", ceil, &ZERO, &ZERO, 0},
255567a7532Smartynas   {"ceil", ceil, &MZERO, &MZERO, 0},
256567a7532Smartynas   {"ceil", ceil, &INF, &INF, 0},
257567a7532Smartynas   {"ceil", ceil, &MINF, &MINF, 0},
258567a7532Smartynas   {"floor", floor, &NAN, &NAN, 0},
259567a7532Smartynas   {"floor", floor, &ZERO, &ZERO, 0},
260567a7532Smartynas   {"floor", floor, &MZERO, &MZERO, 0},
261567a7532Smartynas   {"floor", floor, &INF, &INF, 0},
262567a7532Smartynas   {"floor", floor, &MINF, &MINF, 0},
263567a7532Smartynas   {"null", NULL, &ZERO, &ZERO, 0},
264567a7532Smartynas };
265567a7532Smartynas 
266567a7532Smartynas /* Functions of two variables.  */
267567a7532Smartynas double atan2 (double, double);
268567a7532Smartynas double pow (double, double);
269567a7532Smartynas 
270567a7532Smartynas struct twoarguments
271567a7532Smartynas   {
272567a7532Smartynas     char *name;			/* Name of the function. */
273567a7532Smartynas     double (*func) (double, double);
274567a7532Smartynas     double *arg1;
275567a7532Smartynas     double *arg2;
276567a7532Smartynas     double *answer;
277567a7532Smartynas     int thresh;
278567a7532Smartynas   };
279567a7532Smartynas 
280567a7532Smartynas static struct twoarguments test2[] =
281567a7532Smartynas {
282567a7532Smartynas   {"atan2", atan2, &ZERO, &ONE, &ZERO, 0},
283567a7532Smartynas   {"atan2", atan2, &MZERO, &ONE, &MZERO, 0},
284567a7532Smartynas   {"atan2", atan2, &ZERO, &ZERO, &ZERO, 0},
285567a7532Smartynas   {"atan2", atan2, &MZERO, &ZERO, &MZERO, 0},
286567a7532Smartynas   {"atan2", atan2, &ZERO, &MONE, &PI, 0},
287567a7532Smartynas   {"atan2", atan2, &MZERO, &MONE, &MPI, 0},
288567a7532Smartynas   {"atan2", atan2, &ZERO, &MZERO, &PI, 0},
289567a7532Smartynas   {"atan2", atan2, &MZERO, &MZERO, &MPI, 0},
290567a7532Smartynas   {"atan2", atan2, &ONE, &ZERO, &PIO2, 0},
291567a7532Smartynas   {"atan2", atan2, &ONE, &MZERO, &PIO2, 0},
292567a7532Smartynas   {"atan2", atan2, &MONE, &ZERO, &MPIO2, 0},
293567a7532Smartynas   {"atan2", atan2, &MONE, &MZERO, &MPIO2, 0},
294567a7532Smartynas   {"atan2", atan2, &ONE, &INF, &ZERO, 0},
295567a7532Smartynas   {"atan2", atan2, &MONE, &INF, &MZERO, 0},
296567a7532Smartynas   {"atan2", atan2, &INF, &ONE, &PIO2, 0},
297567a7532Smartynas   {"atan2", atan2, &INF, &MONE, &PIO2, 0},
298567a7532Smartynas   {"atan2", atan2, &MINF, &ONE, &MPIO2, 0},
299567a7532Smartynas   {"atan2", atan2, &MINF, &MONE, &MPIO2, 0},
300567a7532Smartynas   {"atan2", atan2, &ONE, &MINF, &PI, 0},
301567a7532Smartynas   {"atan2", atan2, &MONE, &MINF, &MPI, 0},
302567a7532Smartynas   {"atan2", atan2, &INF, &INF, &PIO4, 0},
303567a7532Smartynas   {"atan2", atan2, &MINF, &INF, &MPIO4, 0},
304567a7532Smartynas   {"atan2", atan2, &INF, &MINF, &THPIO4, 0},
305567a7532Smartynas   {"atan2", atan2, &MINF, &MINF, &MTHPIO4, 0},
306567a7532Smartynas   {"atan2", atan2, &ONE, &ONE, &PIO4, 0},
307567a7532Smartynas   {"atan2", atan2, &NAN, &ONE, &NAN, 0},
308567a7532Smartynas   {"atan2", atan2, &ONE, &NAN, &NAN, 0},
309567a7532Smartynas   {"atan2", atan2, &NAN, &NAN, &NAN, 0},
310567a7532Smartynas   {"pow", pow, &ONE, &ZERO, &ONE, 0},
311567a7532Smartynas   {"pow", pow, &ONE, &MZERO, &ONE, 0},
312567a7532Smartynas   {"pow", pow, &MONE, &ZERO, &ONE, 0},
313567a7532Smartynas   {"pow", pow, &MONE, &MZERO, &ONE, 0},
314567a7532Smartynas   {"pow", pow, &INF, &ZERO, &ONE, 0},
315567a7532Smartynas   {"pow", pow, &INF, &MZERO, &ONE, 0},
316567a7532Smartynas   {"pow", pow, &NAN, &ZERO, &ONE, 0},
317567a7532Smartynas   {"pow", pow, &NAN, &MZERO, &ONE, 0},
318567a7532Smartynas   {"pow", pow, &TWO, &INF, &INF, 0},
319567a7532Smartynas   {"pow", pow, &MTWO, &INF, &INF, 0},
320567a7532Smartynas   {"pow", pow, &HALF, &INF, &ZERO, 0},
321567a7532Smartynas   {"pow", pow, &MHALF, &INF, &ZERO, 0},
322567a7532Smartynas   {"pow", pow, &TWO, &MINF, &ZERO, 0},
323567a7532Smartynas   {"pow", pow, &MTWO, &MINF, &ZERO, 0},
324567a7532Smartynas   {"pow", pow, &HALF, &MINF, &INF, 0},
325567a7532Smartynas   {"pow", pow, &MHALF, &MINF, &INF, 0},
326567a7532Smartynas   {"pow", pow, &INF, &HALF, &INF, 0},
327567a7532Smartynas   {"pow", pow, &INF, &TWO, &INF, 0},
328567a7532Smartynas   {"pow", pow, &INF, &MHALF, &ZERO, 0},
329567a7532Smartynas   {"pow", pow, &INF, &MTWO, &ZERO, 0},
330567a7532Smartynas   {"pow", pow, &MINF, &THREE, &MINF, 0},
331567a7532Smartynas   {"pow", pow, &MINF, &TWO, &INF, 0},
332567a7532Smartynas   {"pow", pow, &MINF, &MTHREE, &MZERO, 0},
333567a7532Smartynas   {"pow", pow, &MINF, &MTWO, &ZERO, 0},
334567a7532Smartynas   {"pow", pow, &NAN, &ONE, &NAN, 0},
335*d205ab02Skettenis   {"pow", pow, &ONE, &NAN, &ONE, 0},
336567a7532Smartynas   {"pow", pow, &NAN, &NAN, &NAN, 0},
337*d205ab02Skettenis   {"pow", pow, &ONE, &INF, &ONE, 0},
338*d205ab02Skettenis   {"pow", pow, &MONE, &INF, &ONE, 0},
339*d205ab02Skettenis   {"pow", pow, &ONE, &MINF, &ONE, 0},
340*d205ab02Skettenis   {"pow", pow, &MONE, &MINF, &ONE, 0},
341567a7532Smartynas   {"pow", pow, &MTWO, &HALF, &NAN, 0},
342567a7532Smartynas   {"pow", pow, &ZERO, &MTHREE, &INF, 0},
343567a7532Smartynas   {"pow", pow, &MZERO, &MTHREE, &MINF, 0},
344567a7532Smartynas   {"pow", pow, &ZERO, &MHALF, &INF, 0},
345567a7532Smartynas   {"pow", pow, &MZERO, &MHALF, &INF, 0},
346567a7532Smartynas   {"pow", pow, &ZERO, &THREE, &ZERO, 0},
347567a7532Smartynas   {"pow", pow, &MZERO, &THREE, &MZERO, 0},
348567a7532Smartynas   {"pow", pow, &ZERO, &HALF, &ZERO, 0},
349567a7532Smartynas   {"pow", pow, &MZERO, &HALF, &ZERO, 0},
350567a7532Smartynas   {"null", NULL, &ZERO, &ZERO, &ZERO, 0},
351567a7532Smartynas };
352567a7532Smartynas 
353567a7532Smartynas /* Integer functions of one variable.  */
354567a7532Smartynas 
355567a7532Smartynas int isnan (double);
356567a7532Smartynas int __signbit (double);
357567a7532Smartynas 
358567a7532Smartynas struct intans
359567a7532Smartynas   {
360567a7532Smartynas     char *name;			/* Name of the function. */
361567a7532Smartynas     int (*func) (double);
362567a7532Smartynas     double *arg1;
363567a7532Smartynas     int ianswer;
364567a7532Smartynas   };
365567a7532Smartynas 
366567a7532Smartynas static struct intans test3[] =
367567a7532Smartynas {
368567a7532Smartynas   {"isfinite", __isfinite, &ZERO, 1},
369567a7532Smartynas   {"isfinite", __isfinite, &INF, 0},
370567a7532Smartynas   {"isfinite", __isfinite, &MINF, 0},
371567a7532Smartynas   {"isnan", isnan, &NAN, 1},
372567a7532Smartynas   {"isnan", isnan, &INF, 0},
373567a7532Smartynas   {"isnan", isnan, &ZERO, 0},
374567a7532Smartynas   {"isnan", isnan, &MZERO, 0},
375567a7532Smartynas   {"signbit", __signbit, &MZERO, 1},
376567a7532Smartynas   {"signbit", __signbit, &MONE, 1},
377567a7532Smartynas   {"signbit", __signbit, &ZERO, 0},
378567a7532Smartynas   {"signbit", __signbit, &ONE, 0},
379567a7532Smartynas   {"signbit", __signbit, &MINF, 1},
380567a7532Smartynas   {"signbit", __signbit, &INF, 0},
381567a7532Smartynas   {"null", NULL, &ZERO, 0},
382567a7532Smartynas };
383567a7532Smartynas 
384567a7532Smartynas static volatile double x1;
385567a7532Smartynas static volatile double x2;
386567a7532Smartynas static volatile double y;
387567a7532Smartynas static volatile double answer;
388567a7532Smartynas 
389567a7532Smartynas static void
pvec(x)390567a7532Smartynas pvec(x)
391567a7532Smartynas double x;
392567a7532Smartynas {
393567a7532Smartynas   union
394567a7532Smartynas   {
395567a7532Smartynas     double d;
396567a7532Smartynas     unsigned short s[4];
397567a7532Smartynas   } u;
398567a7532Smartynas   int i;
399567a7532Smartynas 
400567a7532Smartynas   u.d = x;
401567a7532Smartynas   for (i = 0; i < 4; i++)
402567a7532Smartynas     printf ("0x%04x ", u.s[i]);
403567a7532Smartynas   printf ("\n");
404567a7532Smartynas }
405567a7532Smartynas 
406567a7532Smartynas 
407567a7532Smartynas int
testvect()408567a7532Smartynas testvect ()
409567a7532Smartynas {
410567a7532Smartynas   int i, nerrors, k, ianswer, ntests;
411567a7532Smartynas   double (*fun1) (double);
412567a7532Smartynas   double (*fun2) (double, double);
413567a7532Smartynas   int (*fun3) (double);
414567a7532Smartynas   double e;
415567a7532Smartynas   union
416567a7532Smartynas     {
417567a7532Smartynas       double d;
418567a7532Smartynas       char c[8];
419567a7532Smartynas     } u, v;
420567a7532Smartynas 
421567a7532Smartynas   ZERO = 0.0;
422567a7532Smartynas   MZERO = NEGZERO;
423567a7532Smartynas   HALF = 0.5;
424567a7532Smartynas   MHALF = -HALF;
425567a7532Smartynas   ONE = 1.0;
426567a7532Smartynas   MONE = -ONE;
427567a7532Smartynas   TWO = 2.0;
428567a7532Smartynas   MTWO = -TWO;
429567a7532Smartynas   THREE = 3.0;
430567a7532Smartynas   MTHREE = -THREE;
431567a7532Smartynas   INF = INFINITY;
432567a7532Smartynas   MINF = -INFINITY;
433567a7532Smartynas   MPI = -PI;
434567a7532Smartynas   PIO2 = 0.5 * PI;
435567a7532Smartynas   MPIO2 = -PIO2;
436567a7532Smartynas   PIO4 = 0.5 * PIO2;
437567a7532Smartynas   MPIO4 = -PIO4;
438567a7532Smartynas   THPIO4 = 3.0 * PIO4;
439567a7532Smartynas   MTHPIO4 = -THPIO4;
440567a7532Smartynas 
441567a7532Smartynas   nerrors = 0;
442567a7532Smartynas   ntests = 0;
443567a7532Smartynas   i = 0;
444567a7532Smartynas   for (;;)
445567a7532Smartynas     {
446567a7532Smartynas       fun1 = test1[i].func;
447567a7532Smartynas       if (fun1 == NULL)
448567a7532Smartynas 	break;
449567a7532Smartynas       x1 = *(test1[i].arg1);
450567a7532Smartynas       y = (*(fun1)) (x1);
451567a7532Smartynas       answer = *(test1[i].answer);
452567a7532Smartynas       if (test1[i].thresh == 0)
453567a7532Smartynas 	{
454567a7532Smartynas 	  v.d = answer;
455567a7532Smartynas 	  u.d = y;
456567a7532Smartynas 	  if (memcmp(u.c, v.c, 8) != 0)
457567a7532Smartynas 	    {
458567a7532Smartynas 	      if( isnan(v.d) && isnan(u.d) )
459567a7532Smartynas 		goto nxttest1;
460567a7532Smartynas 	      goto wrongone;
461567a7532Smartynas 	    }
462567a7532Smartynas 	  else
463567a7532Smartynas 	    goto nxttest1;
464567a7532Smartynas 	}
465567a7532Smartynas       if (y != answer)
466567a7532Smartynas 	{
467567a7532Smartynas 	  e = y - answer;
468567a7532Smartynas 	  if (answer != 0.0)
469567a7532Smartynas 	    e = e / answer;
470567a7532Smartynas 	  if (e < 0)
471567a7532Smartynas 	    e = -e;
472567a7532Smartynas 	  if (e > test1[i].thresh * MACHEP)
473567a7532Smartynas 	    {
474567a7532Smartynas wrongone:
475567a7532Smartynas 	      printf ("%s (%.16e) = %.16e\n    should be %.16e\n",
476567a7532Smartynas 		      test1[i].name, x1, y, answer);
477567a7532Smartynas 	      nerrors += 1;
478567a7532Smartynas 	    }
479567a7532Smartynas 	}
480567a7532Smartynas nxttest1:
481567a7532Smartynas       ntests += 1;
482567a7532Smartynas       i += 1;
483567a7532Smartynas     }
484567a7532Smartynas 
485567a7532Smartynas   i = 0;
486567a7532Smartynas   for (;;)
487567a7532Smartynas     {
488567a7532Smartynas       fun2 = test2[i].func;
489567a7532Smartynas       if (fun2 == NULL)
490567a7532Smartynas 	break;
491567a7532Smartynas       x1 = *(test2[i].arg1);
492567a7532Smartynas       x2 = *(test2[i].arg2);
493567a7532Smartynas       y = (*(fun2)) (x1, x2);
494567a7532Smartynas       answer = *(test2[i].answer);
495567a7532Smartynas       if (test2[i].thresh == 0)
496567a7532Smartynas 	{
497567a7532Smartynas 	  v.d = answer;
498567a7532Smartynas 	  u.d = y;
499567a7532Smartynas 	  if (memcmp(u.c, v.c, 8) != 0)
500567a7532Smartynas 	    {
501567a7532Smartynas 	      if( isnan(v.d) && isnan(u.d) )
502567a7532Smartynas 		goto nxttest2;
503567a7532Smartynas #if 0
504567a7532Smartynas 	      if( isnan(v.d) )
505567a7532Smartynas 		pvec(v.d);
506567a7532Smartynas 	      if( isnan(u.d) )
507567a7532Smartynas 		pvec(u.d);
508567a7532Smartynas #endif
509567a7532Smartynas 	    goto wrongtwo;
510567a7532Smartynas 	    }
511567a7532Smartynas 	  else
512567a7532Smartynas 	    goto nxttest2;
513567a7532Smartynas 	}
514567a7532Smartynas       if (y != answer)
515567a7532Smartynas 	{
516567a7532Smartynas 	  e = y - answer;
517567a7532Smartynas 	  if (answer != 0.0)
518567a7532Smartynas 	    e = e / answer;
519567a7532Smartynas 	  if (e < 0)
520567a7532Smartynas 	    e = -e;
521567a7532Smartynas 	  if (e > test2[i].thresh * MACHEP)
522567a7532Smartynas 	    {
523567a7532Smartynas wrongtwo:
524567a7532Smartynas 	      printf ("%s (%.16e, %.16e) = %.16e\n    should be %.16e\n",
525567a7532Smartynas 		      test2[i].name, x1, x2, y, answer);
526567a7532Smartynas 	      nerrors += 1;
527567a7532Smartynas 	    }
528567a7532Smartynas 	}
529567a7532Smartynas nxttest2:
530567a7532Smartynas       ntests += 1;
531567a7532Smartynas       i += 1;
532567a7532Smartynas     }
533567a7532Smartynas 
534567a7532Smartynas 
535567a7532Smartynas   i = 0;
536567a7532Smartynas   for (;;)
537567a7532Smartynas     {
538567a7532Smartynas       fun3 = test3[i].func;
539567a7532Smartynas       if (fun3 == NULL)
540567a7532Smartynas 	break;
541567a7532Smartynas       x1 = *(test3[i].arg1);
542567a7532Smartynas       k = (*(fun3)) (x1);
543567a7532Smartynas       ianswer = test3[i].ianswer;
544567a7532Smartynas       if (k != ianswer)
545567a7532Smartynas 	{
546567a7532Smartynas 	  printf ("%s (%.16e) = %d\n    should be. %d\n",
547567a7532Smartynas 		  test3[i].name, x1, k, ianswer);
548567a7532Smartynas 	  nerrors += 1;
549567a7532Smartynas 	}
550567a7532Smartynas       ntests += 1;
551567a7532Smartynas       i += 1;
552567a7532Smartynas     }
553567a7532Smartynas 
554567a7532Smartynas   printf ("%d errors in %d tests\n", nerrors, ntests);
555567a7532Smartynas   return (nerrors);
556567a7532Smartynas }
557