1 1.1 mrg /* tjn -- test file for the Bessel function of first kind 2 1.1 mrg 3 1.1.1.6 mrg Copyright 2007-2023 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