Home | History | Annotate | Line # | Download | only in tests
      1      1.1  mrg /* tzeta -- test file for the Riemann Zeta function
      2      1.1  mrg 
      3  1.1.1.6  mrg Copyright 2003-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  mrg static void
     26      1.1  mrg test1 (void)
     27      1.1  mrg {
     28      1.1  mrg   mpfr_t x, y;
     29  1.1.1.5  mrg   int inex;
     30      1.1  mrg 
     31      1.1  mrg   mpfr_init2 (x, 32);
     32      1.1  mrg   mpfr_init2 (y, 42);
     33      1.1  mrg 
     34  1.1.1.5  mrg   mpfr_clear_flags ();
     35  1.1.1.5  mrg 
     36      1.1  mrg   mpfr_set_str_binary (x, "1.1111111101000111011010010010100e-1");
     37      1.1  mrg   mpfr_zeta (y, x, MPFR_RNDN); /* shouldn't crash */
     38      1.1  mrg 
     39      1.1  mrg   mpfr_set_prec (x, 40);
     40      1.1  mrg   mpfr_set_prec (y, 50);
     41      1.1  mrg   mpfr_set_str_binary (x, "1.001101001101000010011010110100110000101e-1");
     42      1.1  mrg   mpfr_zeta (y, x, MPFR_RNDU);
     43      1.1  mrg   mpfr_set_prec (x, 50);
     44      1.1  mrg   mpfr_set_str_binary (x, "-0.11111100011100111111101111100011110111001111111111E1");
     45      1.1  mrg   if (mpfr_cmp (x, y))
     46      1.1  mrg     {
     47      1.1  mrg       printf ("Error for input on 40 bits, output on 50 bits\n");
     48  1.1.1.4  mrg       printf ("Expected "); mpfr_dump (x);
     49  1.1.1.4  mrg       printf ("Got      "); mpfr_dump (y);
     50      1.1  mrg       mpfr_set_str_binary (x, "1.001101001101000010011010110100110000101e-1");
     51      1.1  mrg       mpfr_zeta (y, x, MPFR_RNDU);
     52  1.1.1.4  mrg       mpfr_dump (x);
     53  1.1.1.4  mrg       mpfr_dump (y);
     54      1.1  mrg       exit (1);
     55      1.1  mrg     }
     56      1.1  mrg 
     57      1.1  mrg   mpfr_set_prec (x, 2);
     58      1.1  mrg   mpfr_set_prec (y, 55);
     59      1.1  mrg   mpfr_set_str_binary (x, "0.11e3");
     60      1.1  mrg   mpfr_zeta (y, x, MPFR_RNDN);
     61      1.1  mrg   mpfr_set_prec (x, 55);
     62      1.1  mrg   mpfr_set_str_binary (x, "0.1000001000111000010011000010011000000100100100100010010E1");
     63      1.1  mrg   if (mpfr_cmp (x, y))
     64      1.1  mrg     {
     65      1.1  mrg       printf ("Error in mpfr_zeta (1)\n");
     66  1.1.1.4  mrg       printf ("Expected "); mpfr_dump (x);
     67  1.1.1.4  mrg       printf ("Got      "); mpfr_dump (y);
     68      1.1  mrg       exit (1);
     69      1.1  mrg     }
     70      1.1  mrg 
     71      1.1  mrg   mpfr_set_prec (x, 3);
     72      1.1  mrg   mpfr_set_prec (y, 47);
     73      1.1  mrg   mpfr_set_str_binary (x, "0.111e4");
     74      1.1  mrg   mpfr_zeta (y, x, MPFR_RNDN);
     75      1.1  mrg   mpfr_set_prec (x, 47);
     76      1.1  mrg   mpfr_set_str_binary (x, "1.0000000000000100000000111001001010111100101011");
     77      1.1  mrg   if (mpfr_cmp (x, y))
     78      1.1  mrg     {
     79      1.1  mrg       printf ("Error in mpfr_zeta (2)\n");
     80      1.1  mrg       exit (1);
     81      1.1  mrg     }
     82      1.1  mrg 
     83      1.1  mrg   /* coverage test */
     84      1.1  mrg   mpfr_set_prec (x, 7);
     85      1.1  mrg   mpfr_set_str_binary (x, "1.000001");
     86      1.1  mrg   mpfr_set_prec (y, 2);
     87      1.1  mrg   mpfr_zeta (y, x, MPFR_RNDN);
     88      1.1  mrg   MPFR_ASSERTN(mpfr_cmp_ui (y, 64) == 0);
     89      1.1  mrg 
     90      1.1  mrg   /* another coverage test */
     91      1.1  mrg   mpfr_set_prec (x, 24);
     92      1.1  mrg   mpfr_set_ui (x, 2, MPFR_RNDN);
     93      1.1  mrg   mpfr_set_prec (y, 2);
     94      1.1  mrg   mpfr_zeta (y, x, MPFR_RNDN);
     95      1.1  mrg   MPFR_ASSERTN(mpfr_cmp_ui_2exp (y, 3, -1) == 0);
     96      1.1  mrg 
     97  1.1.1.5  mrg   /* yet another coverage test (case beta <= 0.0) */
     98  1.1.1.5  mrg   mpfr_set_prec (x, 10);
     99  1.1.1.5  mrg   mpfr_set_ui (x, 23, MPFR_RNDN);
    100  1.1.1.5  mrg   mpfr_set_prec (y, 15);
    101  1.1.1.5  mrg   inex = mpfr_zeta (y, x, MPFR_RNDN);
    102  1.1.1.5  mrg   MPFR_ASSERTN(inex < 0);
    103  1.1.1.5  mrg   MPFR_ASSERTN(mpfr_cmp_ui (y, 1) == 0);
    104      1.1  mrg 
    105      1.1  mrg   mpfr_set_inf (x, 1);
    106      1.1  mrg   mpfr_zeta (y, x, MPFR_RNDN);
    107      1.1  mrg   MPFR_ASSERTN(mpfr_cmp_ui (y, 1) == 0);
    108      1.1  mrg 
    109  1.1.1.5  mrg   /* Since some tests don't really check that the result is not NaN... */
    110  1.1.1.5  mrg   MPFR_ASSERTN (! mpfr_nanflag_p ());
    111  1.1.1.5  mrg 
    112      1.1  mrg   mpfr_set_inf (x, -1);
    113      1.1  mrg   mpfr_zeta (y, x, MPFR_RNDN);
    114      1.1  mrg   MPFR_ASSERTN(mpfr_nan_p (y));
    115      1.1  mrg 
    116  1.1.1.5  mrg   mpfr_set_nan (x);
    117  1.1.1.5  mrg   mpfr_zeta (y, x, MPFR_RNDN);
    118  1.1.1.5  mrg   MPFR_ASSERTN(mpfr_nan_p (y));
    119  1.1.1.5  mrg 
    120      1.1  mrg   mpfr_clear (x);
    121      1.1  mrg   mpfr_clear (y);
    122      1.1  mrg }
    123      1.1  mrg 
    124      1.1  mrg static const char *const val[] = {
    125      1.1  mrg   "-2000", "0.0",
    126      1.1  mrg   "-2.0", "0.0",
    127      1.1  mrg   "-1.0", "-0.000101010101010101010101010101010101010101010101010101010101010",
    128      1.1  mrg   "-0.9", "-0.000110011110011111010001010001100010111101001010100110001110110",
    129      1.1  mrg   /*  "-0.8", "-0.000111110011101010001011100011010010000001010011110100010001110",
    130      1.1  mrg   "-0.7", "-0.00100101011011111100110011110011111010111111000110110100010110",
    131      1.1  mrg   "-0.6", "-0.00101100101100100100110111111000110010111010110010111000001100",
    132      1.1  mrg   "-0.5", "-0.00110101001110000000100000011001100100010000111100010001111100",
    133      1.1  mrg   "-0.4", "-0.00111111010001100011110001010010111110010001010101111101110001",
    134      1.1  mrg   "-0.3", "-0.0100101100110111010101010100111011000001001010111010110101010",
    135      1.1  mrg   "-0.2", "-0.0101100110000011101110101011011110101111000010000010110101111",
    136      1.1  mrg   "-0.1", "-0.0110101011001111011101001111011000010001111010110011011111011",
    137      1.1  mrg   "-0.0", "-0.100000000000000000000000000000000000000000000000000000000000",
    138      1.1  mrg   "0.1", "-0.100110100110000010101010101110100000101100100011011001000101",
    139      1.1  mrg   "0.2", "-0.10111011111000100011110111100010010001111010010010010100010110",
    140      1.1  mrg   "0.3", "-0.11100111100100010011001000001011001100110010110101101110110110",
    141      1.1  mrg   "0.4", "-1.0010001010000010000110111000100101001000001011101010110101011",
    142      1.1  mrg   "0.5", "-1.0111010111011001110010110000011111100111001111111110111000110",
    143      1.1  mrg   "0.6", "-1.1111001111100001100111101110010001001000001101100110110000100",
    144      1.1  mrg   "0.7", "-10.110001110100010001110111000101010011110011000110010100101000",
    145      1.1  mrg   "0.8", "-100.01110000000000101000010010000011000000111101100101100011010",
    146      1.1  mrg   "0.9", "-1001.0110111000011011111100111100111011100010001111111010000100",
    147      1.1  mrg   "0.99","-0.11000110110110001101011010110001011010011000110001011100101110E7",
    148      1.1  mrg   "0.997", "-0.10100110011000001100111110011111100011110000111011101110001010E9",
    149      1.1  mrg   "0.9995", "-0.11111001111011011000011110111111010111101001000110001111110010E11",
    150      1.1  mrg   "0.99998", "-0.11000011010011110110110000111011101100001000101101011001110100E16",
    151      1.1  mrg   "1.00001", "0.11000011010100000100100111100010001110100000110101110011111011E17",
    152      1.1  mrg   "1.0002", "0.10011100010001001001111000101010111000011011011111110010110100E13",
    153      1.1  mrg   "1.003","0.10100110111101001001010000000110101101110100001010100000110000E9",
    154      1.1  mrg   "1.04", "11001.100101001000001011000111010110011010000001000010111101101",
    155      1.1  mrg   "1.1", "1010.1001010110011110011010100010001100101001001111111101100001",
    156      1.1  mrg   "1.2", "101.10010111011100011111001001100101101111110000110001101100010",
    157      1.1  mrg   "1.3", "11.111011101001010000111001001110100100000101000101101011010100",
    158      1.1  mrg   "1.4", "11.000110110000010100100101011110110001100001110100100100111111",
    159      1.1  mrg   "1.5", "10.100111001100010010100001011111110111101100010011101011011100",
    160      1.1  mrg   "1.6", "10.010010010010011111110000010011000110101001110011101010100110",
    161      1.1  mrg   "1.7", "10.000011011110010111011110001100110010100010011100011111110010",
    162      1.1  mrg   "1.8", "1.1110000111011001110011001101110101010000011011101100010111001",
    163      1.1  mrg   "1.9", "1.1011111111101111011000011110001100100111100110111101101000101",
    164      1.1  mrg   "2.0", "1.1010010100011010011001100010010100110000011111010011001000110",
    165      1.1  mrg   "42.17", "1.0000000000000000000000000000000000000000001110001110001011001",
    166      1.1  mrg   "-17.42", "-11.101110101010101000000001001000001111111101000100001100101100",
    167      1.1  mrg   "-24.17", "-0.10001111010010011111000010001011111010010111101011000010010011E13"*/
    168      1.1  mrg };
    169      1.1  mrg 
    170      1.1  mrg static void
    171      1.1  mrg test2 (void)
    172      1.1  mrg {
    173      1.1  mrg   mpfr_t x, y;
    174      1.1  mrg   int i, n = numberof(val);
    175      1.1  mrg 
    176      1.1  mrg   mpfr_inits2 (55, x, y, (mpfr_ptr) 0);
    177      1.1  mrg 
    178      1.1  mrg   for(i = 0 ; i < n ; i+=2)
    179      1.1  mrg     {
    180      1.1  mrg       mpfr_set_str1 (x, val[i]);
    181      1.1  mrg       mpfr_zeta(y, x, MPFR_RNDZ);
    182  1.1.1.6  mrg       if (mpfr_cmp_str (y, val[i+1], 2, MPFR_RNDZ))
    183      1.1  mrg         {
    184      1.1  mrg           printf("Wrong result for zeta(%s=", val[i]);
    185  1.1.1.4  mrg           mpfr_out_str (stdout, 2, 0, x, MPFR_RNDN);
    186      1.1  mrg           printf (").\nGot     : ");
    187  1.1.1.4  mrg           mpfr_dump (y);
    188      1.1  mrg           printf("Expected: ");
    189      1.1  mrg           mpfr_set_str (y, val[i+1], 2, MPFR_RNDZ);
    190  1.1.1.4  mrg           mpfr_dump (y);
    191      1.1  mrg           mpfr_set_prec(y, 65);
    192      1.1  mrg           mpfr_zeta(y, x, MPFR_RNDZ);
    193      1.1  mrg           printf("+ Prec  : ");
    194  1.1.1.4  mrg           mpfr_dump (y);
    195      1.1  mrg           exit(1);
    196      1.1  mrg         }
    197      1.1  mrg     }
    198      1.1  mrg   mpfr_clears (x, y, (mpfr_ptr) 0);
    199      1.1  mrg }
    200      1.1  mrg 
    201  1.1.1.4  mrg /* The following test attempts to trigger an intermediate overflow in
    202  1.1.1.4  mrg    Gamma(s1) in the reflection formula with a 32-bit ABI (the example
    203  1.1.1.4  mrg    depends on the extended exponent range): r10804 fails when the
    204  1.1.1.4  mrg    exponent field is on 32 bits. */
    205  1.1.1.4  mrg static void
    206  1.1.1.4  mrg intermediate_overflow (void)
    207  1.1.1.4  mrg {
    208  1.1.1.4  mrg   mpfr_t x, y1, y2;
    209  1.1.1.4  mrg   mpfr_flags_t flags1, flags2;
    210  1.1.1.4  mrg   int inex1, inex2;
    211  1.1.1.4  mrg 
    212  1.1.1.4  mrg   mpfr_inits2 (64, x, y1, y2, (mpfr_ptr) 0);
    213  1.1.1.4  mrg 
    214  1.1.1.4  mrg   mpfr_set_si (x, -44787928, MPFR_RNDN);
    215  1.1.1.4  mrg   mpfr_nextabove (x);
    216  1.1.1.4  mrg 
    217  1.1.1.4  mrg   mpfr_set_str (y1, "0x3.0a6ab0ab281742acp+954986780", 0, MPFR_RNDN);
    218  1.1.1.4  mrg   inex1 = -1;
    219  1.1.1.4  mrg   flags1 = MPFR_FLAGS_INEXACT;
    220  1.1.1.4  mrg 
    221  1.1.1.4  mrg   mpfr_clear_flags ();
    222  1.1.1.4  mrg   inex2 = mpfr_zeta (y2, x, MPFR_RNDN);
    223  1.1.1.4  mrg   flags2 = __gmpfr_flags;
    224  1.1.1.4  mrg 
    225  1.1.1.4  mrg   if (!(mpfr_equal_p (y1, y2) &&
    226  1.1.1.4  mrg         SAME_SIGN (inex1, inex2) &&
    227  1.1.1.4  mrg         flags1 == flags2))
    228  1.1.1.4  mrg     {
    229  1.1.1.4  mrg       printf ("Error in intermediate_overflow\n");
    230  1.1.1.4  mrg       printf ("Expected ");
    231  1.1.1.4  mrg       mpfr_dump (y1);
    232  1.1.1.4  mrg       printf ("with inex = %d and flags =", inex1);
    233  1.1.1.4  mrg       flags_out (flags1);
    234  1.1.1.4  mrg       printf ("Got      ");
    235  1.1.1.4  mrg       mpfr_dump (y2);
    236  1.1.1.4  mrg       printf ("with inex = %d and flags =", inex2);
    237  1.1.1.4  mrg       flags_out (flags2);
    238  1.1.1.4  mrg       exit (1);
    239  1.1.1.4  mrg     }
    240  1.1.1.4  mrg   mpfr_clears (x, y1, y2, (mpfr_ptr) 0);
    241  1.1.1.4  mrg }
    242  1.1.1.4  mrg 
    243      1.1  mrg #define TEST_FUNCTION mpfr_zeta
    244      1.1  mrg #define TEST_RANDOM_EMIN -48
    245      1.1  mrg #define TEST_RANDOM_EMAX 31
    246      1.1  mrg #include "tgeneric.c"
    247      1.1  mrg 
    248      1.1  mrg /* Usage: tzeta - generic tests
    249      1.1  mrg           tzeta s prec rnd_mode - compute zeta(s) with precision 'prec'
    250      1.1  mrg                                   and rounding mode 'mode' */
    251      1.1  mrg int
    252      1.1  mrg main (int argc, char *argv[])
    253      1.1  mrg {
    254      1.1  mrg   mpfr_t s, y, z;
    255      1.1  mrg   mpfr_prec_t prec;
    256      1.1  mrg   mpfr_rnd_t rnd_mode;
    257  1.1.1.4  mrg   mpfr_flags_t flags;
    258      1.1  mrg   int inex;
    259      1.1  mrg 
    260      1.1  mrg   tests_start_mpfr ();
    261      1.1  mrg 
    262      1.1  mrg   if (argc != 1 && argc != 4)
    263      1.1  mrg     {
    264      1.1  mrg       printf ("Usage: tzeta\n"
    265      1.1  mrg               "    or tzeta s prec rnd_mode\n");
    266      1.1  mrg       exit (1);
    267      1.1  mrg     }
    268      1.1  mrg 
    269      1.1  mrg   if (argc == 4)
    270      1.1  mrg     {
    271      1.1  mrg       prec = atoi(argv[2]);
    272      1.1  mrg       mpfr_init2 (s, prec);
    273      1.1  mrg       mpfr_init2 (z, prec);
    274      1.1  mrg       mpfr_set_str (s, argv[1], 10, MPFR_RNDN);
    275      1.1  mrg       rnd_mode = (mpfr_rnd_t) atoi(argv[3]);
    276      1.1  mrg 
    277      1.1  mrg       mpfr_zeta (z, s, rnd_mode);
    278      1.1  mrg       mpfr_out_str (stdout, 10, 0, z, MPFR_RNDN);
    279      1.1  mrg       printf ("\n");
    280      1.1  mrg 
    281      1.1  mrg       mpfr_clear (s);
    282      1.1  mrg       mpfr_clear (z);
    283      1.1  mrg 
    284      1.1  mrg       return 0;
    285      1.1  mrg     }
    286      1.1  mrg 
    287      1.1  mrg   test1();
    288      1.1  mrg 
    289      1.1  mrg   mpfr_init2 (s, MPFR_PREC_MIN);
    290      1.1  mrg   mpfr_init2 (y, MPFR_PREC_MIN);
    291      1.1  mrg   mpfr_init2 (z, MPFR_PREC_MIN);
    292      1.1  mrg 
    293      1.1  mrg 
    294      1.1  mrg   /* the following seems to loop */
    295      1.1  mrg   mpfr_set_prec (s, 6);
    296      1.1  mrg   mpfr_set_prec (z, 6);
    297      1.1  mrg   mpfr_set_str_binary (s, "1.10010e4");
    298      1.1  mrg   mpfr_zeta (z, s, MPFR_RNDZ);
    299      1.1  mrg 
    300      1.1  mrg   mpfr_set_prec (s, 53);
    301      1.1  mrg   mpfr_set_prec (y, 53);
    302      1.1  mrg   mpfr_set_prec (z, 53);
    303      1.1  mrg 
    304      1.1  mrg   mpfr_set_ui (s, 1, MPFR_RNDN);
    305  1.1.1.2  mrg   mpfr_clear_divby0();
    306      1.1  mrg   mpfr_zeta (z, s, MPFR_RNDN);
    307  1.1.1.4  mrg   if (!mpfr_inf_p (z) || MPFR_IS_NEG (z) || !mpfr_divby0_p())
    308      1.1  mrg     {
    309  1.1.1.2  mrg       printf ("Error in mpfr_zeta for s = 1 (should be +inf) with divby0 flag\n");
    310      1.1  mrg       exit (1);
    311      1.1  mrg     }
    312      1.1  mrg 
    313      1.1  mrg   mpfr_set_str_binary (s, "0.1100011101110111111111111010000110010111001011001011");
    314      1.1  mrg   mpfr_set_str_binary (y, "-0.11111101111011001001001111111000101010000100000100100E2");
    315      1.1  mrg   mpfr_zeta (z, s, MPFR_RNDN);
    316      1.1  mrg   if (mpfr_cmp (z, y) != 0)
    317      1.1  mrg     {
    318      1.1  mrg       printf ("Error in mpfr_zeta (1,RNDN)\n");
    319      1.1  mrg       exit (1);
    320      1.1  mrg     }
    321      1.1  mrg   mpfr_zeta (z, s, MPFR_RNDZ);
    322      1.1  mrg   if (mpfr_cmp (z, y) != 0)
    323      1.1  mrg     {
    324      1.1  mrg       printf ("Error in mpfr_zeta (1,RNDZ)\n");
    325      1.1  mrg       exit (1);
    326      1.1  mrg     }
    327      1.1  mrg   mpfr_zeta (z, s, MPFR_RNDU);
    328      1.1  mrg   if (mpfr_cmp (z, y) != 0)
    329      1.1  mrg     {
    330      1.1  mrg       printf ("Error in mpfr_zeta (1,RNDU)\n");
    331      1.1  mrg       exit (1);
    332      1.1  mrg     }
    333      1.1  mrg   mpfr_zeta (z, s, MPFR_RNDD);
    334      1.1  mrg   mpfr_nexttoinf (y);
    335      1.1  mrg   if (mpfr_cmp (z, y) != 0)
    336      1.1  mrg     {
    337      1.1  mrg       printf ("Error in mpfr_zeta (1,RNDD)\n");
    338      1.1  mrg       exit (1);
    339      1.1  mrg     }
    340      1.1  mrg 
    341      1.1  mrg   mpfr_set_str_binary (s, "0.10001011010011100110010001100100001011000010011001011");
    342      1.1  mrg   mpfr_set_str_binary (y, "-0.11010011010010101101110111011010011101111101111010110E1");
    343      1.1  mrg   mpfr_zeta (z, s, MPFR_RNDN);
    344      1.1  mrg   if (mpfr_cmp (z, y) != 0)
    345      1.1  mrg     {
    346      1.1  mrg       printf ("Error in mpfr_zeta (2,RNDN)\n");
    347      1.1  mrg       exit (1);
    348      1.1  mrg     }
    349      1.1  mrg   mpfr_zeta (z, s, MPFR_RNDZ);
    350      1.1  mrg   if (mpfr_cmp (z, y) != 0)
    351      1.1  mrg     {
    352      1.1  mrg       printf ("Error in mpfr_zeta (2,RNDZ)\n");
    353      1.1  mrg       exit (1);
    354      1.1  mrg     }
    355      1.1  mrg   mpfr_zeta (z, s, MPFR_RNDU);
    356      1.1  mrg   if (mpfr_cmp (z, y) != 0)
    357      1.1  mrg     {
    358      1.1  mrg       printf ("Error in mpfr_zeta (2,RNDU)\n");
    359      1.1  mrg       exit (1);
    360      1.1  mrg     }
    361      1.1  mrg   mpfr_zeta (z, s, MPFR_RNDD);
    362      1.1  mrg   mpfr_nexttoinf (y);
    363      1.1  mrg   if (mpfr_cmp (z, y) != 0)
    364      1.1  mrg     {
    365      1.1  mrg       printf ("Error in mpfr_zeta (2,RNDD)\n");
    366      1.1  mrg       exit (1);
    367      1.1  mrg     }
    368      1.1  mrg 
    369      1.1  mrg   mpfr_set_str_binary (s, "0.1100111110100001111110111000110101111001011101000101");
    370      1.1  mrg   mpfr_set_str_binary (y, "-0.10010111010110000111011111001101100001111011000001010E3");
    371      1.1  mrg   mpfr_zeta (z, s, MPFR_RNDN);
    372      1.1  mrg   if (mpfr_cmp (z, y) != 0)
    373      1.1  mrg     {
    374      1.1  mrg       printf ("Error in mpfr_zeta (3,RNDN)\n");
    375      1.1  mrg       exit (1);
    376      1.1  mrg     }
    377      1.1  mrg   mpfr_zeta (z, s, MPFR_RNDD);
    378      1.1  mrg   if (mpfr_cmp (z, y) != 0)
    379      1.1  mrg     {
    380      1.1  mrg       printf ("Error in mpfr_zeta (3,RNDD)\n");
    381      1.1  mrg       exit (1);
    382      1.1  mrg     }
    383      1.1  mrg   mpfr_nexttozero (y);
    384      1.1  mrg   mpfr_zeta (z, s, MPFR_RNDZ);
    385      1.1  mrg   if (mpfr_cmp (z, y) != 0)
    386      1.1  mrg     {
    387      1.1  mrg       printf ("Error in mpfr_zeta (3,RNDZ)\n");
    388      1.1  mrg       exit (1);
    389      1.1  mrg     }
    390      1.1  mrg   mpfr_zeta (z, s, MPFR_RNDU);
    391      1.1  mrg   if (mpfr_cmp (z, y) != 0)
    392      1.1  mrg     {
    393      1.1  mrg       printf ("Error in mpfr_zeta (3,RNDU)\n");
    394      1.1  mrg       exit (1);
    395      1.1  mrg     }
    396      1.1  mrg 
    397      1.1  mrg   mpfr_set_str (s, "-400000001", 10, MPFR_RNDZ);
    398      1.1  mrg   mpfr_zeta (z, s, MPFR_RNDN);
    399  1.1.1.4  mrg   if (!(mpfr_inf_p (z) && MPFR_IS_NEG (z)))
    400      1.1  mrg     {
    401      1.1  mrg       printf ("Error in mpfr_zeta (-400000001)\n");
    402      1.1  mrg       exit (1);
    403      1.1  mrg     }
    404      1.1  mrg   mpfr_set_str (s, "-400000003", 10, MPFR_RNDZ);
    405      1.1  mrg   mpfr_zeta (z, s, MPFR_RNDN);
    406  1.1.1.4  mrg   if (!(mpfr_inf_p (z) && MPFR_IS_POS (z)))
    407      1.1  mrg     {
    408      1.1  mrg       printf ("Error in mpfr_zeta (-400000003)\n");
    409      1.1  mrg       exit (1);
    410      1.1  mrg     }
    411      1.1  mrg 
    412      1.1  mrg   mpfr_set_prec (s, 34);
    413      1.1  mrg   mpfr_set_prec (z, 34);
    414      1.1  mrg   mpfr_set_str_binary (s, "-1.111111100001011110000010001010000e-35");
    415      1.1  mrg   mpfr_zeta (z, s, MPFR_RNDD);
    416      1.1  mrg   mpfr_set_str_binary (s, "-1.111111111111111111111111111111111e-2");
    417      1.1  mrg   if (mpfr_cmp (s, z))
    418      1.1  mrg     {
    419      1.1  mrg       printf ("Error in mpfr_zeta, prec=34, MPFR_RNDD\n");
    420      1.1  mrg       mpfr_dump (z);
    421      1.1  mrg       exit (1);
    422      1.1  mrg     }
    423      1.1  mrg 
    424      1.1  mrg   /* bug found by nightly tests on June 7, 2007 */
    425      1.1  mrg   mpfr_set_prec (s, 23);
    426      1.1  mrg   mpfr_set_prec (z, 25);
    427      1.1  mrg   mpfr_set_str_binary (s, "-1.0110110110001000000000e-27");
    428      1.1  mrg   mpfr_zeta (z, s, MPFR_RNDN);
    429      1.1  mrg   mpfr_set_prec (s, 25);
    430      1.1  mrg   mpfr_set_str_binary (s, "-1.111111111111111111111111e-2");
    431      1.1  mrg   if (mpfr_cmp (s, z))
    432      1.1  mrg     {
    433      1.1  mrg       printf ("Error in mpfr_zeta, prec=25, MPFR_RNDN\n");
    434      1.1  mrg       printf ("expected "); mpfr_dump (s);
    435      1.1  mrg       printf ("got      "); mpfr_dump (z);
    436      1.1  mrg       exit (1);
    437      1.1  mrg     }
    438      1.1  mrg 
    439      1.1  mrg   /* bug reported by Kevin Rauch on 26 Oct 2007 */
    440      1.1  mrg   mpfr_set_prec (s, 128);
    441      1.1  mrg   mpfr_set_prec (z, 128);
    442      1.1  mrg   mpfr_set_str_binary (s, "-0.1000000000000000000000000000000000000000000000000000000000000001E64");
    443      1.1  mrg   inex = mpfr_zeta (z, s, MPFR_RNDN);
    444  1.1.1.4  mrg   MPFR_ASSERTN (mpfr_inf_p (z) && MPFR_IS_NEG (z) && inex < 0);
    445      1.1  mrg   inex = mpfr_zeta (z, s, MPFR_RNDU);
    446      1.1  mrg   mpfr_set_inf (s, -1);
    447      1.1  mrg   mpfr_nextabove (s);
    448      1.1  mrg   MPFR_ASSERTN (mpfr_equal_p (z, s) && inex > 0);
    449      1.1  mrg 
    450  1.1.1.3  mrg   /* bug reported by Fredrik Johansson on 19 Jan 2016 */
    451  1.1.1.3  mrg   mpfr_set_prec (s, 536);
    452  1.1.1.3  mrg   mpfr_set_ui_2exp (s, 1, -424, MPFR_RNDN);
    453  1.1.1.3  mrg   mpfr_sub_ui (s, s, 128, MPFR_RNDN);  /* -128 + 2^(-424) */
    454  1.1.1.3  mrg   for (prec = 6; prec <= 536; prec += 8) /* should go through 318 */
    455  1.1.1.3  mrg     {
    456  1.1.1.3  mrg       mpfr_set_prec (z, prec);
    457  1.1.1.3  mrg       mpfr_zeta (z, s, MPFR_RNDD);
    458  1.1.1.3  mrg       mpfr_set_prec (y, prec + 10);
    459  1.1.1.3  mrg       mpfr_zeta (y, s, MPFR_RNDD);
    460  1.1.1.3  mrg       mpfr_prec_round (y, prec, MPFR_RNDD);
    461  1.1.1.3  mrg       if (! mpfr_equal_p (z, y))
    462  1.1.1.3  mrg         {
    463  1.1.1.3  mrg           printf ("mpfr_zeta fails near -128 for inprec=%lu outprec=%lu\n",
    464  1.1.1.3  mrg                   (unsigned long) mpfr_get_prec (s), (unsigned long) prec);
    465  1.1.1.3  mrg           printf ("expected "); mpfr_dump (y);
    466  1.1.1.3  mrg           printf ("got      "); mpfr_dump (z);
    467  1.1.1.3  mrg           exit (1);
    468  1.1.1.3  mrg         }
    469  1.1.1.3  mrg     }
    470  1.1.1.3  mrg 
    471  1.1.1.4  mrg   /* The following test yields an overflow in the error computation.
    472  1.1.1.4  mrg      With r10864, this is detected and one gets an assertion failure. */
    473  1.1.1.4  mrg   mpfr_set_prec (s, 1025);
    474  1.1.1.4  mrg   mpfr_set_si_2exp (s, -1, 1024, MPFR_RNDN);
    475  1.1.1.4  mrg   mpfr_nextbelow (s);  /* -(2^1024 + 1) */
    476  1.1.1.4  mrg   mpfr_clear_flags ();
    477  1.1.1.4  mrg   inex = mpfr_zeta (z, s, MPFR_RNDN);
    478  1.1.1.4  mrg   flags = __gmpfr_flags;
    479  1.1.1.4  mrg   if (flags != (MPFR_FLAGS_OVERFLOW | MPFR_FLAGS_INEXACT) ||
    480  1.1.1.4  mrg       ! mpfr_inf_p (z) || MPFR_IS_POS (z) || inex >= 0)
    481  1.1.1.4  mrg     {
    482  1.1.1.4  mrg       printf ("Error in mpfr_zeta for s = -(2^1024 + 1)\nGot ");
    483  1.1.1.4  mrg       mpfr_dump (z);
    484  1.1.1.4  mrg       printf ("with inex = %d and flags =", inex);
    485  1.1.1.4  mrg       flags_out (flags);
    486  1.1.1.4  mrg       exit (1);
    487  1.1.1.4  mrg     }
    488  1.1.1.4  mrg 
    489      1.1  mrg   mpfr_clear (s);
    490      1.1  mrg   mpfr_clear (y);
    491      1.1  mrg   mpfr_clear (z);
    492      1.1  mrg 
    493  1.1.1.3  mrg   /* FIXME: change the last argument back to 5 once the working precision
    494  1.1.1.3  mrg      in the mpfr_zeta implementation no longer depends on the precision of
    495  1.1.1.3  mrg      the input. */
    496  1.1.1.3  mrg   test_generic (MPFR_PREC_MIN, 70, 1);
    497      1.1  mrg   test2 ();
    498      1.1  mrg 
    499  1.1.1.4  mrg   intermediate_overflow ();
    500  1.1.1.4  mrg 
    501      1.1  mrg   tests_end_mpfr ();
    502      1.1  mrg   return 0;
    503      1.1  mrg }
    504