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