Home | History | Annotate | Line # | Download | only in tests
      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