teint.c revision 1.1.1.5
1/* Test file for mpfr_eint. 2 3Copyright 2005-2020 Free Software Foundation, Inc. 4Contributed by the AriC and Caramba projects, INRIA. 5 6This file is part of the GNU MPFR Library. 7 8The GNU MPFR Library is free software; you can redistribute it and/or modify 9it under the terms of the GNU Lesser General Public License as published by 10the Free Software Foundation; either version 3 of the License, or (at your 11option) any later version. 12 13The GNU MPFR Library is distributed in the hope that it will be useful, but 14WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 15or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 16License for more details. 17 18You should have received a copy of the GNU Lesser General Public License 19along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see 20https://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc., 2151 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ 22 23#include "mpfr-test.h" 24 25#define TEST_FUNCTION mpfr_eint 26#include "tgeneric.c" 27 28static void 29check_specials (void) 30{ 31 mpfr_t x, y; 32 33 mpfr_init2 (x, 123L); 34 mpfr_init2 (y, 123L); 35 36 mpfr_set_nan (x); 37 mpfr_eint (y, x, MPFR_RNDN); 38 if (! mpfr_nan_p (y)) 39 { 40 printf ("Error: eint(NaN) != NaN\n"); 41 exit (1); 42 } 43 44 mpfr_set_inf (x, 1); 45 mpfr_eint (y, x, MPFR_RNDN); 46 if (! (mpfr_inf_p (y) && mpfr_sgn (y) > 0)) 47 { 48 printf ("Error: eint(+Inf) != +Inf\n"); 49 exit (1); 50 } 51 52 mpfr_set_inf (x, -1); 53 mpfr_eint (y, x, MPFR_RNDN); 54 if (! (mpfr_zero_p (y) && MPFR_IS_NEG (y))) 55 { 56 printf ("Error: eint(-Inf) != -0\n"); 57 exit (1); 58 } 59 60 /* eint(+/-0) = -Inf */ 61 mpfr_set_ui (x, 0, MPFR_RNDN); 62 mpfr_eint (y, x, MPFR_RNDN); 63 if (! (mpfr_inf_p (y) && mpfr_sgn (y) < 0)) 64 { 65 printf ("Error: eint(+0) != -Inf\n"); 66 exit (1); 67 } 68 mpfr_neg (x, x, MPFR_RNDN); 69 mpfr_eint (y, x, MPFR_RNDN); 70 if (! (mpfr_inf_p (y) && mpfr_sgn (y) < 0)) 71 { 72 printf ("Error: eint(-0) != -Inf\n"); 73 exit (1); 74 } 75 76 mpfr_set_prec (x, 17); 77 mpfr_set_prec (y, 17); 78 mpfr_set_str_binary (x, "1.0111110100100110e-2"); 79 mpfr_set_str_binary (y, "-1.0010101001110100e-10"); 80 mpfr_eint (x, x, MPFR_RNDZ); 81 if (mpfr_cmp (x, y)) 82 { 83 printf ("Error for x=1.0111110100100110e-2, MPFR_RNDZ\n"); 84 printf ("expected "); mpfr_dump (y); 85 printf ("got "); mpfr_dump (x); 86 exit (1); 87 } 88 89 mpfr_set_prec (x, 53); 90 mpfr_set_prec (y, 53); 91 mpfr_set_str_binary (x, "0.10E4"); 92 mpfr_eint (x, x, MPFR_RNDN); 93 mpfr_set_str (y, "440.37989953483827", 10, MPFR_RNDN); 94 if (mpfr_cmp (x, y) != 0) 95 { 96 printf ("Error for x=0.10E4, MPFR_RNDZ\n"); 97 printf ("expected "); mpfr_dump (y); 98 printf ("got "); mpfr_dump (x); 99 exit (1); 100 } 101 102 mpfr_set_prec (x, 63); 103 mpfr_set_prec (y, 63); 104 mpfr_set_str_binary (x, "1.01111101011100111000011010001000101101011000011001111101011010e-2"); 105 mpfr_eint (x, x, MPFR_RNDZ); 106 mpfr_set_str_binary (y, "1.11010110001101000001010010000100001111001000100100000001011100e-17"); 107 if (mpfr_cmp (x, y) != 0) 108 { 109 printf ("Error (1) for MPFR_RNDZ\n"); 110 printf ("expected "); mpfr_dump (y); 111 printf ("got "); mpfr_dump (x); 112 exit (1); 113 } 114 115 mpfr_set_prec (x, 2); 116 mpfr_set_prec (y, 2); 117 mpfr_set_si (x, -1, MPFR_RNDN); 118 mpfr_eint (x, x, MPFR_RNDN); /* eint1(1) = 0.219383934395520 */ 119 mpfr_set_str_binary (y, "-1e-2"); 120 if (mpfr_cmp (x, y) != 0) 121 { 122 printf ("Error for x=-1, MPFR_RNDN\n"); 123 printf ("expected "); mpfr_dump (y); 124 printf ("got "); mpfr_dump (x); 125 exit (1); 126 } 127 128 mpfr_set_prec (x, 10); 129 mpfr_set_prec (y, 10); 130 mpfr_set_si (x, -2, MPFR_RNDN); 131 mpfr_eint (y, x, MPFR_RNDN); /* eint1(2) = 0.0489005107080611 */ 132 if (mpfr_cmp_si_2exp (y, -801, -14) != 0) 133 { 134 printf ("Error for x=-2, MPFR_RNDN\n"); 135 printf ("expected -801/2^14\n"); 136 printf ("got "); mpfr_dump (y); 137 exit (1); 138 } 139 140 /* check large x */ 141 mpfr_set_prec (x, 53); 142 mpfr_set_prec (y, 53); 143 mpfr_set_str_binary (x, "1E6"); 144 mpfr_eint (x, x, MPFR_RNDN); 145 mpfr_set_str_binary (y, "10100011110001101001110000110010111000100111010001E37"); 146 if (mpfr_cmp (x, y) != 0) 147 { 148 printf ("Error for x=2^6, MPFR_RNDN\n"); 149 printf ("expected "); mpfr_dump (y); 150 printf ("got "); mpfr_dump (x); 151 exit (1); 152 } 153 mpfr_set_str_binary (x, "1E7"); 154 mpfr_eint (x, x, MPFR_RNDN); 155 mpfr_set_str_binary (y, "11001100100011110000101001011010110111111011110011E128"); 156 if (mpfr_cmp (x, y) != 0) 157 { 158 printf ("Error for x=2^7, MPFR_RNDN\n"); 159 printf ("expected "); mpfr_dump (y); 160 printf ("got "); mpfr_dump (x); 161 exit (1); 162 } 163 mpfr_set_str_binary (x, "1E8"); 164 mpfr_eint (x, x, MPFR_RNDN); 165 mpfr_set_str_binary (y, "1010000110000101111111011011000101001000101011101001E310"); 166 if (mpfr_cmp (x, y) != 0) 167 { 168 printf ("Error for x=2^8, MPFR_RNDN\n"); 169 printf ("expected "); mpfr_dump (y); 170 printf ("got "); mpfr_dump (x); 171 exit (1); 172 } 173 mpfr_set_str_binary (x, "1E9"); 174 mpfr_eint (x, x, MPFR_RNDN); 175 mpfr_set_str_binary (y, "11001010101000001010101101110000010110011101110010101E677"); 176 if (mpfr_cmp (x, y) != 0) 177 { 178 printf ("Error for x=2^9, MPFR_RNDN\n"); 179 printf ("expected "); mpfr_dump (y); 180 printf ("got "); mpfr_dump (x); 181 exit (1); 182 } 183 mpfr_set_str_binary (x, "1E10"); 184 mpfr_eint (x, x, MPFR_RNDN); 185 mpfr_set_str_binary (y, "10011111111010010110110101101000101100101010101101101E1415"); 186 if (mpfr_cmp (x, y) != 0) 187 { 188 printf ("Error for x=2^10, MPFR_RNDN\n"); 189 printf ("expected "); mpfr_dump (y); 190 printf ("got "); mpfr_dump (x); 191 exit (1); 192 } 193 194 /* Run-time error at si_op.c:42:31 with r9996 on an x86-64 Linux machine, 195 using CFLAGS="-fsanitize=undefined -fno-sanitize-recover". */ 196 mpfr_set_prec (x, 32); 197 mpfr_set_prec (y, 46); 198 mpfr_set_si_2exp (x, -1, -1, MPFR_RNDN); 199 mpfr_eint (y, x, MPFR_RNDN); 200 201 mpfr_set_prec (x, 10); 202 mpfr_set_prec (y, 6); 203 mpfr_set_str (x, "-7.875", 10, MPFR_RNDN); 204 mpfr_eint (y, x, MPFR_RNDN); 205 if (mpfr_cmp_si_2exp (y, -45, -20) != 0) 206 { 207 printf ("Error for x=-7.875, MPFR_RNDN\n"); 208 printf ("expected -45/2^20\n"); 209 printf ("got "); mpfr_dump (y); 210 exit (1); 211 } 212 213 mpfr_clear (x); 214 mpfr_clear (y); 215} 216 217int 218main (int argc, char *argv[]) 219{ 220 tests_start_mpfr (); 221 222 if (argc != 1) /* teint x [prec] */ 223 { 224 mpfr_t x; 225 mpfr_prec_t p; 226 p = (argc < 3) ? 53 : atoi (argv[2]); 227 mpfr_init2 (x, p); 228 mpfr_set_str (x, argv[1], 10, MPFR_RNDN); 229 printf ("eint("); 230 mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); 231 printf (")="); 232 mpfr_eint (x, x, MPFR_RNDN); 233 mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); 234 printf ("\n"); 235 mpfr_clear (x); 236 } 237 else 238 { 239 check_specials (); 240 241 test_generic (MPFR_PREC_MIN, 100, 100); 242 } 243 244 tests_end_mpfr (); 245 return 0; 246} 247