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