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