1 /* Test file for mpfr_zeta_ui. 2 3 Copyright 2005-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 #define TEST_FUNCTION mpfr_zeta_ui 26 27 int 28 main (int argc, char *argv[]) 29 { 30 unsigned int prec, yprec; 31 int rnd; 32 mpfr_t x, y, z, t; 33 unsigned long n; 34 int inex; 35 mpfr_exp_t emin, emax; 36 mpfr_flags_t flags, ex_flags; 37 int i; 38 39 tests_start_mpfr (); 40 41 emin = mpfr_get_emin (); 42 emax = mpfr_get_emax (); 43 44 mpfr_init (x); 45 mpfr_init (y); 46 mpfr_init (z); 47 mpfr_init (t); 48 49 if (argc >= 3) /* tzeta_ui n prec [rnd] */ 50 { 51 mpfr_set_prec (x, atoi (argv[2])); 52 mpfr_zeta_ui (x, atoi (argv[1]), 53 argc > 3 ? (mpfr_rnd_t) atoi (argv[3]) : MPFR_RNDN); 54 mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); 55 printf ("\n"); 56 goto clear_and_exit; 57 } 58 59 mpfr_set_prec (x, 33); 60 mpfr_set_prec (y, 33); 61 mpfr_zeta_ui (x, 3, MPFR_RNDZ); 62 mpfr_set_str_binary (y, "0.100110011101110100000000001001111E1"); 63 if (mpfr_cmp (x, y)) 64 { 65 printf ("Error for zeta(3), prec=33, MPFR_RNDZ\n"); 66 printf ("expected "); mpfr_dump (y); 67 printf ("got "); mpfr_dump (x); 68 exit (1); 69 } 70 71 mpfr_clear_flags (); 72 inex = mpfr_zeta_ui (x, 0, MPFR_RNDN); 73 flags = __gmpfr_flags; 74 MPFR_ASSERTN (inex == 0 && mpfr_cmp_si_2exp (x, -1, -1) == 0 && flags == 0); 75 76 for (i = -2; i <= 2; i += 2) 77 RND_LOOP_NO_RNDF (rnd) 78 { 79 int ex_inex; 80 81 set_emin (i); 82 set_emax (i); 83 mpfr_clear_flags (); 84 inex = mpfr_zeta_ui (x, 0, (mpfr_rnd_t) rnd); 85 flags = __gmpfr_flags; 86 if (i < 0) 87 { 88 mpfr_set_inf (y, -1); 89 if (rnd == MPFR_RNDU || rnd == MPFR_RNDZ) 90 { 91 mpfr_nextabove (y); 92 ex_inex = 1; 93 } 94 else 95 { 96 ex_inex = -1; 97 } 98 ex_flags = MPFR_FLAGS_OVERFLOW | MPFR_FLAGS_INEXACT; 99 } 100 else if (i > 0) 101 { 102 mpfr_set_zero (y, -1); 103 if (rnd == MPFR_RNDD || rnd == MPFR_RNDA) 104 { 105 mpfr_nextbelow (y); 106 ex_inex = -1; 107 } 108 else 109 { 110 ex_inex = 1; 111 } 112 ex_flags = MPFR_FLAGS_UNDERFLOW | MPFR_FLAGS_INEXACT; 113 } 114 else 115 { 116 mpfr_set_str_binary (y, "-1e-1"); 117 ex_inex = 0; 118 ex_flags = 0; 119 } 120 set_emin (emin); 121 set_emax (emax); 122 if (! (mpfr_equal_p (x, y) && MPFR_IS_NEG (x) && 123 SAME_SIGN (inex, ex_inex) && flags == ex_flags)) 124 { 125 printf ("Failure for zeta(0) in %s, exponent range [%d,%d]\n", 126 mpfr_print_rnd_mode ((mpfr_rnd_t) rnd), i, i); 127 printf ("Expected "); 128 mpfr_dump (y); 129 printf (" with inex ~ %d, flags =", ex_inex); 130 flags_out (ex_flags); 131 printf ("Got "); 132 mpfr_dump (x); 133 printf (" with inex = %d, flags =", inex); 134 flags_out (flags); 135 exit (1); 136 } 137 } 138 139 mpfr_clear_divby0 (); 140 inex = mpfr_zeta_ui (x, 1, MPFR_RNDN); 141 MPFR_ASSERTN (inex == 0 && MPFR_IS_INF (x) && MPFR_IS_POS (x) 142 && mpfr_divby0_p ()); 143 144 for (prec = MPFR_PREC_MIN; prec <= 100; prec++) 145 { 146 mpfr_set_prec (x, prec); 147 mpfr_set_prec (z, prec); 148 mpfr_set_prec (t, prec); 149 yprec = prec + 10; 150 mpfr_set_prec (y, yprec); 151 152 for (n = 0; n < 50; n++) 153 RND_LOOP_NO_RNDF (rnd) 154 { 155 mpfr_zeta_ui (y, n, MPFR_RNDN); 156 if (mpfr_can_round (y, yprec, MPFR_RNDN, MPFR_RNDZ, prec 157 + (rnd == MPFR_RNDN))) 158 { 159 mpfr_set (t, y, (mpfr_rnd_t) rnd); 160 for (i = 0; i <= 1; i++) 161 { 162 if (i) 163 { 164 mpfr_exp_t e; 165 166 if (MPFR_IS_SINGULAR (t)) 167 break; 168 e = mpfr_get_exp (t); 169 set_emin (e); 170 set_emax (e); 171 } 172 mpfr_zeta_ui (z, n, (mpfr_rnd_t) rnd); 173 if (i) 174 { 175 set_emin (emin); 176 set_emax (emax); 177 } 178 if (mpfr_cmp (t, z)) 179 { 180 printf ("results differ for n = %lu, prec = %u," 181 " %s%s\n", n, prec, 182 mpfr_print_rnd_mode ((mpfr_rnd_t) rnd), 183 i ? ", reduced exponent range" : ""); 184 printf (" got "); 185 mpfr_dump (z); 186 printf (" expected "); 187 mpfr_dump (t); 188 printf (" approx "); 189 mpfr_dump (y); 190 exit (1); 191 } 192 } 193 } 194 } 195 } 196 197 clear_and_exit: 198 mpfr_clear (x); 199 mpfr_clear (y); 200 mpfr_clear (z); 201 mpfr_clear (t); 202 203 tests_end_mpfr (); 204 return 0; 205 } 206