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