xref: /netbsd-src/external/lgpl3/mpfr/dist/tests/tjn.c (revision fa28c6faa16e0b00edee7acdcaf4899797043def)
1 /* tjn -- test file for the Bessel function of first kind
2 
3 Copyright 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 #include <limits.h> /* for LONG_MAX */
26 
27 #include "mpfr-test.h"
28 
29 int
30 main (int argc, char *argv[])
31 {
32   mpfr_t x, y;
33   long n;
34 
35   if (argc > 1)
36     {
37       mpfr_init2 (x, atoi (argv[1]));
38       mpfr_set_str (x, argv[3], 10, MPFR_RNDN);
39       mpfr_jn (x, atoi (argv[2]), x, MPFR_RNDN);
40       mpfr_out_str (stdout, 10, 10, x, MPFR_RNDN);
41       printf ("\n");
42       mpfr_clear (x);
43       return 0;
44     }
45 
46   tests_start_mpfr ();
47 
48   mpfr_init (x);
49   mpfr_init (y);
50 
51   /* special values */
52   mpfr_set_nan (x);
53   mpfr_jn (y, 17, x, MPFR_RNDN);
54   MPFR_ASSERTN(mpfr_nan_p (y));
55 
56   mpfr_set_inf (x, 1); /* +Inf */
57   mpfr_jn (y, 17, x, MPFR_RNDN);
58   MPFR_ASSERTN(mpfr_cmp_ui (y, 0) == 0 && MPFR_IS_POS (y));
59 
60   mpfr_set_inf (x, -1); /* -Inf */
61   mpfr_jn (y, 17, x, MPFR_RNDN);
62   MPFR_ASSERTN(mpfr_cmp_ui (y, 0) == 0 && MPFR_IS_POS (y));
63 
64   mpfr_set_ui (x, 0, MPFR_RNDN); /* +0 */
65   mpfr_jn (y, 0, x, MPFR_RNDN);
66   MPFR_ASSERTN(mpfr_cmp_ui (y, 1) == 0); /* j0(+0)=1 */
67   mpfr_jn (y, 17, x, MPFR_RNDN);
68   MPFR_ASSERTN(mpfr_cmp_ui (y, 0) == 0 && MPFR_IS_POS (y)); /* j17(+0)=+0 */
69   mpfr_jn (y, -17, x, MPFR_RNDN);
70   MPFR_ASSERTN(mpfr_cmp_ui (y, 0) == 0 && MPFR_IS_NEG (y)); /* j-17(+0)=-0 */
71   mpfr_jn (y, 42, x, MPFR_RNDN);
72   MPFR_ASSERTN(mpfr_cmp_ui (y, 0) == 0 && MPFR_IS_POS (y)); /* j42(+0)=+0 */
73 
74   mpfr_set_ui (x, 0, MPFR_RNDN);
75   mpfr_neg (x, x, MPFR_RNDN); /* -0 */
76   mpfr_jn (y, 0, x, MPFR_RNDN);
77   MPFR_ASSERTN(mpfr_cmp_ui (y, 1) == 0); /* j0(-0)=1 */
78   mpfr_jn (y, 17, x, MPFR_RNDN);
79   MPFR_ASSERTN(mpfr_cmp_ui (y, 0) == 0 && MPFR_IS_NEG (y)); /* j17(-0)=-0 */
80   mpfr_jn (y, -17, x, MPFR_RNDN);
81   MPFR_ASSERTN(mpfr_cmp_ui (y, 0) == 0 && MPFR_IS_POS (y)); /* j-17(-0)=+0 */
82   mpfr_jn (y, 42, x, MPFR_RNDN);
83   MPFR_ASSERTN(mpfr_cmp_ui (y, 0) == 0 && MPFR_IS_POS (y)); /* j42(-0)=+0 */
84 
85   mpfr_set_prec (x, 53);
86   mpfr_set_prec (y, 53);
87 
88   mpfr_set_ui (x, 1, MPFR_RNDN);
89   mpfr_jn (y, 0, x, MPFR_RNDN);
90   mpfr_set_str_binary (x, "0.1100001111100011111111101101111010111101110001111");
91   if (mpfr_cmp (x, y))
92     {
93       printf ("Error in mpfr_jn for n=0, x=1, rnd=MPFR_RNDN\n");
94       printf ("Expected "); mpfr_dump (x);
95       printf ("Got      "); mpfr_dump (y);
96       exit (1);
97     }
98 
99   mpfr_set_si (x, -1, MPFR_RNDN);
100   mpfr_jn (y, 0, x, MPFR_RNDN);
101   mpfr_set_str_binary (x, "0.1100001111100011111111101101111010111101110001111");
102   if (mpfr_cmp (x, y))
103     {
104       printf ("Error in mpfr_jn for n=0, x=-1, rnd=MPFR_RNDN\n");
105       printf ("Expected "); mpfr_dump (x);
106       printf ("Got      "); mpfr_dump (y);
107       exit (1);
108     }
109 
110   mpfr_set_ui (x, 1, MPFR_RNDN);
111   mpfr_jn (y, 1, x, MPFR_RNDN);
112   mpfr_set_str_binary (x, "0.0111000010100111001001111011101001011100001100011011");
113   if (mpfr_cmp (x, y))
114     {
115       printf ("Error in mpfr_jn for n=1, x=1, rnd=MPFR_RNDN\n");
116       printf ("Expected "); mpfr_dump (x);
117       printf ("Got      "); mpfr_dump (y);
118       exit (1);
119     }
120 
121   mpfr_set_ui (x, 1, MPFR_RNDN);
122   mpfr_jn (y, 17, x, MPFR_RNDN);
123   mpfr_set_str_binary (x, "0.1100011111001010101001001001000110110000010001011E-65");
124   if (mpfr_cmp (x, y))
125     {
126       printf ("Error in mpfr_jn for n=17, x=1, rnd=MPFR_RNDN\n");
127       printf ("Expected "); mpfr_dump (x);
128       printf ("Got      "); mpfr_dump (y);
129       exit (1);
130     }
131 
132   mpfr_set_ui (x, 1, MPFR_RNDN);
133   mpfr_jn (y, 42, x, MPFR_RNDN);
134   mpfr_set_str_binary (x, "0.10000111100011010100111011100111101101000100000001001E-211");
135   if (mpfr_cmp (x, y))
136     {
137       printf ("Error in mpfr_jn for n=42, x=1, rnd=MPFR_RNDN\n");
138       printf ("Expected "); mpfr_dump (x);
139       printf ("Got      "); mpfr_dump (y);
140       exit (1);
141     }
142 
143   mpfr_set_ui (x, 1, MPFR_RNDN);
144   mpfr_jn (y, -42, x, MPFR_RNDN);
145   mpfr_set_str_binary (x, "0.10000111100011010100111011100111101101000100000001001E-211");
146   if (mpfr_cmp (x, y))
147     {
148       printf ("Error in mpfr_jn for n=-42, x=1, rnd=MPFR_RNDN\n");
149       printf ("Expected "); mpfr_dump (x);
150       printf ("Got      "); mpfr_dump (y);
151       exit (1);
152     }
153 
154   mpfr_set_si (x, -1, MPFR_RNDN);
155   mpfr_jn (y, 42, x, MPFR_RNDN);
156   mpfr_set_str_binary (x, "0.10000111100011010100111011100111101101000100000001001E-211");
157   if (mpfr_cmp (x, y))
158     {
159       printf ("Error in mpfr_jn for n=42, x=-1, rnd=MPFR_RNDN\n");
160       printf ("Expected "); mpfr_dump (x);
161       printf ("Got      "); mpfr_dump (y);
162       exit (1);
163     }
164 
165   mpfr_set_si (x, -1, MPFR_RNDN);
166   mpfr_jn (y, -42, x, MPFR_RNDN);
167   mpfr_set_str_binary (x, "0.10000111100011010100111011100111101101000100000001001E-211");
168   if (mpfr_cmp (x, y))
169     {
170       printf ("Error in mpfr_jn for n=-42, x=-1, rnd=MPFR_RNDN\n");
171       printf ("Expected "); mpfr_dump (x);
172       printf ("Got      "); mpfr_dump (y);
173       exit (1);
174     }
175 
176   mpfr_set_ui (x, 17, MPFR_RNDN);
177   mpfr_jn (y, 4, x, MPFR_RNDN);
178   mpfr_set_str_binary (x, "-0.0001110001011001100010100111100111100000111110111011111");
179   if (mpfr_cmp (x, y))
180     {
181       printf ("Error in mpfr_jn for n=4, x=17, rnd=MPFR_RNDN\n");
182       printf ("Expected "); mpfr_dump (x);
183       printf ("Got      "); mpfr_dump (y);
184       exit (1);
185     }
186 
187   mpfr_set_ui (x, 17, MPFR_RNDN);
188   mpfr_jn (y, 16, x, MPFR_RNDN);
189   mpfr_set_str_binary (x, "0.0011101111100111101111010100000111111001111001001010011");
190   if (mpfr_cmp (x, y))
191     {
192       printf ("Error in mpfr_jn for n=16, x=17, rnd=MPFR_RNDN\n");
193       printf ("Expected "); mpfr_dump (x);
194       printf ("Got      "); mpfr_dump (y);
195       exit (1);
196     }
197 
198   mpfr_set_ui (x, 17, MPFR_RNDN);
199   mpfr_jn (y, 256, x, MPFR_RNDN);
200   mpfr_set_str_binary (x, "0.11111101111100110000000010111101101011101011110001011E-894");
201   if (mpfr_cmp (x, y))
202     {
203       printf ("Error in mpfr_jn for n=256, x=17, rnd=MPFR_RNDN\n");
204       printf ("Expected "); mpfr_dump (x);
205       printf ("Got      "); mpfr_dump (y);
206       exit (1);
207     }
208 
209   mpfr_set_ui (x, 17, MPFR_RNDN);
210   mpfr_jn (y, 65536, x, MPFR_RNDN);
211   mpfr_set_str_binary (x, "100010010010011010110101100001000100011100010111011E-751747");
212   if (mpfr_cmp (x, y))
213     {
214       printf ("Error in mpfr_jn for n=65536, x=17, rnd=MPFR_RNDN\n");
215       printf ("Expected "); mpfr_dump (x);
216       printf ("Got      "); mpfr_dump (y);
217       exit (1);
218     }
219 
220   mpfr_set_ui (x, 17, MPFR_RNDN);
221   mpfr_jn (y, 131072, x, MPFR_RNDN);
222   mpfr_set_str_binary (x, "1000001001110011111001110110000010011010000001001101E-1634508");
223   if (mpfr_cmp (x, y))
224     {
225       printf ("Error in mpfr_jn for n=131072, x=17, rnd=MPFR_RNDN\n");
226       printf ("Expected "); mpfr_dump (x);
227       printf ("Got      "); mpfr_dump (y);
228       exit (1);
229     }
230 
231   mpfr_set_ui (x, 17, MPFR_RNDN);
232   mpfr_jn (y, 262144, x, MPFR_RNDN);
233   mpfr_set_str_binary (x, "1010011011000100111011001011110001000010000010111111E-3531100");
234   if (mpfr_cmp (x, y))
235     {
236       printf ("Error in mpfr_jn for n=262144, x=17, rnd=MPFR_RNDN\n");
237       printf ("Expected "); mpfr_dump (x);
238       printf ("Got      "); mpfr_dump (y);
239       exit (1);
240     }
241 
242   mpfr_set_ui (x, 17, MPFR_RNDN);
243   mpfr_jn (y, 524288, x, MPFR_RNDN);
244   mpfr_set_str_binary (x, "110000001010001111011011000011001011010100010001011E-7586426");
245   if (mpfr_cmp (x, y))
246     {
247       printf ("Error in mpfr_jn for n=524288, x=17, rnd=MPFR_RNDN\n");
248       printf ("Expected "); mpfr_dump (x);
249       printf ("Got      "); mpfr_dump (y);
250       exit (1);
251     }
252 
253   n = LONG_MAX;
254   /* ensures n is odd */
255   if (n % 2 == 0)
256     n --;
257   mpfr_set_ui (x, 17, MPFR_RNDN);
258   mpfr_jn (y, n, x, MPFR_RNDN);
259   mpfr_set_str_binary (x, "0.0");
260   if (mpfr_cmp (x, y))
261     {
262       printf ("Error in mpfr_jn for n=%ld, x=17, rnd=MPFR_RNDN\n", n);
263       printf ("Expected "); mpfr_dump (x);
264       printf ("Got      "); mpfr_dump (y);
265       exit (1);
266     }
267 
268   mpfr_set_si (x, -17, MPFR_RNDN);
269   mpfr_jn (y, n, x, MPFR_RNDN);
270   mpfr_set_str_binary (x, "-0.0");
271   if (mpfr_cmp (x, y))
272     {
273       printf ("Error in mpfr_jn for n=%ld, x=-17, rnd=MPFR_RNDN\n", n);
274       printf ("Expected "); mpfr_dump (x);
275       printf ("Got      "); mpfr_dump (y);
276       exit (1);
277     }
278 
279   mpfr_set_ui (x, 17, MPFR_RNDN);
280   mpfr_jn (y, -n, x, MPFR_RNDN);
281   mpfr_set_str_binary (x, "-0.0");
282   if (mpfr_cmp (x, y))
283     {
284       printf ("Error in mpfr_jn for n=%ld, x=17, rnd=MPFR_RNDN\n", -n);
285       printf ("Expected "); mpfr_dump (x);
286       printf ("Got      "); mpfr_dump (y);
287       exit (1);
288     }
289 
290   mpfr_set_si (x, -17, MPFR_RNDN);
291   mpfr_jn (y, -n, x, MPFR_RNDN);
292   mpfr_set_str_binary (x, "0.0");
293   if (mpfr_cmp (x, y))
294     {
295       printf ("Error in mpfr_jn for n=%ld, x=-17, rnd=MPFR_RNDN\n", -n);
296       printf ("Expected "); mpfr_dump (x);
297       printf ("Got      "); mpfr_dump (y);
298       exit (1);
299     }
300 
301   mpfr_clear (x);
302   mpfr_clear (y);
303 
304   tests_end_mpfr ();
305 
306   return 0;
307 }
308