xref: /netbsd-src/external/lgpl3/mpfr/dist/tests/tcoth.c (revision ba125506a622fe649968631a56eba5d42ff57863)
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