1251881Speter/* Test file for mpfr_coth.
2251881Speter
3251881SpeterCopyright 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
4251881SpeterContributed by the Arenaire and Cacao projects, INRIA.
5251881Speter
6251881SpeterThis file is part of the GNU MPFR Library.
7251881Speter
8251881SpeterThe GNU MPFR Library is free software; you can redistribute it and/or modify
9251881Speterit under the terms of the GNU Lesser General Public License as published by
10251881Speterthe Free Software Foundation; either version 3 of the License, or (at your
11251881Speteroption) any later version.
12251881Speter
13251881SpeterThe GNU MPFR Library is distributed in the hope that it will be useful, but
14251881SpeterWITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15251881Speteror FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
16251881SpeterLicense for more details.
17251881Speter
18251881SpeterYou should have received a copy of the GNU Lesser General Public License
19251881Speteralong with the GNU MPFR Library; see the file COPYING.LESSER.  If not, see
20251881Speterhttp://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
21251881Speter51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
22251881Speter
23251881Speter#include <stdio.h>
24251881Speter#include <stdlib.h>
25251881Speter
26251881Speter#include "mpfr-test.h"
27251881Speter
28251881Speter#define TEST_FUNCTION mpfr_coth
29251881Speter#include "tgeneric.c"
30251881Speter
31251881Speterstatic void
32251881Spetercheck_specials (void)
33251881Speter{
34251881Speter  mpfr_t  x, y;
35251881Speter
36251881Speter  mpfr_init2 (x, 123L);
37251881Speter  mpfr_init2 (y, 123L);
38251881Speter
39251881Speter  mpfr_set_nan (x);
40251881Speter  mpfr_coth (y, x, MPFR_RNDN);
41251881Speter  if (! mpfr_nan_p (y))
42251881Speter    {
43251881Speter      printf ("Error: coth(NaN) != NaN\n");
44251881Speter      exit (1);
45251881Speter    }
46251881Speter
47251881Speter  mpfr_set_inf (x, 1);
48251881Speter  mpfr_coth (y, x, MPFR_RNDN);
49251881Speter  if (mpfr_cmp_ui (y, 1))
50251881Speter    {
51251881Speter      printf ("Error: coth(Inf) != 1\n");
52251881Speter      exit (1);
53251881Speter    }
54251881Speter
55251881Speter  mpfr_set_inf (x, -1);
56251881Speter  mpfr_coth (y, x, MPFR_RNDN);
57251881Speter  if (mpfr_cmp_si (y, -1))
58251881Speter    {
59251881Speter      printf ("Error: coth(-Inf) != -1\n");
60251881Speter      exit (1);
61251881Speter    }
62251881Speter
63251881Speter  /* coth(+/-0) = +/-Inf */
64251881Speter  mpfr_set_ui (x, 0, MPFR_RNDN);
65251881Speter  mpfr_coth (y, x, MPFR_RNDN);
66251881Speter  if (! (mpfr_inf_p (y) && MPFR_SIGN (y) > 0))
67251881Speter    {
68251881Speter      printf ("Error: coth(+0) != +Inf\n");
69251881Speter      exit (1);
70251881Speter    }
71251881Speter  mpfr_neg (x, x, MPFR_RNDN);
72251881Speter  mpfr_coth (y, x, MPFR_RNDN);
73251881Speter  if (! (mpfr_inf_p (y) && MPFR_SIGN (y) < 0))
74251881Speter    {
75251881Speter      printf ("Error: coth(-0) != -Inf\n");
76251881Speter      exit (1);
77251881Speter    }
78251881Speter
79251881Speter  mpfr_clear (x);
80251881Speter  mpfr_clear (y);
81251881Speter}
82251881Speter
83251881Speterstatic void
84251881Spetercheck_bugs (void)
85251881Speter{
86251881Speter  mpfr_t x, y;
87251881Speter
88251881Speter  mpfr_init (x);
89251881Speter  mpfr_init (y);
90251881Speter
91251881Speter  /* bug found by Rob (Sisyphus) on 16 Sep 2005 */
92251881Speter  mpfr_set_ui (x, 2, MPFR_RNDN);
93251881Speter  mpfr_set_prec (y, 2);
94251881Speter  mpfr_coth (y, x, MPFR_RNDN);
95251881Speter  if (mpfr_cmp_ui (y, 1))
96251881Speter    {
97251881Speter      printf ("Error for coth(2), expected 1, got ");
98251881Speter      mpfr_dump (y);
99251881Speter      exit (1);
100251881Speter    }
101251881Speter
102251881Speter  mpfr_set_prec (x, 53);
103251881Speter  mpfr_set_prec (y, 53);
104251881Speter
105251881Speter  mpfr_set_str (x, "18.368400284838550", 10, MPFR_RNDN);
106251881Speter  mpfr_set_str (y, "1.0000000000000002", 10, MPFR_RNDN);
107251881Speter  mpfr_coth (x, x, MPFR_RNDN);
108251881Speter  if (mpfr_cmp (x, y) != 0)
109251881Speter    {
110251881Speter      printf ("Error for coth(18.368400284838550)\n");
111251881Speter      exit (1);
112251881Speter    }
113251881Speter
114251881Speter  mpfr_set_str (x, "18.714973875118520", 10, MPFR_RNDN);
115251881Speter  mpfr_coth (x, x, MPFR_RNDN);
116251881Speter  if (mpfr_cmp (x, y) != 0)
117251881Speter    {
118251881Speter      printf ("Error for coth(18.714973875118520)\n");
119251881Speter      exit (1);
120251881Speter    }
121251881Speter
122251881Speter  mpfr_set_str (x, "18.714973875118524", 10, MPFR_RNDN);
123251881Speter  mpfr_coth (x, x, MPFR_RNDN);
124251881Speter  if (mpfr_cmp_ui (x, 1) != 0)
125251881Speter    {
126251881Speter      printf ("Error for coth(18.714973875118524)\n");
127251881Speter      exit (1);
128251881Speter    }
129251881Speter
130251881Speter  mpfr_clear (x);
131251881Speter  mpfr_clear (y);
132251881Speter}
133251881Speter
134251881Speterstatic void
135251881Speterunderflowed_cothinf (void)
136251881Speter{
137251881Speter  mpfr_t x, y;
138251881Speter  int i, inex, rnd, err = 0;
139251881Speter  mpfr_exp_t old_emin;
140251881Speter
141251881Speter  old_emin = mpfr_get_emin ();
142251881Speter
143251881Speter  mpfr_init2 (x, 8);
144251881Speter  mpfr_init2 (y, 8);
145251881Speter
146251881Speter  for (i = -1; i <= 1; i += 2)
147251881Speter    RND_LOOP (rnd)
148251881Speter      {
149251881Speter        mpfr_set_inf (x, i);
150251881Speter        mpfr_clear_flags ();
151251881Speter        set_emin (2);  /* 1 is not representable. */
152251881Speter        inex = mpfr_coth (x, x, (mpfr_rnd_t) rnd);
153251881Speter        set_emin (old_emin);
154251881Speter        if (! mpfr_underflow_p ())
155251881Speter          {
156251881Speter            printf ("Error in underflowed_cothinf (i = %d, rnd = %s):\n"
157251881Speter                    "  The underflow flag is not set.\n",
158251881Speter                    i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
159251881Speter            err = 1;
160251881Speter          }
161251881Speter        mpfr_set_si (y, (i < 0 && (rnd == MPFR_RNDD || rnd == MPFR_RNDA)) ||
162251881Speter                        (i > 0 && (rnd == MPFR_RNDU || rnd == MPFR_RNDA))
163251881Speter                     ? 2 : 0, MPFR_RNDN);
164251881Speter        if (i < 0)
165251881Speter          mpfr_neg (y, y, MPFR_RNDN);
166251881Speter        if (! (mpfr_equal_p (x, y) &&
167251881Speter               MPFR_MULT_SIGN (MPFR_SIGN (x), MPFR_SIGN (y)) > 0))
168251881Speter          {
169251881Speter            printf ("Error in underflowed_cothinf (i = %d, rnd = %s):\n"
170251881Speter                    "  Got ", i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
171251881Speter            mpfr_print_binary (x);
172251881Speter            printf (" instead of ");
173251881Speter            mpfr_print_binary (y);
174251881Speter            printf (".\n");
175251881Speter            err = 1;
176251881Speter          }
177251881Speter        if ((rnd == MPFR_RNDD ||
178251881Speter             (i > 0 && (rnd == MPFR_RNDN || rnd == MPFR_RNDZ))) && inex >= 0)
179251881Speter          {
180251881Speter            printf ("Error in underflowed_cothinf (i = %d, rnd = %s):\n"
181251881Speter                    "  The inexact value must be negative.\n",
182251881Speter                    i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
183251881Speter            err = 1;
184251881Speter          }
185251881Speter        if ((rnd == MPFR_RNDU ||
186251881Speter             (i < 0 && (rnd == MPFR_RNDN || rnd == MPFR_RNDZ))) && inex <= 0)
187251881Speter          {
188251881Speter            printf ("Error in underflowed_cothinf (i = %d, rnd = %s):\n"
189251881Speter                    "  The inexact value must be positive.\n",
190251881Speter                    i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
191251881Speter            err = 1;
192251881Speter          }
193251881Speter      }
194251881Speter
195251881Speter  if (err)
196251881Speter    exit (1);
197251881Speter  mpfr_clear (x);
198251881Speter  mpfr_clear (y);
199251881Speter}
200251881Speter
201251881Speterint
202251881Spetermain (int argc, char *argv[])
203251881Speter{
204251881Speter  tests_start_mpfr ();
205251881Speter
206251881Speter  check_specials ();
207251881Speter  check_bugs ();
208251881Speter  test_generic (2, 200, 10);
209251881Speter  underflowed_cothinf ();
210251881Speter
211251881Speter  tests_end_mpfr ();
212251881Speter  return 0;
213251881Speter}
214251881Speter