1efee5258Smrg /* Test file for mpfr_cot.
2efee5258Smrg
3*ba125506Smrg Copyright 2005-2023 Free Software Foundation, Inc.
4efdec83bSmrg Contributed by the AriC and Caramba projects, INRIA.
5efee5258Smrg
6efee5258Smrg This file is part of the GNU MPFR Library.
7efee5258Smrg
8efee5258Smrg The GNU MPFR Library is free software; you can redistribute it and/or modify
9efee5258Smrg it under the terms of the GNU Lesser General Public License as published by
10efee5258Smrg the Free Software Foundation; either version 3 of the License, or (at your
11efee5258Smrg option) any later version.
12efee5258Smrg
13efee5258Smrg The GNU MPFR Library is distributed in the hope that it will be useful, but
14efee5258Smrg WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15efee5258Smrg or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
16efee5258Smrg License for more details.
17efee5258Smrg
18efee5258Smrg You should have received a copy of the GNU Lesser General Public License
19efee5258Smrg along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see
202ba2404bSmrg https://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
21efee5258Smrg 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
22efee5258Smrg
23efee5258Smrg #include "mpfr-test.h"
24efee5258Smrg
25efee5258Smrg #define TEST_FUNCTION mpfr_cot
26efee5258Smrg #define REDUCE_EMAX 262143 /* otherwise arg. reduction is too expensive */
27efee5258Smrg #include "tgeneric.c"
28efee5258Smrg
29efee5258Smrg static void
check_specials(void)30efee5258Smrg check_specials (void)
31efee5258Smrg {
32efee5258Smrg mpfr_t x, y;
33efee5258Smrg
34efee5258Smrg mpfr_init2 (x, 123L);
35efee5258Smrg mpfr_init2 (y, 123L);
36efee5258Smrg
37efee5258Smrg mpfr_set_nan (x);
38efee5258Smrg mpfr_cot (y, x, MPFR_RNDN);
39efee5258Smrg if (! mpfr_nan_p (y))
40efee5258Smrg {
41efee5258Smrg printf ("Error: cot(NaN) != NaN\n");
42efee5258Smrg exit (1);
43efee5258Smrg }
44efee5258Smrg
45efee5258Smrg mpfr_set_inf (x, 1);
46efee5258Smrg mpfr_cot (y, x, MPFR_RNDN);
47efee5258Smrg if (! mpfr_nan_p (y))
48efee5258Smrg {
49efee5258Smrg printf ("Error: cot(Inf) != NaN\n");
50efee5258Smrg exit (1);
51efee5258Smrg }
52efee5258Smrg
53efee5258Smrg mpfr_set_inf (x, -1);
54efee5258Smrg mpfr_cot (y, x, MPFR_RNDN);
55efee5258Smrg if (! mpfr_nan_p (y))
56efee5258Smrg {
57efee5258Smrg printf ("Error: cot(-Inf) != NaN\n");
58efee5258Smrg exit (1);
59efee5258Smrg }
60efee5258Smrg
61efee5258Smrg /* cot(+/-0) = +/-Inf */
62efee5258Smrg mpfr_set_ui (x, 0, MPFR_RNDN);
63efee5258Smrg mpfr_cot (y, x, MPFR_RNDN);
64efee5258Smrg if (! (mpfr_inf_p (y) && mpfr_sgn (y) > 0))
65efee5258Smrg {
66efee5258Smrg printf ("Error: cot(+0) != +Inf\n");
67efee5258Smrg exit (1);
68efee5258Smrg }
69efee5258Smrg mpfr_neg (x, x, MPFR_RNDN);
70efee5258Smrg mpfr_cot (y, x, MPFR_RNDN);
71efee5258Smrg if (! (mpfr_inf_p (y) && mpfr_sgn (y) < 0))
72efee5258Smrg {
73efee5258Smrg printf ("Error: cot(-0) != -Inf\n");
74efee5258Smrg exit (1);
75efee5258Smrg }
76efee5258Smrg
77efee5258Smrg mpfr_clear (x);
78efee5258Smrg mpfr_clear (y);
79efee5258Smrg }
80efee5258Smrg
81efee5258Smrg static void
two2emin(mpfr_exp_t e)82efee5258Smrg two2emin (mpfr_exp_t e)
83efee5258Smrg {
84efee5258Smrg mpfr_exp_t old_emin, old_emax;
85efee5258Smrg mpfr_t x, y;
86efee5258Smrg int i, rnd;
87efee5258Smrg
88efee5258Smrg old_emin = mpfr_get_emin ();
89efee5258Smrg old_emax = mpfr_get_emax ();
90efee5258Smrg
91*ba125506Smrg set_emin (-e);
92*ba125506Smrg set_emax (e);
93efee5258Smrg
94efee5258Smrg mpfr_inits2 (53, x, y, (mpfr_ptr) 0);
95efee5258Smrg for (i = -4; i <= 4; i++)
96efee5258Smrg RND_LOOP (rnd)
97efee5258Smrg {
98efee5258Smrg mpfr_set_si (y, i, MPFR_RNDN);
99efee5258Smrg mpfr_ui_div (y, 1, y, (mpfr_rnd_t) rnd); /* no overflow/underflow */
100efee5258Smrg mpfr_set_si_2exp (x, i, -e, MPFR_RNDN);
101efee5258Smrg if (ABS (i) != 3) /* not a power of 2 (not 0 either) */
102efee5258Smrg mpfr_sub (y, y, x, (mpfr_rnd_t) rnd); /* no overflow/underflow */
103efee5258Smrg mpfr_set_ui_2exp (x, 1, -e, MPFR_RNDN);
104efee5258Smrg mpfr_div (y, y, x, (mpfr_rnd_t) rnd); /* 1/x - SIGN(x).epsilon */
105efee5258Smrg mpfr_set_si_2exp (x, i, -e, MPFR_RNDN);
106efee5258Smrg mpfr_cot (x, x, (mpfr_rnd_t) rnd);
107299c6f0cSmrg if (! mpfr_equal_p (x, y) && rnd != MPFR_RNDF)
108efee5258Smrg {
109efee5258Smrg printf ("Error in two2emin for i = %d and rnd = %s\n",
110efee5258Smrg i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
111efee5258Smrg printf ("Got ");
112efee5258Smrg mpfr_dump (x);
113efee5258Smrg printf ("instead of ");
114efee5258Smrg mpfr_dump (y);
115efee5258Smrg exit (1);
116efee5258Smrg }
117efee5258Smrg }
118efee5258Smrg mpfr_clears (x, y, (mpfr_ptr) 0);
119efee5258Smrg
120*ba125506Smrg set_emin (old_emin);
121*ba125506Smrg set_emax (old_emax);
122efee5258Smrg }
123efee5258Smrg
124efee5258Smrg int
main(int argc,char * argv[])125efee5258Smrg main (int argc, char *argv[])
126efee5258Smrg {
127efee5258Smrg tests_start_mpfr ();
128efee5258Smrg
129efee5258Smrg check_specials ();
130efee5258Smrg two2emin (256);
131efee5258Smrg two2emin (MPFR_EMAX_DEFAULT);
132efee5258Smrg if (MPFR_EMAX_MAX != MPFR_EMAX_DEFAULT)
133efee5258Smrg two2emin (MPFR_EMAX_MAX);
134299c6f0cSmrg test_generic (MPFR_PREC_MIN, 200, 5);
135efee5258Smrg
136efee5258Smrg tests_end_mpfr ();
137efee5258Smrg return 0;
138efee5258Smrg }
139