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