xref: /netbsd-src/external/lgpl3/mpfr/dist/tests/tcosh.c (revision e89934bbf778a6d6d6894877c4da59d0c7835b0f)
1 /* Test file for mpfr_cosh.
2 
3 Copyright 2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc.
4 Contributed by the AriC and Caramel 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 http://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 <stdio.h>
24 #include <stdlib.h>
25 
26 #include "mpfr-test.h"
27 
28 #define TEST_FUNCTION mpfr_cosh
29 #define TEST_RANDOM_EMIN -36
30 #define TEST_RANDOM_EMAX 36
31 #include "tgeneric.c"
32 
33 static void
34 special (void)
35 {
36   mpfr_t  x, y;
37   int i;
38 
39   mpfr_init (x);
40   mpfr_init (y);
41 
42   mpfr_set_nan (x);
43   mpfr_cosh (y, x, MPFR_RNDN);
44   if (!mpfr_nan_p (y))
45     {
46       printf ("Error: cosh(NaN) != NaN\n");
47       exit (1);
48     }
49 
50   mpfr_set_inf (x, 1);
51   mpfr_cosh (y, x, MPFR_RNDN);
52   if (!mpfr_inf_p (y) || mpfr_sgn (y) < 0)
53     {
54       printf ("Error: cosh(+Inf) != +Inf\n");
55       exit (1);
56     }
57 
58   mpfr_set_inf (x, -1);
59   mpfr_cosh (y, x, MPFR_RNDN);
60   if (!mpfr_inf_p (y) || mpfr_sgn (y) < 0)
61     {
62       printf ("Error: cosh(-Inf) != +Inf\n");
63       exit (1);
64     }
65 
66   /* cosh(+/-0) = 1 */
67   mpfr_set_ui (x, 0, MPFR_RNDN);
68   mpfr_cosh (y, x, MPFR_RNDN);
69   if (mpfr_cmp_ui (y, 1))
70     {
71       printf ("Error: cosh(+0) != 1\n");
72       exit (1);
73     }
74   mpfr_neg (x, x, MPFR_RNDN);
75   mpfr_cosh (y, x, MPFR_RNDN);
76   if (mpfr_cmp_ui (y, 1))
77     {
78       printf ("Error: cosh(-0) != 1\n");
79       exit (1);
80     }
81 
82   mpfr_set_prec (x, 32);
83   mpfr_set_prec (y, 32);
84 
85   mpfr_set_str_binary (x, "0.1101110111111111001011101000101");
86   mpfr_set_str_binary (y, "1.0110011001110000101100011001001");
87   mpfr_cosh (x, x, MPFR_RNDN);
88   if (mpfr_cmp (x, y))
89     {
90       printf ("Error: mpfr_cosh for prec=32 (1)\n");
91       exit (1);
92     }
93 
94   mpfr_set_str_binary (x, "-0.1110111000011101010111100000101E-1");
95   mpfr_set_str_binary (y, "1.0001110000101111111111100110101");
96   mpfr_cosh (x, x, MPFR_RNDN);
97   if (mpfr_cmp (x, y))
98     {
99       printf ("Error: mpfr_cosh for prec=32 (2)\n");
100       exit (1);
101     }
102 
103   mpfr_set_prec (x, 2);
104   mpfr_clear_flags ();
105   mpfr_set_str_binary (x, "1E1000000000");
106   i = mpfr_cosh (x, x, MPFR_RNDN);
107   MPFR_ASSERTN (MPFR_IS_INF (x) && MPFR_SIGN (x) > 0);
108   MPFR_ASSERTN (mpfr_overflow_p ());
109   MPFR_ASSERTN (i == 1);
110 
111   mpfr_clear_flags ();
112   mpfr_set_str_binary (x, "-1E1000000000");
113   i = mpfr_cosh (x, x, MPFR_RNDN);
114   MPFR_ASSERTN (MPFR_IS_INF (x) && MPFR_SIGN (x) > 0);
115   MPFR_ASSERTN (mpfr_overflow_p () && !mpfr_underflow_p ());
116   MPFR_ASSERTN (i == 1);
117 
118   mpfr_clear_flags ();
119   mpfr_set_str_binary (x, "-1E1000000000");
120   i = mpfr_cosh (x, x, MPFR_RNDD);
121   MPFR_ASSERTN (!MPFR_IS_INF (x) && MPFR_SIGN (x) > 0);
122   MPFR_ASSERTN (mpfr_overflow_p () && !mpfr_underflow_p ());
123   MPFR_ASSERTN (i == -1);
124 
125   mpfr_clear_flags ();
126   mpfr_set_str_binary (x, "-1E1000000000");
127   i = mpfr_cosh (x, x, MPFR_RNDU);
128   MPFR_ASSERTN (MPFR_IS_INF (x) && MPFR_SIGN (x) > 0);
129   MPFR_ASSERTN (mpfr_overflow_p () && !mpfr_underflow_p ());
130   MPFR_ASSERTN (i == 1);
131 
132   mpfr_clear (x);
133   mpfr_clear (y);
134 }
135 
136 static void
137 special_overflow (void)
138 {
139   /* Check for overflow in 3 cases:
140      1. cosh(x) is representable, but not exp(x)
141      2. cosh(x) is not representable in the selected range of exp.
142      3. cosh(x) exp overflow even with the largest range of exp */
143   mpfr_t x, y;
144   mpfr_exp_t emin, emax;
145 
146   emin = mpfr_get_emin ();
147   emax = mpfr_get_emax ();
148 
149   set_emin (-125);
150   set_emax (128);
151 
152   mpfr_init2 (x, 24);
153   mpfr_init2 (y, 24);
154 
155   mpfr_set_str_binary (x, "0.101100100000000000110100E7");
156   mpfr_cosh (y, x, MPFR_RNDN);
157   if (mpfr_cmp_str (y, "0.101010001111001010001110E128", 2, MPFR_RNDN))
158     {
159       printf("Special overflow error 1.\n");
160       mpfr_dump (y);
161       exit (1);
162     }
163 
164   mpfr_set_str_binary (x, "0.101100100000000000110100E8");
165   mpfr_cosh (y, x, MPFR_RNDN);
166   if (!mpfr_inf_p(y))
167     {
168       printf("Special overflow error 2.\n");
169       mpfr_dump (y);
170       exit (1);
171     }
172 
173   set_emin (emin);
174   set_emax (emax);
175 
176   mpfr_set_str_binary (x, "0.101100100000000000110100E1000000");
177   mpfr_cosh (y, x, MPFR_RNDN);
178   if (!mpfr_inf_p(y))
179     {
180       printf("Special overflow error 3.\n");
181       mpfr_dump (y);
182       exit (1);
183     }
184 
185   mpfr_clear (y);
186   mpfr_clear (x);
187 }
188 
189 int
190 main (int argc, char *argv[])
191 {
192   tests_start_mpfr ();
193 
194   special_overflow ();
195   special ();
196 
197   test_generic (2, 100, 100);
198 
199   data_check ("data/cosh", mpfr_cosh, "mpfr_cosh");
200   bad_cases (mpfr_cosh, mpfr_acosh, "mpfr_cosh", 0, 1, 255, 4, 128, 800, 100);
201 
202   tests_end_mpfr ();
203   return 0;
204 }
205