tjn.c revision 1.1.1.5 1 1.1 mrg /* tjn -- test file for the Bessel function of first kind
2 1.1 mrg
3 1.1.1.5 mrg Copyright 2007-2020 Free Software Foundation, Inc.
4 1.1.1.3 mrg Contributed by the AriC and Caramba projects, INRIA.
5 1.1 mrg
6 1.1 mrg This file is part of the GNU MPFR Library.
7 1.1 mrg
8 1.1 mrg The GNU MPFR Library is free software; you can redistribute it and/or modify
9 1.1 mrg it under the terms of the GNU Lesser General Public License as published by
10 1.1 mrg the Free Software Foundation; either version 3 of the License, or (at your
11 1.1 mrg option) any later version.
12 1.1 mrg
13 1.1 mrg The GNU MPFR Library is distributed in the hope that it will be useful, but
14 1.1 mrg WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 1.1 mrg or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
16 1.1 mrg License for more details.
17 1.1 mrg
18 1.1 mrg You should have received a copy of the GNU Lesser General Public License
19 1.1 mrg along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see
20 1.1.1.5 mrg https://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
21 1.1 mrg 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
22 1.1 mrg
23 1.1 mrg #include "mpfr-test.h"
24 1.1 mrg
25 1.1.1.5 mrg /* mpfr_jn doesn't terminate. Bug reported by Alex Coplan on 2020-07-03.
26 1.1.1.5 mrg * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96044
27 1.1.1.5 mrg * Note: This test is enabled only with MPFR_CHECK_EXPENSIVE. But do not
28 1.1.1.5 mrg * use that with --enable-assert=full, as it may take more than 1 hour!
29 1.1.1.5 mrg */
30 1.1.1.5 mrg static void
31 1.1.1.5 mrg bug20200703 (void)
32 1.1.1.5 mrg {
33 1.1.1.5 mrg mpfr_t x, y;
34 1.1.1.5 mrg
35 1.1.1.5 mrg mpfr_init (x);
36 1.1.1.5 mrg mpfr_init (y);
37 1.1.1.5 mrg mpfr_set_si (x, 73333, MPFR_RNDN);
38 1.1.1.5 mrg mpfr_jn (y, 73333, x, MPFR_RNDN);
39 1.1.1.5 mrg mpfr_set_si (x, 733333, MPFR_RNDN);
40 1.1.1.5 mrg mpfr_jn (y, 733333, x, MPFR_RNDN);
41 1.1.1.5 mrg mpfr_clear (x);
42 1.1.1.5 mrg mpfr_clear (y);
43 1.1.1.5 mrg }
44 1.1.1.5 mrg
45 1.1 mrg int
46 1.1 mrg main (int argc, char *argv[])
47 1.1 mrg {
48 1.1 mrg mpfr_t x, y;
49 1.1 mrg long n;
50 1.1 mrg
51 1.1 mrg if (argc > 1)
52 1.1 mrg {
53 1.1 mrg mpfr_init2 (x, atoi (argv[1]));
54 1.1 mrg mpfr_set_str (x, argv[3], 10, MPFR_RNDN);
55 1.1 mrg mpfr_jn (x, atoi (argv[2]), x, MPFR_RNDN);
56 1.1 mrg mpfr_out_str (stdout, 10, 10, x, MPFR_RNDN);
57 1.1 mrg printf ("\n");
58 1.1 mrg mpfr_clear (x);
59 1.1 mrg return 0;
60 1.1 mrg }
61 1.1 mrg
62 1.1 mrg tests_start_mpfr ();
63 1.1 mrg
64 1.1.1.5 mrg if (getenv ("MPFR_CHECK_EXPENSIVE") != NULL)
65 1.1.1.5 mrg bug20200703 ();
66 1.1.1.5 mrg
67 1.1 mrg mpfr_init (x);
68 1.1 mrg mpfr_init (y);
69 1.1 mrg
70 1.1 mrg /* special values */
71 1.1 mrg mpfr_set_nan (x);
72 1.1 mrg mpfr_jn (y, 17, x, MPFR_RNDN);
73 1.1 mrg MPFR_ASSERTN(mpfr_nan_p (y));
74 1.1 mrg
75 1.1 mrg mpfr_set_inf (x, 1); /* +Inf */
76 1.1 mrg mpfr_jn (y, 17, x, MPFR_RNDN);
77 1.1 mrg MPFR_ASSERTN(mpfr_cmp_ui (y, 0) == 0 && MPFR_IS_POS (y));
78 1.1 mrg
79 1.1 mrg mpfr_set_inf (x, -1); /* -Inf */
80 1.1 mrg mpfr_jn (y, 17, x, MPFR_RNDN);
81 1.1 mrg MPFR_ASSERTN(mpfr_cmp_ui (y, 0) == 0 && MPFR_IS_POS (y));
82 1.1 mrg
83 1.1 mrg mpfr_set_ui (x, 0, MPFR_RNDN); /* +0 */
84 1.1 mrg mpfr_jn (y, 0, x, MPFR_RNDN);
85 1.1 mrg MPFR_ASSERTN(mpfr_cmp_ui (y, 1) == 0); /* j0(+0)=1 */
86 1.1 mrg mpfr_jn (y, 17, x, MPFR_RNDN);
87 1.1 mrg MPFR_ASSERTN(mpfr_cmp_ui (y, 0) == 0 && MPFR_IS_POS (y)); /* j17(+0)=+0 */
88 1.1 mrg mpfr_jn (y, -17, x, MPFR_RNDN);
89 1.1 mrg MPFR_ASSERTN(mpfr_cmp_ui (y, 0) == 0 && MPFR_IS_NEG (y)); /* j-17(+0)=-0 */
90 1.1 mrg mpfr_jn (y, 42, x, MPFR_RNDN);
91 1.1 mrg MPFR_ASSERTN(mpfr_cmp_ui (y, 0) == 0 && MPFR_IS_POS (y)); /* j42(+0)=+0 */
92 1.1 mrg
93 1.1 mrg mpfr_set_ui (x, 0, MPFR_RNDN);
94 1.1 mrg mpfr_neg (x, x, MPFR_RNDN); /* -0 */
95 1.1 mrg mpfr_jn (y, 0, x, MPFR_RNDN);
96 1.1 mrg MPFR_ASSERTN(mpfr_cmp_ui (y, 1) == 0); /* j0(-0)=1 */
97 1.1 mrg mpfr_jn (y, 17, x, MPFR_RNDN);
98 1.1 mrg MPFR_ASSERTN(mpfr_cmp_ui (y, 0) == 0 && MPFR_IS_NEG (y)); /* j17(-0)=-0 */
99 1.1 mrg mpfr_jn (y, -17, x, MPFR_RNDN);
100 1.1 mrg MPFR_ASSERTN(mpfr_cmp_ui (y, 0) == 0 && MPFR_IS_POS (y)); /* j-17(-0)=+0 */
101 1.1 mrg mpfr_jn (y, 42, x, MPFR_RNDN);
102 1.1 mrg MPFR_ASSERTN(mpfr_cmp_ui (y, 0) == 0 && MPFR_IS_POS (y)); /* j42(-0)=+0 */
103 1.1 mrg
104 1.1 mrg mpfr_set_prec (x, 53);
105 1.1 mrg mpfr_set_prec (y, 53);
106 1.1 mrg
107 1.1 mrg mpfr_set_ui (x, 1, MPFR_RNDN);
108 1.1 mrg mpfr_jn (y, 0, x, MPFR_RNDN);
109 1.1 mrg mpfr_set_str_binary (x, "0.1100001111100011111111101101111010111101110001111");
110 1.1 mrg if (mpfr_cmp (x, y))
111 1.1 mrg {
112 1.1 mrg printf ("Error in mpfr_jn for n=0, x=1, rnd=MPFR_RNDN\n");
113 1.1 mrg printf ("Expected "); mpfr_dump (x);
114 1.1 mrg printf ("Got "); mpfr_dump (y);
115 1.1 mrg exit (1);
116 1.1 mrg }
117 1.1 mrg
118 1.1 mrg mpfr_set_si (x, -1, MPFR_RNDN);
119 1.1 mrg mpfr_jn (y, 0, x, MPFR_RNDN);
120 1.1 mrg mpfr_set_str_binary (x, "0.1100001111100011111111101101111010111101110001111");
121 1.1 mrg if (mpfr_cmp (x, y))
122 1.1 mrg {
123 1.1 mrg printf ("Error in mpfr_jn for n=0, x=-1, rnd=MPFR_RNDN\n");
124 1.1 mrg printf ("Expected "); mpfr_dump (x);
125 1.1 mrg printf ("Got "); mpfr_dump (y);
126 1.1 mrg exit (1);
127 1.1 mrg }
128 1.1 mrg
129 1.1 mrg mpfr_set_ui (x, 1, MPFR_RNDN);
130 1.1 mrg mpfr_jn (y, 1, x, MPFR_RNDN);
131 1.1 mrg mpfr_set_str_binary (x, "0.0111000010100111001001111011101001011100001100011011");
132 1.1 mrg if (mpfr_cmp (x, y))
133 1.1 mrg {
134 1.1 mrg printf ("Error in mpfr_jn for n=1, x=1, rnd=MPFR_RNDN\n");
135 1.1 mrg printf ("Expected "); mpfr_dump (x);
136 1.1 mrg printf ("Got "); mpfr_dump (y);
137 1.1 mrg exit (1);
138 1.1 mrg }
139 1.1 mrg
140 1.1 mrg mpfr_set_ui (x, 1, MPFR_RNDN);
141 1.1 mrg mpfr_jn (y, 17, x, MPFR_RNDN);
142 1.1 mrg mpfr_set_str_binary (x, "0.1100011111001010101001001001000110110000010001011E-65");
143 1.1 mrg if (mpfr_cmp (x, y))
144 1.1 mrg {
145 1.1 mrg printf ("Error in mpfr_jn for n=17, x=1, rnd=MPFR_RNDN\n");
146 1.1 mrg printf ("Expected "); mpfr_dump (x);
147 1.1 mrg printf ("Got "); mpfr_dump (y);
148 1.1 mrg exit (1);
149 1.1 mrg }
150 1.1 mrg
151 1.1 mrg mpfr_set_ui (x, 1, MPFR_RNDN);
152 1.1 mrg mpfr_jn (y, 42, x, MPFR_RNDN);
153 1.1 mrg mpfr_set_str_binary (x, "0.10000111100011010100111011100111101101000100000001001E-211");
154 1.1 mrg if (mpfr_cmp (x, y))
155 1.1 mrg {
156 1.1 mrg printf ("Error in mpfr_jn for n=42, x=1, rnd=MPFR_RNDN\n");
157 1.1 mrg printf ("Expected "); mpfr_dump (x);
158 1.1 mrg printf ("Got "); mpfr_dump (y);
159 1.1 mrg exit (1);
160 1.1 mrg }
161 1.1 mrg
162 1.1 mrg mpfr_set_ui (x, 1, MPFR_RNDN);
163 1.1 mrg mpfr_jn (y, -42, x, MPFR_RNDN);
164 1.1 mrg mpfr_set_str_binary (x, "0.10000111100011010100111011100111101101000100000001001E-211");
165 1.1 mrg if (mpfr_cmp (x, y))
166 1.1 mrg {
167 1.1 mrg printf ("Error in mpfr_jn for n=-42, x=1, rnd=MPFR_RNDN\n");
168 1.1 mrg printf ("Expected "); mpfr_dump (x);
169 1.1 mrg printf ("Got "); mpfr_dump (y);
170 1.1 mrg exit (1);
171 1.1 mrg }
172 1.1 mrg
173 1.1 mrg mpfr_set_si (x, -1, MPFR_RNDN);
174 1.1 mrg mpfr_jn (y, 42, x, MPFR_RNDN);
175 1.1 mrg mpfr_set_str_binary (x, "0.10000111100011010100111011100111101101000100000001001E-211");
176 1.1 mrg if (mpfr_cmp (x, y))
177 1.1 mrg {
178 1.1 mrg printf ("Error in mpfr_jn for n=42, x=-1, rnd=MPFR_RNDN\n");
179 1.1 mrg printf ("Expected "); mpfr_dump (x);
180 1.1 mrg printf ("Got "); mpfr_dump (y);
181 1.1 mrg exit (1);
182 1.1 mrg }
183 1.1 mrg
184 1.1 mrg mpfr_set_si (x, -1, MPFR_RNDN);
185 1.1 mrg mpfr_jn (y, -42, x, MPFR_RNDN);
186 1.1 mrg mpfr_set_str_binary (x, "0.10000111100011010100111011100111101101000100000001001E-211");
187 1.1 mrg if (mpfr_cmp (x, y))
188 1.1 mrg {
189 1.1 mrg printf ("Error in mpfr_jn for n=-42, x=-1, rnd=MPFR_RNDN\n");
190 1.1 mrg printf ("Expected "); mpfr_dump (x);
191 1.1 mrg printf ("Got "); mpfr_dump (y);
192 1.1 mrg exit (1);
193 1.1 mrg }
194 1.1 mrg
195 1.1 mrg mpfr_set_ui (x, 17, MPFR_RNDN);
196 1.1 mrg mpfr_jn (y, 4, x, MPFR_RNDN);
197 1.1 mrg mpfr_set_str_binary (x, "-0.0001110001011001100010100111100111100000111110111011111");
198 1.1 mrg if (mpfr_cmp (x, y))
199 1.1 mrg {
200 1.1 mrg printf ("Error in mpfr_jn for n=4, x=17, rnd=MPFR_RNDN\n");
201 1.1 mrg printf ("Expected "); mpfr_dump (x);
202 1.1 mrg printf ("Got "); mpfr_dump (y);
203 1.1 mrg exit (1);
204 1.1 mrg }
205 1.1 mrg
206 1.1 mrg mpfr_set_ui (x, 17, MPFR_RNDN);
207 1.1 mrg mpfr_jn (y, 16, x, MPFR_RNDN);
208 1.1 mrg mpfr_set_str_binary (x, "0.0011101111100111101111010100000111111001111001001010011");
209 1.1 mrg if (mpfr_cmp (x, y))
210 1.1 mrg {
211 1.1 mrg printf ("Error in mpfr_jn for n=16, x=17, rnd=MPFR_RNDN\n");
212 1.1 mrg printf ("Expected "); mpfr_dump (x);
213 1.1 mrg printf ("Got "); mpfr_dump (y);
214 1.1 mrg exit (1);
215 1.1 mrg }
216 1.1 mrg
217 1.1 mrg mpfr_set_ui (x, 17, MPFR_RNDN);
218 1.1 mrg mpfr_jn (y, 256, x, MPFR_RNDN);
219 1.1 mrg mpfr_set_str_binary (x, "0.11111101111100110000000010111101101011101011110001011E-894");
220 1.1 mrg if (mpfr_cmp (x, y))
221 1.1 mrg {
222 1.1 mrg printf ("Error in mpfr_jn for n=256, x=17, rnd=MPFR_RNDN\n");
223 1.1 mrg printf ("Expected "); mpfr_dump (x);
224 1.1 mrg printf ("Got "); mpfr_dump (y);
225 1.1 mrg exit (1);
226 1.1 mrg }
227 1.1 mrg
228 1.1 mrg mpfr_set_ui (x, 17, MPFR_RNDN);
229 1.1 mrg mpfr_jn (y, 65536, x, MPFR_RNDN);
230 1.1 mrg mpfr_set_str_binary (x, "100010010010011010110101100001000100011100010111011E-751747");
231 1.1 mrg if (mpfr_cmp (x, y))
232 1.1 mrg {
233 1.1 mrg printf ("Error in mpfr_jn for n=65536, x=17, rnd=MPFR_RNDN\n");
234 1.1 mrg printf ("Expected "); mpfr_dump (x);
235 1.1 mrg printf ("Got "); mpfr_dump (y);
236 1.1 mrg exit (1);
237 1.1 mrg }
238 1.1 mrg
239 1.1 mrg mpfr_set_ui (x, 17, MPFR_RNDN);
240 1.1 mrg mpfr_jn (y, 131072, x, MPFR_RNDN);
241 1.1 mrg mpfr_set_str_binary (x, "1000001001110011111001110110000010011010000001001101E-1634508");
242 1.1 mrg if (mpfr_cmp (x, y))
243 1.1 mrg {
244 1.1 mrg printf ("Error in mpfr_jn for n=131072, x=17, rnd=MPFR_RNDN\n");
245 1.1 mrg printf ("Expected "); mpfr_dump (x);
246 1.1 mrg printf ("Got "); mpfr_dump (y);
247 1.1 mrg exit (1);
248 1.1 mrg }
249 1.1 mrg
250 1.1 mrg mpfr_set_ui (x, 17, MPFR_RNDN);
251 1.1 mrg mpfr_jn (y, 262144, x, MPFR_RNDN);
252 1.1 mrg mpfr_set_str_binary (x, "1010011011000100111011001011110001000010000010111111E-3531100");
253 1.1 mrg if (mpfr_cmp (x, y))
254 1.1 mrg {
255 1.1 mrg printf ("Error in mpfr_jn for n=262144, x=17, rnd=MPFR_RNDN\n");
256 1.1 mrg printf ("Expected "); mpfr_dump (x);
257 1.1 mrg printf ("Got "); mpfr_dump (y);
258 1.1 mrg exit (1);
259 1.1 mrg }
260 1.1 mrg
261 1.1 mrg mpfr_set_ui (x, 17, MPFR_RNDN);
262 1.1 mrg mpfr_jn (y, 524288, x, MPFR_RNDN);
263 1.1 mrg mpfr_set_str_binary (x, "110000001010001111011011000011001011010100010001011E-7586426");
264 1.1 mrg if (mpfr_cmp (x, y))
265 1.1 mrg {
266 1.1 mrg printf ("Error in mpfr_jn for n=524288, x=17, rnd=MPFR_RNDN\n");
267 1.1 mrg printf ("Expected "); mpfr_dump (x);
268 1.1 mrg printf ("Got "); mpfr_dump (y);
269 1.1 mrg exit (1);
270 1.1 mrg }
271 1.1 mrg
272 1.1 mrg n = LONG_MAX;
273 1.1 mrg /* ensures n is odd */
274 1.1 mrg if (n % 2 == 0)
275 1.1 mrg n --;
276 1.1 mrg mpfr_set_ui (x, 17, MPFR_RNDN);
277 1.1 mrg mpfr_jn (y, n, x, MPFR_RNDN);
278 1.1 mrg mpfr_set_str_binary (x, "0.0");
279 1.1 mrg if (mpfr_cmp (x, y))
280 1.1 mrg {
281 1.1 mrg printf ("Error in mpfr_jn for n=%ld, x=17, rnd=MPFR_RNDN\n", n);
282 1.1 mrg printf ("Expected "); mpfr_dump (x);
283 1.1 mrg printf ("Got "); mpfr_dump (y);
284 1.1 mrg exit (1);
285 1.1 mrg }
286 1.1 mrg
287 1.1 mrg mpfr_set_si (x, -17, MPFR_RNDN);
288 1.1 mrg mpfr_jn (y, n, x, MPFR_RNDN);
289 1.1 mrg mpfr_set_str_binary (x, "-0.0");
290 1.1 mrg if (mpfr_cmp (x, y))
291 1.1 mrg {
292 1.1 mrg printf ("Error in mpfr_jn for n=%ld, x=-17, rnd=MPFR_RNDN\n", n);
293 1.1 mrg printf ("Expected "); mpfr_dump (x);
294 1.1 mrg printf ("Got "); mpfr_dump (y);
295 1.1 mrg exit (1);
296 1.1 mrg }
297 1.1 mrg
298 1.1 mrg mpfr_set_ui (x, 17, MPFR_RNDN);
299 1.1 mrg mpfr_jn (y, -n, x, MPFR_RNDN);
300 1.1 mrg mpfr_set_str_binary (x, "-0.0");
301 1.1 mrg if (mpfr_cmp (x, y))
302 1.1 mrg {
303 1.1 mrg printf ("Error in mpfr_jn for n=%ld, x=17, rnd=MPFR_RNDN\n", -n);
304 1.1 mrg printf ("Expected "); mpfr_dump (x);
305 1.1 mrg printf ("Got "); mpfr_dump (y);
306 1.1 mrg exit (1);
307 1.1 mrg }
308 1.1 mrg
309 1.1 mrg mpfr_set_si (x, -17, MPFR_RNDN);
310 1.1 mrg mpfr_jn (y, -n, x, MPFR_RNDN);
311 1.1 mrg mpfr_set_str_binary (x, "0.0");
312 1.1 mrg if (mpfr_cmp (x, y))
313 1.1 mrg {
314 1.1 mrg printf ("Error in mpfr_jn for n=%ld, x=-17, rnd=MPFR_RNDN\n", -n);
315 1.1 mrg printf ("Expected "); mpfr_dump (x);
316 1.1 mrg printf ("Got "); mpfr_dump (y);
317 1.1 mrg exit (1);
318 1.1 mrg }
319 1.1 mrg
320 1.1 mrg mpfr_clear (x);
321 1.1 mrg mpfr_clear (y);
322 1.1 mrg
323 1.1 mrg tests_end_mpfr ();
324 1.1 mrg
325 1.1 mrg return 0;
326 1.1 mrg }
327