xref: /netbsd-src/external/lgpl3/mpfr/dist/tests/tacosh.c (revision b757af438b42b93f8c6571f026d8b8ef3eaf5fc9)
1 /* Test file for mpfr_acosh.
2 
3 Copyright 2001, 2002, 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
4 Contributed by the Arenaire and Cacao 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_acosh
29 #define TEST_RANDOM_POS 4
30 #define TEST_RANDOM_EMIN 1
31 #include "tgeneric.c"
32 
33 #define TEST_FUNCTION mpfr_acosh
34 #define TEST_RANDOM_POS 1
35 #define TEST_RANDOM_EMIN MPFR_EMAX_MAX
36 #define TEST_RANDOM_EMAX MPFR_EMAX_MAX
37 #define test_generic test_generic_huge
38 #include "tgeneric.c"
39 
40 static void
41 special (void)
42 {
43   mpfr_t x, y;
44 
45   mpfr_init (x);
46   mpfr_init (y);
47 
48   MPFR_SET_INF(x);
49   mpfr_set_ui (y, 1, MPFR_RNDN);
50   mpfr_acosh (x, y, MPFR_RNDN);
51   if (MPFR_IS_INF(x) || MPFR_IS_NAN(x) )
52     {
53       printf ("Inf flag not clears in acosh!\n");
54       exit (1);
55     }
56   if (mpfr_cmp_ui (x, 0))
57     {
58       printf ("Error: mpfr_acosh(1) <> 0\n");
59       exit (1);
60     }
61 
62   MPFR_SET_NAN(x);
63   mpfr_acosh (x, y, MPFR_RNDN);
64   if (MPFR_IS_NAN(x) || MPFR_IS_INF(x) )
65     {
66       printf ("NAN flag not clears in acosh!\n");
67       exit (1);
68     }
69 
70   mpfr_set_ui (x, 0, MPFR_RNDN);
71   mpfr_acosh (y, x, MPFR_RNDN);
72   if (!mpfr_nan_p (y))
73     {
74       printf ("Error: mpfr_acosh(0) <> NaN\n");
75       exit (1);
76     }
77 
78   mpfr_set_si (x, -1, MPFR_RNDN);
79   mpfr_acosh (y, x, MPFR_RNDN);
80   if (!mpfr_nan_p (y))
81     {
82       printf ("Error: mpfr_acosh(-1) <> NaN\n");
83       exit (1);
84     }
85 
86   MPFR_SET_NAN(x);
87   mpfr_acosh (y, x, MPFR_RNDN);
88   if (!mpfr_nan_p (y))
89     {
90       printf ("Error: mpfr_acosh(NaN) <> NaN\n");
91       exit (1);
92     }
93 
94   mpfr_set_inf (x, 1);
95   mpfr_acosh (y, x, MPFR_RNDN);
96   if (!mpfr_inf_p (y) || mpfr_sgn (y) < 0)
97     {
98       printf ("Error: mpfr_acosh(+Inf) <> +Inf\n");
99       exit (1);
100     }
101 
102   mpfr_set_inf (x, -1);
103   mpfr_acosh (y, x, MPFR_RNDN);
104   if (!mpfr_nan_p (y))
105     {
106       printf ("Error: mpfr_acosh(-Inf) <> NaN\n");
107       exit (1);
108     }
109 
110   mpfr_set_ui (x, 1, MPFR_RNDN);
111   mpfr_div_2exp (x, x, 1, MPFR_RNDN);
112   mpfr_acosh (y, x, MPFR_RNDN);
113   if (!mpfr_nan_p (y))
114     {
115       printf ("Error: mpfr_acosh(1/2) <> NaN\n");
116       exit (1);
117     }
118 
119   mpfr_set_prec (x, 32);
120   mpfr_set_prec (y, 32);
121   mpfr_set_str_binary (x, "1.000001101011101111001011");
122   mpfr_acosh (y, x, MPFR_RNDN);
123   mpfr_set_str_binary (x, "0.111010100101101001010001101001E-2");
124   if (mpfr_cmp (x, y))
125     {
126       printf ("Error: mpfr_acosh (1)\n");
127       exit (1);
128     }
129 
130   mpfr_clear (x);
131   mpfr_clear (y);
132 }
133 
134 /* With MPFR 2.3.0, this yields an assertion failure in mpfr_acosh. */
135 static void
136 bug20070831 (void)
137 {
138   mpfr_t x, y, z;
139   int inex;
140 
141   mpfr_init2 (x, 256);
142   mpfr_init2 (y, 32);
143   mpfr_init2 (z, 32);
144 
145   mpfr_set_ui (x, 1, MPFR_RNDN);
146   mpfr_nextabove (x);
147   inex = mpfr_acosh (y, x, MPFR_RNDZ);
148   mpfr_set_ui_2exp (z, 1, -127, MPFR_RNDN);
149   mpfr_nextbelow (z);
150   if (!mpfr_equal_p (y, z))
151     {
152       printf ("Error in bug20070831 (1):\nexpected ");
153       mpfr_dump (z);
154       printf ("got      ");
155       mpfr_dump (y);
156       exit (1);
157     }
158   MPFR_ASSERTN (inex < 0);
159 
160   mpfr_nextabove (x);
161   mpfr_set_prec (y, 29);
162   inex = mpfr_acosh (y, x, MPFR_RNDN);
163   mpfr_set_str_binary (z, "1.011010100000100111100110011E-127");
164   if (!mpfr_equal_p (y, z))
165     {
166       printf ("Error in bug20070831 (2):\nexpected ");
167       mpfr_dump (z);
168       printf ("got      ");
169       mpfr_dump (y);
170       exit (1);
171     }
172   MPFR_ASSERTN (inex < 0);
173 
174   mpfr_clears (x, y, z, (mpfr_ptr) 0);
175 }
176 
177 static void
178 huge (void)
179 {
180   mpfr_t x, y, z;
181   int inex;
182 
183   /* TODO: extend the exponent range and use mpfr_get_emax (). */
184   mpfr_inits2 (32, x, y, z, (mpfr_ptr) 0);
185   mpfr_set_ui_2exp (x, 1, 1073741822, MPFR_RNDN);
186   inex = mpfr_acosh (y, x, MPFR_RNDN);
187   mpfr_set_str_binary (z, "0.10110001011100100001011111110101E30");
188   if (!mpfr_equal_p (y, z))
189     {
190       printf ("Error in huge:\nexpected ");
191       mpfr_dump (z);
192       printf ("got      ");
193       mpfr_dump (y);
194       exit (1);
195     }
196   MPFR_ASSERTN (inex < 0);
197 
198   mpfr_clears (x, y, z, (mpfr_ptr) 0);
199 }
200 
201 int
202 main (int argc, char *argv[])
203 {
204   tests_start_mpfr ();
205 
206   special ();
207   bug20070831 ();
208   huge ();
209 
210   test_generic (2, 100, 25);
211   test_generic_huge (2, 100, 5);
212 
213   data_check ("data/acosh", mpfr_acosh, "mpfr_acosh");
214   bad_cases (mpfr_acosh, mpfr_cosh, "mpfr_acosh", 0, -128, 29,
215              4, 128, 800, 40);
216 
217   tests_end_mpfr ();
218   return 0;
219 }
220