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