xref: /netbsd-src/external/lgpl3/mpfr/dist/tests/tacosu.c (revision 3f351f34c6d827cf017cdcff3543f6ec0c88b420)
1 /* Test file for mpfr_acosu.
2 
3 Copyright 2021-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 #define TEST_FUNCTION mpfr_acosu
26 #define ULONG_ARG2
27 #include "tgeneric.c"
28 
29 int
30 main (void)
31 {
32   mpfr_t x, y;
33   int r, inex;
34   int unsigned long u;
35 
36   tests_start_mpfr ();
37 
38   mpfr_init (x);
39   mpfr_init (y);
40 
41   /* check singular cases */
42   MPFR_SET_NAN(x);
43   mpfr_acosu (y, x, 1, MPFR_RNDN);
44   if (mpfr_nan_p (y) == 0)
45     {
46       printf ("Error: acosu (NaN, 1) != NaN\n");
47       exit (1);
48     }
49 
50   mpfr_set_inf (x, 1);
51   mpfr_acosu (y, x, 1, MPFR_RNDN);
52   if (mpfr_nan_p (y) == 0)
53     {
54       printf ("Error: acosu (+Inf, 1) != NaN\n");
55       exit (1);
56     }
57 
58   mpfr_set_inf (x, -1);
59   mpfr_acosu (y, x, 1, MPFR_RNDN);
60   if (mpfr_nan_p (y) == 0)
61     {
62       printf ("Error: acosu (-Inf, 1) != NaN\n");
63       exit (1);
64     }
65 
66   /* acosu (0,u) = u/4 */
67   RND_LOOP (r)
68     {
69       mpfr_set_ui (x, 0, MPFR_RNDN); /* exact */
70       mpfr_acosu (y, x, 17, (mpfr_rnd_t) r);
71       mpfr_set_ui_2exp (x, 17, -2, MPFR_RNDN);
72       if (!mpfr_equal_p (x, y))
73         {
74           printf ("Error: acosu(0,17) != 17/4 for rnd=%s\n",
75                   mpfr_print_rnd_mode ((mpfr_rnd_t) r));
76           exit (1);
77         }
78     }
79 
80   /* check case |x| > 1 */
81   mpfr_set_ui (x, 2, MPFR_RNDN);
82   mpfr_acosu (y, x, 1, MPFR_RNDN);
83   if (mpfr_nan_p (y) == 0)
84     {
85       printf ("Error: acosu (2, 1) != NaN\n");
86       exit (1);
87     }
88 
89   mpfr_set_si (x, -2, MPFR_RNDN);
90   mpfr_acosu (y, x, 1, MPFR_RNDN);
91   if (mpfr_nan_p (y) == 0)
92     {
93       printf ("Error: acosu (-2, 1) != NaN\n");
94       exit (1);
95     }
96 
97   /* check case |x| > 1 with u=0 */
98   mpfr_set_ui (x, 2, MPFR_RNDN);
99   mpfr_acosu (y, x, 0, MPFR_RNDN);
100   if (mpfr_nan_p (y) == 0)
101     {
102       printf ("Error: acosu (2, 0) != NaN\n");
103       exit (1);
104     }
105 
106   mpfr_set_si (x, -2, MPFR_RNDN);
107   mpfr_acosu (y, x, 0, MPFR_RNDN);
108   if (mpfr_nan_p (y) == 0)
109     {
110       printf ("Error: acosu (-2, 0) != NaN\n");
111       exit (1);
112     }
113 
114   /* check case u=0 */
115   mpfr_set_ui_2exp (x, 1, -1, MPFR_RNDN);
116   mpfr_acosu (y, x, 0, MPFR_RNDN);
117   if (!mpfr_zero_p (y) || MPFR_SIGN(y) < 0)
118     {
119       printf ("Error: acosu (1/2, 0) != +0\n");
120       printf ("got: "); mpfr_dump (y);
121       exit (1);
122     }
123 
124   /* acosu (1,u) = +0 */
125   mpfr_set_ui (x, 1, MPFR_RNDN);
126   mpfr_acosu (y, x, 1, MPFR_RNDN);
127   if (MPFR_NOTZERO (y) || MPFR_IS_NEG (y))
128     {
129       printf ("Error: acosu(1,1) != +0.0\n");
130       exit (1);
131     }
132 
133   /* acosu (-1,u) = u/2 */
134   RND_LOOP (r)
135     {
136       mpfr_set_si (x, -1, MPFR_RNDN); /* exact */
137       mpfr_acosu (y, x, 17, (mpfr_rnd_t) r);
138       mpfr_set_ui_2exp (x, 17, -1, MPFR_RNDN);
139       if (!mpfr_equal_p (x, y))
140         {
141           printf ("Error: acosu(1,17) != 17/2 for rnd=%s\n",
142                   mpfr_print_rnd_mode ((mpfr_rnd_t) r));
143           exit (1);
144         }
145     }
146 
147   /* acosu (1/2,u) = u/6 */
148   for (u = 1; u < 100; u++)
149      RND_LOOP (r)
150        {
151          mpfr_set_ui_2exp (x, 1, -1, MPFR_RNDN); /* exact */
152          mpfr_acosu (y, x, u, (mpfr_rnd_t) r);
153          inex = mpfr_set_ui (x, u, MPFR_RNDN);
154          MPFR_ASSERTN(inex == 0);
155          inex = mpfr_div_ui (x, x, 6, (mpfr_rnd_t) r);
156          if ((r != MPFR_RNDF || inex == 0) && !mpfr_equal_p (x, y))
157            {
158              printf ("Error: acosu(1/2,u) != u/6 for u=%lu and rnd=%s\n",
159                      u, mpfr_print_rnd_mode ((mpfr_rnd_t) r));
160              printf ("got: "); mpfr_dump (y);
161              exit (1);
162            }
163        }
164 
165   /* acosu (-1/2,u) = u/3 */
166   for (u = 1; u < 100; u++)
167      RND_LOOP (r)
168        {
169          mpfr_set_si_2exp (x, -1, -1, MPFR_RNDN); /* exact */
170          mpfr_acosu (y, x, u, (mpfr_rnd_t) r);
171          inex = mpfr_set_ui (x, u, MPFR_RNDN);
172          MPFR_ASSERTN(inex == 0);
173          inex = mpfr_div_ui (x, x, 3, (mpfr_rnd_t) r);
174          if ((r != MPFR_RNDF || inex == 0) && !mpfr_equal_p (x, y))
175            {
176              printf ("Error: acosu(-1/2,u) != u/3 for u=%lu and rnd=%s\n",
177                      u, mpfr_print_rnd_mode ((mpfr_rnd_t) r));
178              printf ("got: "); mpfr_dump (y);
179              exit (1);
180            }
181        }
182 
183   test_generic (MPFR_PREC_MIN, 100, 100);
184 
185   mpfr_clear (x);
186   mpfr_clear (y);
187 
188   tests_end_mpfr ();
189   return 0;
190 }
191