xref: /freebsd/lib/msun/tests/fmaximum_fminimum_test.c (revision e55db843ef45a8788f69e110d97210fb3968b92f)
1*e55db843SJesús Blázquez /*
2*e55db843SJesús Blázquez  * Copyright (c) 2008 David Schultz <das@FreeBSD.org>
3*e55db843SJesús Blázquez  * All rights reserved.
4*e55db843SJesús Blázquez  *
5*e55db843SJesús Blázquez  * Redistribution and use in source and binary forms, with or without
6*e55db843SJesús Blázquez  * modification, are permitted provided that the following conditions
7*e55db843SJesús Blázquez  * are met:
8*e55db843SJesús Blázquez  * 1. Redistributions of source code must retain the above copyright
9*e55db843SJesús Blázquez  *    notice, this list of conditions and the following disclaimer.
10*e55db843SJesús Blázquez  * 2. Redistributions in binary form must reproduce the above copyright
11*e55db843SJesús Blázquez  *    notice, this list of conditions and the following disclaimer in the
12*e55db843SJesús Blázquez  *    documentation and/or other materials provided with the distribution.
13*e55db843SJesús Blázquez  *
14*e55db843SJesús Blázquez  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15*e55db843SJesús Blázquez  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16*e55db843SJesús Blázquez  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17*e55db843SJesús Blázquez  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18*e55db843SJesús Blázquez  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19*e55db843SJesús Blázquez  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20*e55db843SJesús Blázquez  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21*e55db843SJesús Blázquez  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22*e55db843SJesús Blázquez  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23*e55db843SJesús Blázquez  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24*e55db843SJesús Blázquez  * SUCH DAMAGE.
25*e55db843SJesús Blázquez  */
26*e55db843SJesús Blázquez 
27*e55db843SJesús Blázquez /*
28*e55db843SJesús Blázquez  * Tests for fmaximum{,f,l}() and fminimum{,f,l}()
29*e55db843SJesús Blázquez  */
30*e55db843SJesús Blázquez 
31*e55db843SJesús Blázquez #include <sys/cdefs.h>
32*e55db843SJesús Blázquez #include <fenv.h>
33*e55db843SJesús Blázquez #include <float.h>
34*e55db843SJesús Blázquez #include <math.h>
35*e55db843SJesús Blázquez 
36*e55db843SJesús Blázquez #include "test-utils.h"
37*e55db843SJesús Blázquez 
38*e55db843SJesús Blázquez #pragma STDC FENV_ACCESS ON
39*e55db843SJesús Blázquez 
40*e55db843SJesús Blázquez /*
41*e55db843SJesús Blázquez  * Test whether func(x, y) has the expected result, and make sure no
42*e55db843SJesús Blázquez  * exceptions are raised.
43*e55db843SJesús Blázquez  */
44*e55db843SJesús Blázquez #define	TEST(func, type, x, y, expected, rmode) do {			      \
45*e55db843SJesús Blázquez 	type __x = (x);	/* convert before we clear exceptions */	      \
46*e55db843SJesús Blázquez 	type __y = (y);							      \
47*e55db843SJesús Blázquez 	ATF_REQUIRE_EQ(0, feclearexcept(ALL_STD_EXCEPT));		      \
48*e55db843SJesús Blázquez 	long double __result = func((__x), (__y));			      \
49*e55db843SJesús Blázquez 	CHECK_FP_EXCEPTIONS_MSG(0, ALL_STD_EXCEPT,			      \
50*e55db843SJesús Blázquez 	    #func "(%.20Lg, %.20Lg) rmode%d", (x), (y), rmode);		      \
51*e55db843SJesús Blázquez 	ATF_CHECK_MSG(fpequal_cs(__result, (expected), true),		      \
52*e55db843SJesús Blázquez 	    #func "(%.20Lg, %.20Lg) rmode%d = %.20Lg, expected %.20Lg",       \
53*e55db843SJesús Blázquez 	    (x), (y), rmode, __result, (expected));			      \
54*e55db843SJesús Blázquez } while (0)
55*e55db843SJesús Blázquez 
56*e55db843SJesús Blázquez static void
testall_r(long double big,long double small,int rmode)57*e55db843SJesús Blázquez testall_r(long double big, long double small, int rmode)
58*e55db843SJesús Blázquez {
59*e55db843SJesús Blázquez 	long double expected_max, expected_min;
60*e55db843SJesús Blázquez 	if (isnan(big) || isnan(small)) {
61*e55db843SJesús Blázquez 		expected_max = big + small;
62*e55db843SJesús Blázquez 		expected_min = expected_max;
63*e55db843SJesús Blázquez 	} else {
64*e55db843SJesús Blázquez 		expected_max = big;
65*e55db843SJesús Blázquez 		expected_min = small;
66*e55db843SJesús Blázquez 	}
67*e55db843SJesús Blázquez 
68*e55db843SJesús Blázquez 	TEST(fmaximumf, float, big, small, expected_max, rmode);
69*e55db843SJesús Blázquez 	TEST(fmaximumf, float, small, big, expected_max, rmode);
70*e55db843SJesús Blázquez 	TEST(fmaximum, double, big, small, expected_max, rmode);
71*e55db843SJesús Blázquez 	TEST(fmaximum, double, small, big, expected_max, rmode);
72*e55db843SJesús Blázquez 	TEST(fmaximuml, long double, big, small, expected_max, rmode);
73*e55db843SJesús Blázquez 	TEST(fmaximuml, long double, small, big, expected_max, rmode);
74*e55db843SJesús Blázquez 	TEST(fminimumf, float, big, small, expected_min, rmode);
75*e55db843SJesús Blázquez 	TEST(fminimumf, float, small, big, expected_min, rmode);
76*e55db843SJesús Blázquez 	TEST(fminimum, double, big, small, expected_min, rmode);
77*e55db843SJesús Blázquez 	TEST(fminimum, double, small, big, expected_min, rmode);
78*e55db843SJesús Blázquez 	TEST(fminimuml, long double, big, small, expected_min, rmode);
79*e55db843SJesús Blázquez 	TEST(fminimuml, long double, small, big, expected_min, rmode);
80*e55db843SJesús Blázquez }
81*e55db843SJesús Blázquez 
82*e55db843SJesús Blázquez /*
83*e55db843SJesús Blázquez  * Test all the functions: fmaximumf, fmaximum, fmaximuml, fminimumf, fminimum, fminimuml
84*e55db843SJesús Blázquez  * in all rounding modes and with the arguments in different orders.
85*e55db843SJesús Blázquez  * The input 'big' must be >= 'small'.
86*e55db843SJesús Blázquez  */
87*e55db843SJesús Blázquez static void
testall(long double big,long double small)88*e55db843SJesús Blázquez testall(long double big, long double small)
89*e55db843SJesús Blázquez {
90*e55db843SJesús Blázquez 	static const int rmodes[] = {
91*e55db843SJesús Blázquez 		FE_TONEAREST, FE_UPWARD, FE_DOWNWARD, FE_TOWARDZERO
92*e55db843SJesús Blázquez 	};
93*e55db843SJesús Blázquez 	int i;
94*e55db843SJesús Blázquez 
95*e55db843SJesús Blázquez 	for (i = 0; i < 4; i++) {
96*e55db843SJesús Blázquez 		fesetround(rmodes[i]);
97*e55db843SJesús Blázquez 		testall_r(big, small, rmodes[i]);
98*e55db843SJesús Blázquez 	}
99*e55db843SJesús Blázquez }
100*e55db843SJesús Blázquez 
101*e55db843SJesús Blázquez ATF_TC_WITHOUT_HEAD(test1);
ATF_TC_BODY(test1,tc)102*e55db843SJesús Blázquez ATF_TC_BODY(test1, tc)
103*e55db843SJesús Blázquez {
104*e55db843SJesús Blázquez 	testall(1.0, 0.0);
105*e55db843SJesús Blázquez }
106*e55db843SJesús Blázquez 
107*e55db843SJesús Blázquez ATF_TC_WITHOUT_HEAD(test2);
ATF_TC_BODY(test2,tc)108*e55db843SJesús Blázquez ATF_TC_BODY(test2, tc)
109*e55db843SJesús Blázquez {
110*e55db843SJesús Blázquez 	testall(42.0, nextafterf(42.0, -INFINITY));
111*e55db843SJesús Blázquez }
112*e55db843SJesús Blázquez ATF_TC_WITHOUT_HEAD(test3);
ATF_TC_BODY(test3,tc)113*e55db843SJesús Blázquez ATF_TC_BODY(test3, tc)
114*e55db843SJesús Blázquez {
115*e55db843SJesús Blázquez 	testall(nextafterf(42.0, INFINITY), 42.0);
116*e55db843SJesús Blázquez }
117*e55db843SJesús Blázquez 
118*e55db843SJesús Blázquez ATF_TC_WITHOUT_HEAD(test4);
ATF_TC_BODY(test4,tc)119*e55db843SJesús Blázquez ATF_TC_BODY(test4, tc)
120*e55db843SJesús Blázquez {
121*e55db843SJesús Blázquez 	testall(-5.0, -5.0);
122*e55db843SJesús Blázquez }
123*e55db843SJesús Blázquez 
124*e55db843SJesús Blázquez ATF_TC_WITHOUT_HEAD(test5);
ATF_TC_BODY(test5,tc)125*e55db843SJesús Blázquez ATF_TC_BODY(test5, tc)
126*e55db843SJesús Blázquez {
127*e55db843SJesús Blázquez 	testall(-3.0, -4.0);
128*e55db843SJesús Blázquez }
129*e55db843SJesús Blázquez 
130*e55db843SJesús Blázquez ATF_TC_WITHOUT_HEAD(test6);
ATF_TC_BODY(test6,tc)131*e55db843SJesús Blázquez ATF_TC_BODY(test6, tc)
132*e55db843SJesús Blázquez {
133*e55db843SJesús Blázquez 	testall(1.0, NAN);
134*e55db843SJesús Blázquez }
135*e55db843SJesús Blázquez ATF_TC_WITHOUT_HEAD(test7);
ATF_TC_BODY(test7,tc)136*e55db843SJesús Blázquez ATF_TC_BODY(test7, tc)
137*e55db843SJesús Blázquez {
138*e55db843SJesús Blázquez 	testall(INFINITY, NAN);
139*e55db843SJesús Blázquez }
140*e55db843SJesús Blázquez 
141*e55db843SJesús Blázquez ATF_TC_WITHOUT_HEAD(test8);
ATF_TC_BODY(test8,tc)142*e55db843SJesús Blázquez ATF_TC_BODY(test8, tc)
143*e55db843SJesús Blázquez {
144*e55db843SJesús Blázquez 	testall(INFINITY, 1.0);
145*e55db843SJesús Blázquez }
146*e55db843SJesús Blázquez 
147*e55db843SJesús Blázquez ATF_TC_WITHOUT_HEAD(test9);
ATF_TC_BODY(test9,tc)148*e55db843SJesús Blázquez ATF_TC_BODY(test9, tc)
149*e55db843SJesús Blázquez {
150*e55db843SJesús Blázquez 	testall(-3.0, -INFINITY);
151*e55db843SJesús Blázquez }
152*e55db843SJesús Blázquez 
153*e55db843SJesús Blázquez ATF_TC_WITHOUT_HEAD(test10);
ATF_TC_BODY(test10,tc)154*e55db843SJesús Blázquez ATF_TC_BODY(test10, tc)
155*e55db843SJesús Blázquez {
156*e55db843SJesús Blázquez 	testall(3.0, -INFINITY);
157*e55db843SJesús Blázquez }
158*e55db843SJesús Blázquez 
159*e55db843SJesús Blázquez ATF_TC_WITHOUT_HEAD(test11);
ATF_TC_BODY(test11,tc)160*e55db843SJesús Blázquez ATF_TC_BODY(test11, tc)
161*e55db843SJesús Blázquez {
162*e55db843SJesús Blázquez 	testall(NAN, NAN);
163*e55db843SJesús Blázquez }
164*e55db843SJesús Blázquez 
165*e55db843SJesús Blázquez ATF_TC_WITHOUT_HEAD(test12);
ATF_TC_BODY(test12,tc)166*e55db843SJesús Blázquez ATF_TC_BODY(test12, tc)
167*e55db843SJesús Blázquez {
168*e55db843SJesús Blázquez 	testall(0.0, -0.0);
169*e55db843SJesús Blázquez }
170*e55db843SJesús Blázquez 
171*e55db843SJesús Blázquez 
ATF_TP_ADD_TCS(tp)172*e55db843SJesús Blázquez ATF_TP_ADD_TCS(tp)
173*e55db843SJesús Blázquez {
174*e55db843SJesús Blázquez 	ATF_TP_ADD_TC(tp, test1);
175*e55db843SJesús Blázquez 	ATF_TP_ADD_TC(tp, test2);
176*e55db843SJesús Blázquez 	ATF_TP_ADD_TC(tp, test3);
177*e55db843SJesús Blázquez 	ATF_TP_ADD_TC(tp, test4);
178*e55db843SJesús Blázquez 	ATF_TP_ADD_TC(tp, test5);
179*e55db843SJesús Blázquez 	ATF_TP_ADD_TC(tp, test6);
180*e55db843SJesús Blázquez 	ATF_TP_ADD_TC(tp, test7);
181*e55db843SJesús Blázquez 	ATF_TP_ADD_TC(tp, test8);
182*e55db843SJesús Blázquez 	ATF_TP_ADD_TC(tp, test9);
183*e55db843SJesús Blázquez 	ATF_TP_ADD_TC(tp, test10);
184*e55db843SJesús Blázquez 	ATF_TP_ADD_TC(tp, test11);
185*e55db843SJesús Blázquez 	ATF_TP_ADD_TC(tp, test12);
186*e55db843SJesús Blázquez 
187*e55db843SJesús Blázquez 	return (atf_no_error());
188*e55db843SJesús Blázquez }
189