xref: /netbsd-src/external/lgpl3/mpfr/dist/tests/tminmax.c (revision ba125506a622fe649968631a56eba5d42ff57863)
1 /* Test file for mpfr_min & mpfr_max.
2 
3 Copyright 2004, 2006-2023 Free Software Foundation, Inc.
4 Contributed by the AriC and Caramba projects, INRIA.
5 
6 This file is part of the GNU MPFR Library.
7 
8 The GNU MPFR Library is free software; you can redistribute it and/or modify
9 it under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or (at your
11 option) any later version.
12 
13 The GNU MPFR Library is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
16 License for more details.
17 
18 You should have received a copy of the GNU Lesser General Public License
19 along with the GNU MPFR Library; see the file COPYING.LESSER.  If not, see
20 https://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
21 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
22 
23 #include "mpfr-test.h"
24 
25 int
main(void)26 main (void)
27 {
28   mpfr_t x, y, z;
29 
30   tests_start_mpfr ();
31 
32   mpfr_init (x);
33   mpfr_init (y);
34   mpfr_init (z);
35 
36   /* case x=NaN && y=NAN */
37   mpfr_set_nan (x);
38   mpfr_set_nan (y);
39   mpfr_min (z, x, y, MPFR_RNDN);
40   if (!mpfr_nan_p (z))
41     {
42       printf ("Error in mpfr_min (NaN, NaN)\n");
43       exit (1);
44     }
45   mpfr_max (z, x, y, MPFR_RNDN);
46   if (!mpfr_nan_p (z))
47     {
48       printf ("Error in mpfr_max (NaN, NaN)\n");
49       exit (1);
50     }
51   /* case x=NaN */
52   mpfr_set_nan (x);
53   mpfr_set_ui (y, 0, MPFR_RNDN);
54   mpfr_min (z, x, y, MPFR_RNDN);
55   if (mpfr_cmp_ui (z, 0))
56     {
57       printf ("Error in mpfr_min (NaN, 0)\n");
58       exit (1);
59     }
60   mpfr_min (z, y, x, MPFR_RNDN);
61   if (mpfr_cmp_ui (z, 0))
62     {
63       printf ("Error in mpfr_min (0, NaN)\n");
64       exit (1);
65     }
66   mpfr_max (z, x, y, MPFR_RNDN);
67   if (mpfr_cmp_ui (z, 0))
68     {
69       printf ("Error in mpfr_max (NaN, 0)\n");
70       exit (1);
71     }
72   mpfr_max (z, y, x, MPFR_RNDN);
73   if (mpfr_cmp_ui (z, 0))
74     {
75       printf ("Error in mpfr_max (0, NaN)\n");
76       exit (1);
77     }
78   /* Case x=0+ and x=0- */
79   mpfr_set_ui (x, 0, MPFR_RNDN);
80   mpfr_set_ui (y, 0, MPFR_RNDN); MPFR_SET_NEG(y);
81   mpfr_max (z, x, y, MPFR_RNDN);
82   if (!MPFR_IS_ZERO(z) || MPFR_IS_NEG(z))
83     {
84       printf ("Error in mpfr_max (0+, 0-)\n");
85       exit (1);
86     }
87   mpfr_min (z, x, y, MPFR_RNDN);
88   if (!MPFR_IS_ZERO(z) || MPFR_IS_POS(z))
89     {
90       printf ("Error in mpfr_min (0+, 0-)\n");
91       exit (1);
92     }
93   /* Case x=0- and y=0+ */
94   mpfr_set_ui (x, 0, MPFR_RNDN); MPFR_SET_NEG(x);
95   mpfr_set_ui (y, 0, MPFR_RNDN);
96   mpfr_max (z, x, y, MPFR_RNDN);
97   if (!MPFR_IS_ZERO(z) || MPFR_IS_NEG(z))
98     {
99       printf ("Error in mpfr_max (0+, 0-)\n");
100       exit (1);
101     }
102   mpfr_min (z, x, y, MPFR_RNDN);
103   if (!MPFR_IS_ZERO(z) || MPFR_IS_POS(z))
104     {
105       printf ("Error in mpfr_min (0+, 0-)\n");
106       exit (1);
107     }
108 
109   /* case x=+Inf */
110   mpfr_set_inf (x, 1);
111   mpfr_set_si (y, -12, MPFR_RNDN);
112   mpfr_min (z, x, y, MPFR_RNDN);
113   if ( mpfr_cmp_si (z, -12) )
114     {
115       printf ("Error in mpfr_min (+Inf, -12)\n");
116       exit (1);
117     }
118   mpfr_max (z, x, y, MPFR_RNDN);
119   if ( !MPFR_IS_INF(z) || MPFR_IS_NEG(z) )
120     {
121       printf ("Error in mpfr_max (+Inf, 12)\n");
122       exit (1);
123     }
124   /* case x=-Inf */
125   mpfr_set_inf (x, -1);
126   mpfr_set_ui (y, 12, MPFR_RNDN);
127   mpfr_max (z, x, y, MPFR_RNDN);
128   if ( mpfr_cmp_ui (z, 12) )
129     {
130       printf ("Error in mpfr_max (-Inf, 12)\n");
131       exit (1);
132     }
133   mpfr_min (z, x, y, MPFR_RNDN);
134   if ( !MPFR_IS_INF(z) || MPFR_IS_POS(z) )
135     {
136       printf ("Error in mpfr_min (-Inf, 12)\n");
137       exit (1);
138     }
139 
140   /* case x=17 and y=42 */
141   mpfr_set_ui (x, 17, MPFR_RNDN);
142   mpfr_set_ui (y, 42, MPFR_RNDN);
143   mpfr_max (z, x, y, MPFR_RNDN);
144   if ( mpfr_cmp_ui (z, 42) )
145     {
146       printf ("Error in mpfr_max (17, 42)\n");
147       exit (1);
148     }
149   mpfr_max (z, y, x, MPFR_RNDN);
150   if ( mpfr_cmp_ui (z, 42) )
151     {
152       printf ("Error in mpfr_max (42, 17)\n");
153       exit (1);
154     }
155   mpfr_min (z, y, x, MPFR_RNDN);
156   if ( mpfr_cmp_ui (z, 17) )
157     {
158       printf ("Error in mpfr_min (42, 17)\n");
159       exit (1);
160     }
161 
162   mpfr_clear (x);
163   mpfr_clear (y);
164   mpfr_clear (z);
165 
166   tests_end_mpfr ();
167   return 0;
168 }
169