1efee5258Smrg /* Test file for mpfr_coth.
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_coth
26efee5258Smrg #include "tgeneric.c"
27efee5258Smrg
28efee5258Smrg static void
check_specials(void)29efee5258Smrg check_specials (void)
30efee5258Smrg {
31efee5258Smrg mpfr_t x, y;
32efee5258Smrg
33efee5258Smrg mpfr_init2 (x, 123L);
34efee5258Smrg mpfr_init2 (y, 123L);
35efee5258Smrg
36efee5258Smrg mpfr_set_nan (x);
37efee5258Smrg mpfr_coth (y, x, MPFR_RNDN);
38efee5258Smrg if (! mpfr_nan_p (y))
39efee5258Smrg {
40efee5258Smrg printf ("Error: coth(NaN) != NaN\n");
41efee5258Smrg exit (1);
42efee5258Smrg }
43efee5258Smrg
44efee5258Smrg mpfr_set_inf (x, 1);
45efee5258Smrg mpfr_coth (y, x, MPFR_RNDN);
46efee5258Smrg if (mpfr_cmp_ui (y, 1))
47efee5258Smrg {
48efee5258Smrg printf ("Error: coth(Inf) != 1\n");
49efee5258Smrg exit (1);
50efee5258Smrg }
51efee5258Smrg
52efee5258Smrg mpfr_set_inf (x, -1);
53efee5258Smrg mpfr_coth (y, x, MPFR_RNDN);
54efee5258Smrg if (mpfr_cmp_si (y, -1))
55efee5258Smrg {
56efee5258Smrg printf ("Error: coth(-Inf) != -1\n");
57efee5258Smrg exit (1);
58efee5258Smrg }
59efee5258Smrg
60efee5258Smrg /* coth(+/-0) = +/-Inf */
61efee5258Smrg mpfr_set_ui (x, 0, MPFR_RNDN);
62efee5258Smrg mpfr_coth (y, x, MPFR_RNDN);
63299c6f0cSmrg if (! (mpfr_inf_p (y) && MPFR_IS_POS (y)))
64efee5258Smrg {
65efee5258Smrg printf ("Error: coth(+0) != +Inf\n");
66efee5258Smrg exit (1);
67efee5258Smrg }
68efee5258Smrg mpfr_neg (x, x, MPFR_RNDN);
69efee5258Smrg mpfr_coth (y, x, MPFR_RNDN);
70299c6f0cSmrg if (! (mpfr_inf_p (y) && MPFR_IS_NEG (y)))
71efee5258Smrg {
72efee5258Smrg printf ("Error: coth(-0) != -Inf\n");
73efee5258Smrg exit (1);
74efee5258Smrg }
75efee5258Smrg
76efee5258Smrg mpfr_clear (x);
77efee5258Smrg mpfr_clear (y);
78efee5258Smrg }
79efee5258Smrg
80efee5258Smrg static void
check_bugs(void)81efee5258Smrg check_bugs (void)
82efee5258Smrg {
83efee5258Smrg mpfr_t x, y;
84efee5258Smrg
85efee5258Smrg mpfr_init (x);
86efee5258Smrg mpfr_init (y);
87efee5258Smrg
88efee5258Smrg /* bug found by Rob (Sisyphus) on 16 Sep 2005 */
89efee5258Smrg mpfr_set_ui (x, 2, MPFR_RNDN);
90efee5258Smrg mpfr_set_prec (y, 2);
91efee5258Smrg mpfr_coth (y, x, MPFR_RNDN);
92efee5258Smrg if (mpfr_cmp_ui (y, 1))
93efee5258Smrg {
94efee5258Smrg printf ("Error for coth(2), expected 1, got ");
95efee5258Smrg mpfr_dump (y);
96efee5258Smrg exit (1);
97efee5258Smrg }
98efee5258Smrg
99efee5258Smrg mpfr_set_prec (x, 53);
100efee5258Smrg mpfr_set_prec (y, 53);
101efee5258Smrg
102efee5258Smrg mpfr_set_str (x, "18.368400284838550", 10, MPFR_RNDN);
103efee5258Smrg mpfr_set_str (y, "1.0000000000000002", 10, MPFR_RNDN);
104efee5258Smrg mpfr_coth (x, x, MPFR_RNDN);
105efee5258Smrg if (mpfr_cmp (x, y) != 0)
106efee5258Smrg {
107efee5258Smrg printf ("Error for coth(18.368400284838550)\n");
108efee5258Smrg exit (1);
109efee5258Smrg }
110efee5258Smrg
111efee5258Smrg mpfr_set_str (x, "18.714973875118520", 10, MPFR_RNDN);
112efee5258Smrg mpfr_coth (x, x, MPFR_RNDN);
113efee5258Smrg if (mpfr_cmp (x, y) != 0)
114efee5258Smrg {
115efee5258Smrg printf ("Error for coth(18.714973875118520)\n");
116efee5258Smrg exit (1);
117efee5258Smrg }
118efee5258Smrg
119efee5258Smrg mpfr_set_str (x, "18.714973875118524", 10, MPFR_RNDN);
120efee5258Smrg mpfr_coth (x, x, MPFR_RNDN);
121efee5258Smrg if (mpfr_cmp_ui (x, 1) != 0)
122efee5258Smrg {
123efee5258Smrg printf ("Error for coth(18.714973875118524)\n");
124efee5258Smrg exit (1);
125efee5258Smrg }
126efee5258Smrg
127efee5258Smrg mpfr_clear (x);
128efee5258Smrg mpfr_clear (y);
129efee5258Smrg }
130efee5258Smrg
131efee5258Smrg static void
underflowed_cothinf(void)132efee5258Smrg underflowed_cothinf (void)
133efee5258Smrg {
134efee5258Smrg mpfr_t x, y;
135efee5258Smrg int i, inex, rnd, err = 0;
136efee5258Smrg mpfr_exp_t old_emin;
137efee5258Smrg
138efee5258Smrg old_emin = mpfr_get_emin ();
139efee5258Smrg
140efee5258Smrg mpfr_init2 (x, 8);
141efee5258Smrg mpfr_init2 (y, 8);
142efee5258Smrg
143efee5258Smrg for (i = -1; i <= 1; i += 2)
144299c6f0cSmrg RND_LOOP_NO_RNDF (rnd)
145efee5258Smrg {
146efee5258Smrg mpfr_set_inf (x, i);
147efee5258Smrg mpfr_clear_flags ();
148efee5258Smrg set_emin (2); /* 1 is not representable. */
149efee5258Smrg inex = mpfr_coth (x, x, (mpfr_rnd_t) rnd);
150efee5258Smrg set_emin (old_emin);
151efee5258Smrg if (! mpfr_underflow_p ())
152efee5258Smrg {
153efee5258Smrg printf ("Error in underflowed_cothinf (i = %d, rnd = %s):\n"
154efee5258Smrg " The underflow flag is not set.\n",
155efee5258Smrg i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
156efee5258Smrg err = 1;
157efee5258Smrg }
158efee5258Smrg mpfr_set_si (y, (i < 0 && (rnd == MPFR_RNDD || rnd == MPFR_RNDA)) ||
159efee5258Smrg (i > 0 && (rnd == MPFR_RNDU || rnd == MPFR_RNDA))
160efee5258Smrg ? 2 : 0, MPFR_RNDN);
161efee5258Smrg if (i < 0)
162efee5258Smrg mpfr_neg (y, y, MPFR_RNDN);
163efee5258Smrg if (! (mpfr_equal_p (x, y) &&
164efee5258Smrg MPFR_MULT_SIGN (MPFR_SIGN (x), MPFR_SIGN (y)) > 0))
165efee5258Smrg {
166efee5258Smrg printf ("Error in underflowed_cothinf (i = %d, rnd = %s):\n"
167299c6f0cSmrg " Got ", i,
168299c6f0cSmrg mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
169299c6f0cSmrg mpfr_dump (x);
170efee5258Smrg printf (" instead of ");
171299c6f0cSmrg mpfr_dump (y);
172efee5258Smrg err = 1;
173efee5258Smrg }
174efee5258Smrg if ((rnd == MPFR_RNDD ||
175efee5258Smrg (i > 0 && (rnd == MPFR_RNDN || rnd == MPFR_RNDZ))) && inex >= 0)
176efee5258Smrg {
177efee5258Smrg printf ("Error in underflowed_cothinf (i = %d, rnd = %s):\n"
178efee5258Smrg " The inexact value must be negative.\n",
179efee5258Smrg i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
180efee5258Smrg err = 1;
181efee5258Smrg }
182efee5258Smrg if ((rnd == MPFR_RNDU ||
183efee5258Smrg (i < 0 && (rnd == MPFR_RNDN || rnd == MPFR_RNDZ))) && inex <= 0)
184efee5258Smrg {
185efee5258Smrg printf ("Error in underflowed_cothinf (i = %d, rnd = %s):\n"
186efee5258Smrg " The inexact value must be positive.\n",
187efee5258Smrg i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
188efee5258Smrg err = 1;
189efee5258Smrg }
190efee5258Smrg }
191efee5258Smrg
192efee5258Smrg if (err)
193efee5258Smrg exit (1);
194efee5258Smrg mpfr_clear (x);
195efee5258Smrg mpfr_clear (y);
196efee5258Smrg }
197efee5258Smrg
198efee5258Smrg int
main(int argc,char * argv[])199efee5258Smrg main (int argc, char *argv[])
200efee5258Smrg {
201efee5258Smrg tests_start_mpfr ();
202efee5258Smrg
203efee5258Smrg check_specials ();
204efee5258Smrg check_bugs ();
205299c6f0cSmrg test_generic (MPFR_PREC_MIN, 200, 10);
206efee5258Smrg underflowed_cothinf ();
207efee5258Smrg
208efee5258Smrg tests_end_mpfr ();
209efee5258Smrg return 0;
210efee5258Smrg }
211