1 1.1.1.2 mrg /* Test file for mpfr_div (and some mpfr_div_ui, etc. tests). 2 1.1 mrg 3 1.1.1.6 mrg Copyright 1999, 2001-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.1.2 mrg static void 26 1.1.1.5 mrg check_equal (mpfr_srcptr a, mpfr_srcptr a2, const char *s, 27 1.1.1.2 mrg mpfr_srcptr b, mpfr_srcptr c, mpfr_rnd_t r) 28 1.1.1.2 mrg { 29 1.1.1.4 mrg if (SAME_VAL (a, a2)) 30 1.1.1.4 mrg return; 31 1.1.1.4 mrg if (r == MPFR_RNDF) /* RNDF might return different values */ 32 1.1.1.2 mrg return; 33 1.1.1.2 mrg printf ("Error in %s\n", mpfr_print_rnd_mode (r)); 34 1.1.1.2 mrg printf ("b = "); 35 1.1.1.2 mrg mpfr_dump (b); 36 1.1.1.2 mrg printf ("c = "); 37 1.1.1.2 mrg mpfr_dump (c); 38 1.1.1.2 mrg printf ("mpfr_div result: "); 39 1.1.1.2 mrg mpfr_dump (a); 40 1.1.1.2 mrg printf ("%s result: ", s); 41 1.1.1.2 mrg mpfr_dump (a2); 42 1.1.1.2 mrg exit (1); 43 1.1.1.2 mrg } 44 1.1.1.2 mrg 45 1.1.1.2 mrg static int 46 1.1.1.2 mrg mpfr_all_div (mpfr_ptr a, mpfr_srcptr b, mpfr_srcptr c, mpfr_rnd_t r) 47 1.1.1.2 mrg { 48 1.1.1.2 mrg mpfr_t a2; 49 1.1.1.2 mrg unsigned int oldflags, newflags; 50 1.1.1.2 mrg int inex, inex2; 51 1.1.1.2 mrg 52 1.1.1.2 mrg oldflags = __gmpfr_flags; 53 1.1.1.2 mrg inex = mpfr_div (a, b, c, r); 54 1.1.1.2 mrg 55 1.1.1.4 mrg /* this test makes no sense for RNDF, since it compares the ternary value 56 1.1.1.4 mrg and the flags */ 57 1.1.1.4 mrg if (a == b || a == c || r == MPFR_RNDF) 58 1.1.1.2 mrg return inex; 59 1.1.1.2 mrg 60 1.1.1.2 mrg newflags = __gmpfr_flags; 61 1.1.1.2 mrg 62 1.1.1.2 mrg mpfr_init2 (a2, MPFR_PREC (a)); 63 1.1.1.2 mrg 64 1.1.1.2 mrg if (mpfr_integer_p (b) && ! (MPFR_IS_ZERO (b) && MPFR_IS_NEG (b))) 65 1.1.1.2 mrg { 66 1.1.1.2 mrg /* b is an integer, but not -0 (-0 is rejected as 67 1.1.1.2 mrg it becomes +0 when converted to an integer). */ 68 1.1.1.2 mrg if (mpfr_fits_ulong_p (b, MPFR_RNDA)) 69 1.1.1.2 mrg { 70 1.1.1.2 mrg __gmpfr_flags = oldflags; 71 1.1.1.2 mrg inex2 = mpfr_ui_div (a2, mpfr_get_ui (b, MPFR_RNDN), c, r); 72 1.1.1.5 mrg if (!SAME_SIGN (inex2, inex)) 73 1.1.1.5 mrg { 74 1.1.1.5 mrg printf ("Error for ternary value (rnd=%s), mpfr_div %d, mpfr_ui_div %d\n", 75 1.1.1.5 mrg mpfr_print_rnd_mode (r), inex, inex2); 76 1.1.1.5 mrg exit (1); 77 1.1.1.5 mrg } 78 1.1.1.5 mrg if (__gmpfr_flags != newflags) 79 1.1.1.5 mrg { 80 1.1.1.5 mrg printf ("Error for flags, mpfr_div %d, mpfr_ui_div %d\n", 81 1.1.1.5 mrg newflags, __gmpfr_flags); 82 1.1.1.5 mrg exit (1); 83 1.1.1.5 mrg } 84 1.1.1.2 mrg check_equal (a, a2, "mpfr_ui_div", b, c, r); 85 1.1.1.2 mrg } 86 1.1.1.2 mrg if (mpfr_fits_slong_p (b, MPFR_RNDA)) 87 1.1.1.2 mrg { 88 1.1.1.2 mrg __gmpfr_flags = oldflags; 89 1.1.1.2 mrg inex2 = mpfr_si_div (a2, mpfr_get_si (b, MPFR_RNDN), c, r); 90 1.1.1.2 mrg MPFR_ASSERTN (SAME_SIGN (inex2, inex)); 91 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == newflags); 92 1.1.1.2 mrg check_equal (a, a2, "mpfr_si_div", b, c, r); 93 1.1.1.2 mrg } 94 1.1.1.2 mrg } 95 1.1.1.2 mrg 96 1.1.1.2 mrg if (mpfr_integer_p (c) && ! (MPFR_IS_ZERO (c) && MPFR_IS_NEG (c))) 97 1.1.1.2 mrg { 98 1.1.1.2 mrg /* c is an integer, but not -0 (-0 is rejected as 99 1.1.1.2 mrg it becomes +0 when converted to an integer). */ 100 1.1.1.2 mrg if (mpfr_fits_ulong_p (c, MPFR_RNDA)) 101 1.1.1.2 mrg { 102 1.1.1.2 mrg __gmpfr_flags = oldflags; 103 1.1.1.2 mrg inex2 = mpfr_div_ui (a2, b, mpfr_get_ui (c, MPFR_RNDN), r); 104 1.1.1.2 mrg MPFR_ASSERTN (SAME_SIGN (inex2, inex)); 105 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == newflags); 106 1.1.1.2 mrg check_equal (a, a2, "mpfr_div_ui", b, c, r); 107 1.1.1.2 mrg } 108 1.1.1.2 mrg if (mpfr_fits_slong_p (c, MPFR_RNDA)) 109 1.1.1.2 mrg { 110 1.1.1.2 mrg __gmpfr_flags = oldflags; 111 1.1.1.2 mrg inex2 = mpfr_div_si (a2, b, mpfr_get_si (c, MPFR_RNDN), r); 112 1.1.1.2 mrg MPFR_ASSERTN (SAME_SIGN (inex2, inex)); 113 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == newflags); 114 1.1.1.2 mrg check_equal (a, a2, "mpfr_div_si", b, c, r); 115 1.1.1.2 mrg } 116 1.1.1.2 mrg } 117 1.1.1.2 mrg 118 1.1.1.2 mrg mpfr_clear (a2); 119 1.1.1.2 mrg 120 1.1.1.2 mrg return inex; 121 1.1.1.2 mrg } 122 1.1.1.2 mrg 123 1.1 mrg #ifdef CHECK_EXTERNAL 124 1.1 mrg static int 125 1.1 mrg test_div (mpfr_ptr a, mpfr_srcptr b, mpfr_srcptr c, mpfr_rnd_t rnd_mode) 126 1.1 mrg { 127 1.1 mrg int res; 128 1.1 mrg int ok = rnd_mode == MPFR_RNDN && mpfr_number_p (b) && mpfr_number_p (c); 129 1.1 mrg if (ok) 130 1.1 mrg { 131 1.1 mrg mpfr_print_raw (b); 132 1.1 mrg printf (" "); 133 1.1 mrg mpfr_print_raw (c); 134 1.1 mrg } 135 1.1.1.2 mrg res = mpfr_all_div (a, b, c, rnd_mode); 136 1.1 mrg if (ok) 137 1.1 mrg { 138 1.1 mrg printf (" "); 139 1.1 mrg mpfr_print_raw (a); 140 1.1 mrg printf ("\n"); 141 1.1 mrg } 142 1.1 mrg return res; 143 1.1 mrg } 144 1.1 mrg #else 145 1.1.1.2 mrg #define test_div mpfr_all_div 146 1.1 mrg #endif 147 1.1 mrg 148 1.1 mrg #define check53(n, d, rnd, res) check4(n, d, rnd, 53, res) 149 1.1 mrg 150 1.1 mrg /* return 0 iff a and b are of the same sign */ 151 1.1 mrg static int 152 1.1 mrg inex_cmp (int a, int b) 153 1.1 mrg { 154 1.1 mrg if (a > 0) 155 1.1 mrg return (b > 0) ? 0 : 1; 156 1.1 mrg else if (a == 0) 157 1.1 mrg return (b == 0) ? 0 : 1; 158 1.1 mrg else 159 1.1 mrg return (b < 0) ? 0 : 1; 160 1.1 mrg } 161 1.1 mrg 162 1.1 mrg static void 163 1.1 mrg check4 (const char *Ns, const char *Ds, mpfr_rnd_t rnd_mode, int p, 164 1.1 mrg const char *Qs) 165 1.1 mrg { 166 1.1 mrg mpfr_t q, n, d; 167 1.1 mrg 168 1.1 mrg mpfr_inits2 (p, q, n, d, (mpfr_ptr) 0); 169 1.1 mrg mpfr_set_str1 (n, Ns); 170 1.1 mrg mpfr_set_str1 (d, Ds); 171 1.1 mrg test_div(q, n, d, rnd_mode); 172 1.1 mrg if (mpfr_cmp_str (q, Qs, ((p==53) ? 10 : 2), MPFR_RNDN) ) 173 1.1 mrg { 174 1.1 mrg printf ("mpfr_div failed for n=%s, d=%s, p=%d, rnd_mode=%s\n", 175 1.1 mrg Ns, Ds, p, mpfr_print_rnd_mode (rnd_mode)); 176 1.1.1.4 mrg printf ("got "); 177 1.1.1.4 mrg mpfr_dump (q); 178 1.1 mrg mpfr_set_str (q, Qs, ((p==53) ? 10 : 2), MPFR_RNDN); 179 1.1.1.4 mrg printf ("expected "); 180 1.1.1.4 mrg mpfr_dump (q); 181 1.1 mrg exit (1); 182 1.1 mrg } 183 1.1 mrg mpfr_clears (q, n, d, (mpfr_ptr) 0); 184 1.1 mrg } 185 1.1 mrg 186 1.1 mrg static void 187 1.1 mrg check24 (const char *Ns, const char *Ds, mpfr_rnd_t rnd_mode, const char *Qs) 188 1.1 mrg { 189 1.1 mrg mpfr_t q, n, d; 190 1.1 mrg 191 1.1 mrg mpfr_inits2 (24, q, n, d, (mpfr_ptr) 0); 192 1.1 mrg 193 1.1 mrg mpfr_set_str1 (n, Ns); 194 1.1 mrg mpfr_set_str1 (d, Ds); 195 1.1 mrg test_div(q, n, d, rnd_mode); 196 1.1 mrg if (mpfr_cmp_str1 (q, Qs) ) 197 1.1 mrg { 198 1.1 mrg printf ("mpfr_div failed for n=%s, d=%s, prec=24, rnd_mode=%s\n", 199 1.1 mrg Ns, Ds, mpfr_print_rnd_mode(rnd_mode)); 200 1.1 mrg printf ("expected quotient is %s, got ", Qs); 201 1.1 mrg mpfr_out_str(stdout,10,0,q, MPFR_RNDN); putchar('\n'); 202 1.1 mrg exit (1); 203 1.1 mrg } 204 1.1 mrg mpfr_clears (q, n, d, (mpfr_ptr) 0); 205 1.1 mrg } 206 1.1 mrg 207 1.1 mrg /* the following examples come from the paper "Number-theoretic Test 208 1.1 mrg Generation for Directed Rounding" from Michael Parks, Table 2 */ 209 1.1 mrg static void 210 1.1 mrg check_float(void) 211 1.1 mrg { 212 1.1 mrg check24("70368760954880.0", "8388609.0", MPFR_RNDN, "8.388609e6"); 213 1.1 mrg check24("140737479966720.0", "16777213.0", MPFR_RNDN, "8.388609e6"); 214 1.1 mrg check24("70368777732096.0", "8388611.0", MPFR_RNDN, "8.388609e6"); 215 1.1 mrg check24("105553133043712.0", "12582911.0", MPFR_RNDN, "8.38861e6"); 216 1.1 mrg /* the exponent for the following example was forgotten in 217 1.1 mrg the Arith'14 version of Parks' paper */ 218 1.1 mrg check24 ("12582913.0", "12582910.0", MPFR_RNDN, "1.000000238"); 219 1.1 mrg check24 ("105553124655104.0", "12582910.0", MPFR_RNDN, "8388610.0"); 220 1.1 mrg check24("140737479966720.0", "8388609.0", MPFR_RNDN, "1.6777213e7"); 221 1.1 mrg check24("70368777732096.0", "8388609.0", MPFR_RNDN, "8.388611e6"); 222 1.1 mrg check24("105553133043712.0", "8388610.0", MPFR_RNDN, "1.2582911e7"); 223 1.1 mrg check24("105553124655104.0", "8388610.0", MPFR_RNDN, "1.258291e7"); 224 1.1 mrg 225 1.1 mrg check24("70368760954880.0", "8388609.0", MPFR_RNDZ, "8.388608e6"); 226 1.1 mrg check24("140737479966720.0", "16777213.0", MPFR_RNDZ, "8.388609e6"); 227 1.1 mrg check24("70368777732096.0", "8388611.0", MPFR_RNDZ, "8.388608e6"); 228 1.1 mrg check24("105553133043712.0", "12582911.0", MPFR_RNDZ, "8.38861e6"); 229 1.1 mrg check24("12582913.0", "12582910.0", MPFR_RNDZ, "1.000000238"); 230 1.1 mrg check24 ("105553124655104.0", "12582910.0", MPFR_RNDZ, "8388610.0"); 231 1.1 mrg check24("140737479966720.0", "8388609.0", MPFR_RNDZ, "1.6777213e7"); 232 1.1 mrg check24("70368777732096.0", "8388609.0", MPFR_RNDZ, "8.38861e6"); 233 1.1 mrg check24("105553133043712.0", "8388610.0", MPFR_RNDZ, "1.2582911e7"); 234 1.1 mrg check24("105553124655104.0", "8388610.0", MPFR_RNDZ, "1.258291e7"); 235 1.1 mrg 236 1.1 mrg check24("70368760954880.0", "8388609.0", MPFR_RNDU, "8.388609e6"); 237 1.1 mrg check24("140737479966720.0", "16777213.0", MPFR_RNDU, "8.38861e6"); 238 1.1 mrg check24("70368777732096.0", "8388611.0", MPFR_RNDU, "8.388609e6"); 239 1.1 mrg check24("105553133043712.0", "12582911.0", MPFR_RNDU, "8.388611e6"); 240 1.1 mrg check24("12582913.0", "12582910.0", MPFR_RNDU, "1.000000357"); 241 1.1 mrg check24 ("105553124655104.0", "12582910.0", MPFR_RNDU, "8388611.0"); 242 1.1 mrg check24("140737479966720.0", "8388609.0", MPFR_RNDU, "1.6777214e7"); 243 1.1 mrg check24("70368777732096.0", "8388609.0", MPFR_RNDU, "8.388611e6"); 244 1.1 mrg check24("105553133043712.0", "8388610.0", MPFR_RNDU, "1.2582912e7"); 245 1.1 mrg check24("105553124655104.0", "8388610.0", MPFR_RNDU, "1.2582911e7"); 246 1.1 mrg 247 1.1 mrg check24("70368760954880.0", "8388609.0", MPFR_RNDD, "8.388608e6"); 248 1.1 mrg check24("140737479966720.0", "16777213.0", MPFR_RNDD, "8.388609e6"); 249 1.1 mrg check24("70368777732096.0", "8388611.0", MPFR_RNDD, "8.388608e6"); 250 1.1 mrg check24("105553133043712.0", "12582911.0", MPFR_RNDD, "8.38861e6"); 251 1.1 mrg check24("12582913.0", "12582910.0", MPFR_RNDD, "1.000000238"); 252 1.1 mrg check24 ("105553124655104.0", "12582910.0", MPFR_RNDD, "8388610.0"); 253 1.1 mrg check24("140737479966720.0", "8388609.0", MPFR_RNDD, "1.6777213e7"); 254 1.1 mrg check24("70368777732096.0", "8388609.0", MPFR_RNDD, "8.38861e6"); 255 1.1 mrg check24("105553133043712.0", "8388610.0", MPFR_RNDD, "1.2582911e7"); 256 1.1 mrg check24("105553124655104.0", "8388610.0", MPFR_RNDD, "1.258291e7"); 257 1.1 mrg 258 1.1 mrg check24("70368760954880.0", "8388609.0", MPFR_RNDA, "8.388609e6"); 259 1.1 mrg } 260 1.1 mrg 261 1.1 mrg static void 262 1.1 mrg check_double(void) 263 1.1 mrg { 264 1.1 mrg check53("0.0", "1.0", MPFR_RNDZ, "0.0"); 265 1.1 mrg check53("-7.4988969224688591e63", "4.8816866450288732e306", MPFR_RNDD, 266 1.1 mrg "-1.5361282826510687291e-243"); 267 1.1 mrg check53("-1.33225773037748601769e+199", "3.63449540676937123913e+79", 268 1.1 mrg MPFR_RNDZ, "-3.6655920045905428978e119"); 269 1.1 mrg check53("9.89438396044940256501e-134", "5.93472984109987421717e-67",MPFR_RNDU, 270 1.1 mrg "1.6672003992376663654e-67"); 271 1.1 mrg check53("9.89438396044940256501e-134", "5.93472984109987421717e-67",MPFR_RNDA, 272 1.1 mrg "1.6672003992376663654e-67"); 273 1.1 mrg check53("9.89438396044940256501e-134", "-5.93472984109987421717e-67", 274 1.1 mrg MPFR_RNDU, "-1.6672003992376663654e-67"); 275 1.1 mrg check53("-4.53063926135729747564e-308", "7.02293374921793516813e-84", 276 1.1 mrg MPFR_RNDD, "-6.4512060388748850857e-225"); 277 1.1 mrg check53("6.25089225176473806123e-01","-2.35527154824420243364e-230", 278 1.1 mrg MPFR_RNDD, "-2.6540006635008291192e229"); 279 1.1 mrg check53("6.25089225176473806123e-01","-2.35527154824420243364e-230", 280 1.1 mrg MPFR_RNDA, "-2.6540006635008291192e229"); 281 1.1 mrg check53("6.52308934689126e15", "-1.62063546601505417497e273", MPFR_RNDN, 282 1.1 mrg "-4.0250194961676020848e-258"); 283 1.1 mrg check53("1.04636807108079349236e-189", "3.72295730823253012954e-292", 284 1.1 mrg MPFR_RNDZ, "2.810583051186143125e102"); 285 1.1 mrg /* problems found by Kevin under HP-PA */ 286 1.1 mrg check53 ("2.861044553323177e-136", "-1.1120354257068143e+45", MPFR_RNDZ, 287 1.1 mrg "-2.5727998292003016e-181"); 288 1.1 mrg check53 ("-4.0559157245809205e-127", "-1.1237723844524865e+77", MPFR_RNDN, 289 1.1 mrg "3.6091968273068081e-204"); 290 1.1 mrg check53 ("-1.8177943561493235e-93", "-8.51233984260364e-104", MPFR_RNDU, 291 1.1 mrg "2.1354814184595821e+10"); 292 1.1 mrg } 293 1.1 mrg 294 1.1 mrg static void 295 1.1 mrg check_64(void) 296 1.1 mrg { 297 1.1 mrg mpfr_t x,y,z; 298 1.1 mrg 299 1.1 mrg mpfr_inits2 (64, x, y, z, (mpfr_ptr) 0); 300 1.1 mrg 301 1.1 mrg mpfr_set_str_binary(x, "1.00100100110110101001010010101111000001011100100101010000000000E54"); 302 1.1 mrg mpfr_set_str_binary(y, "1.00000000000000000000000000000000000000000000000000000000000000E584"); 303 1.1 mrg test_div(z, x, y, MPFR_RNDU); 304 1.1 mrg if (mpfr_cmp_str (z, "0.1001001001101101010010100101011110000010111001001010100000000000E-529", 2, MPFR_RNDN)) 305 1.1 mrg { 306 1.1.1.4 mrg printf ("Error for tdiv for MPFR_RNDU and p=64\nx="); 307 1.1.1.4 mrg mpfr_dump (x); 308 1.1.1.4 mrg printf ("y="); 309 1.1.1.4 mrg mpfr_dump (y); 310 1.1.1.4 mrg printf ("got "); 311 1.1.1.4 mrg mpfr_dump (z); 312 1.1.1.4 mrg printf ("expected 0.1001001001101101010010100101011110000010111001001010100000000000E-529\n"); 313 1.1.1.4 mrg exit (1); 314 1.1 mrg } 315 1.1 mrg 316 1.1 mrg mpfr_clears (x, y, z, (mpfr_ptr) 0); 317 1.1 mrg } 318 1.1 mrg 319 1.1 mrg static void 320 1.1 mrg check_convergence (void) 321 1.1 mrg { 322 1.1 mrg mpfr_t x, y; int i, j; 323 1.1 mrg 324 1.1 mrg mpfr_init2(x, 130); 325 1.1 mrg mpfr_set_str_binary(x, "0.1011111101011010101000001010011111101000011100011101010011111011000011001010000000111100100111110011001010110100100001001000111001E6944"); 326 1.1 mrg mpfr_init2(y, 130); 327 1.1 mrg mpfr_set_ui(y, 5, MPFR_RNDN); 328 1.1 mrg test_div(x, x, y, MPFR_RNDD); /* exact division */ 329 1.1 mrg 330 1.1 mrg mpfr_set_prec(x, 64); 331 1.1 mrg mpfr_set_prec(y, 64); 332 1.1 mrg mpfr_set_str_binary(x, "0.10010010011011010100101001010111100000101110010010101E55"); 333 1.1 mrg mpfr_set_str_binary(y, "0.1E585"); 334 1.1 mrg test_div(x, x, y, MPFR_RNDN); 335 1.1 mrg mpfr_set_str_binary(y, "0.10010010011011010100101001010111100000101110010010101E-529"); 336 1.1 mrg if (mpfr_cmp (x, y)) 337 1.1 mrg { 338 1.1 mrg printf ("Error in mpfr_div for prec=64, rnd=MPFR_RNDN\n"); 339 1.1.1.4 mrg printf ("got "); mpfr_dump (x); 340 1.1.1.4 mrg printf ("instead of "); mpfr_dump (y); 341 1.1 mrg exit(1); 342 1.1 mrg } 343 1.1 mrg 344 1.1 mrg for (i=32; i<=64; i+=32) 345 1.1 mrg { 346 1.1 mrg mpfr_set_prec(x, i); 347 1.1 mrg mpfr_set_prec(y, i); 348 1.1 mrg mpfr_set_ui(x, 1, MPFR_RNDN); 349 1.1 mrg RND_LOOP(j) 350 1.1 mrg { 351 1.1 mrg mpfr_set_ui (y, 1, MPFR_RNDN); 352 1.1 mrg test_div (y, x, y, (mpfr_rnd_t) j); 353 1.1 mrg if (mpfr_cmp_ui (y, 1)) 354 1.1 mrg { 355 1.1 mrg printf ("mpfr_div failed for x=1.0, y=1.0, prec=%d rnd=%s\n", 356 1.1 mrg i, mpfr_print_rnd_mode ((mpfr_rnd_t) j)); 357 1.1.1.4 mrg printf ("got "); mpfr_dump (y); 358 1.1 mrg exit (1); 359 1.1 mrg } 360 1.1 mrg } 361 1.1 mrg } 362 1.1 mrg 363 1.1 mrg mpfr_clear (x); 364 1.1 mrg mpfr_clear (y); 365 1.1 mrg } 366 1.1 mrg 367 1.1 mrg #define KMAX 10000 368 1.1 mrg 369 1.1 mrg /* given y = o(x/u), x, u, find the inexact flag by 370 1.1 mrg multiplying y by u */ 371 1.1 mrg static int 372 1.1.1.6 mrg get_inexact (mpfr_ptr y, mpfr_ptr x, mpfr_ptr u) 373 1.1 mrg { 374 1.1 mrg mpfr_t xx; 375 1.1 mrg int inex; 376 1.1 mrg mpfr_init2 (xx, mpfr_get_prec (y) + mpfr_get_prec (u)); 377 1.1 mrg mpfr_mul (xx, y, u, MPFR_RNDN); /* exact */ 378 1.1 mrg inex = mpfr_cmp (xx, x); 379 1.1 mrg mpfr_clear (xx); 380 1.1 mrg return inex; 381 1.1 mrg } 382 1.1 mrg 383 1.1 mrg static void 384 1.1 mrg check_hard (void) 385 1.1 mrg { 386 1.1 mrg mpfr_t u, v, q, q2; 387 1.1 mrg mpfr_prec_t precu, precv, precq; 388 1.1 mrg int rnd; 389 1.1 mrg int inex, inex2, i, j; 390 1.1 mrg 391 1.1 mrg mpfr_init (q); 392 1.1 mrg mpfr_init (q2); 393 1.1 mrg mpfr_init (u); 394 1.1 mrg mpfr_init (v); 395 1.1 mrg 396 1.1 mrg for (precq = MPFR_PREC_MIN; precq <= 64; precq ++) 397 1.1 mrg { 398 1.1 mrg mpfr_set_prec (q, precq); 399 1.1 mrg mpfr_set_prec (q2, precq + 1); 400 1.1 mrg for (j = 0; j < 2; j++) 401 1.1 mrg { 402 1.1 mrg if (j == 0) 403 1.1 mrg { 404 1.1 mrg do 405 1.1 mrg { 406 1.1 mrg mpfr_urandomb (q2, RANDS); 407 1.1 mrg } 408 1.1 mrg while (mpfr_cmp_ui (q2, 0) == 0); 409 1.1 mrg } 410 1.1 mrg else /* use q2=1 */ 411 1.1 mrg mpfr_set_ui (q2, 1, MPFR_RNDN); 412 1.1 mrg for (precv = precq; precv <= 10 * precq; precv += precq) 413 1.1 mrg { 414 1.1 mrg mpfr_set_prec (v, precv); 415 1.1 mrg do 416 1.1 mrg { 417 1.1 mrg mpfr_urandomb (v, RANDS); 418 1.1 mrg } 419 1.1 mrg while (mpfr_cmp_ui (v, 0) == 0); 420 1.1 mrg for (precu = precq; precu <= 10 * precq; precu += precq) 421 1.1 mrg { 422 1.1 mrg mpfr_set_prec (u, precu); 423 1.1 mrg mpfr_mul (u, v, q2, MPFR_RNDN); 424 1.1 mrg mpfr_nextbelow (u); 425 1.1 mrg for (i = 0; i <= 2; i++) 426 1.1 mrg { 427 1.1.1.4 mrg RND_LOOP_NO_RNDF (rnd) 428 1.1 mrg { 429 1.1 mrg inex = test_div (q, u, v, (mpfr_rnd_t) rnd); 430 1.1 mrg inex2 = get_inexact (q, u, v); 431 1.1 mrg if (inex_cmp (inex, inex2)) 432 1.1 mrg { 433 1.1 mrg printf ("Wrong inexact flag for rnd=%s: expected %d, got %d\n", 434 1.1 mrg mpfr_print_rnd_mode ((mpfr_rnd_t) rnd), inex2, inex); 435 1.1 mrg printf ("u= "); mpfr_dump (u); 436 1.1 mrg printf ("v= "); mpfr_dump (v); 437 1.1 mrg printf ("q= "); mpfr_dump (q); 438 1.1 mrg mpfr_set_prec (q2, precq + precv); 439 1.1 mrg mpfr_mul (q2, q, v, MPFR_RNDN); 440 1.1 mrg printf ("q*v="); mpfr_dump (q2); 441 1.1 mrg exit (1); 442 1.1 mrg } 443 1.1 mrg } 444 1.1 mrg mpfr_nextabove (u); 445 1.1 mrg } 446 1.1 mrg } 447 1.1 mrg } 448 1.1 mrg } 449 1.1 mrg } 450 1.1 mrg 451 1.1 mrg mpfr_clear (q); 452 1.1 mrg mpfr_clear (q2); 453 1.1 mrg mpfr_clear (u); 454 1.1 mrg mpfr_clear (v); 455 1.1 mrg } 456 1.1 mrg 457 1.1 mrg static void 458 1.1 mrg check_lowr (void) 459 1.1 mrg { 460 1.1 mrg mpfr_t x, y, z, z2, z3, tmp; 461 1.1 mrg int k, c, c2; 462 1.1 mrg 463 1.1 mrg 464 1.1 mrg mpfr_init2 (x, 1000); 465 1.1 mrg mpfr_init2 (y, 100); 466 1.1 mrg mpfr_init2 (tmp, 850); 467 1.1 mrg mpfr_init2 (z, 10); 468 1.1 mrg mpfr_init2 (z2, 10); 469 1.1 mrg mpfr_init2 (z3, 50); 470 1.1 mrg 471 1.1 mrg for (k = 1; k < KMAX; k++) 472 1.1 mrg { 473 1.1 mrg do 474 1.1 mrg { 475 1.1 mrg mpfr_urandomb (z, RANDS); 476 1.1 mrg } 477 1.1 mrg while (mpfr_cmp_ui (z, 0) == 0); 478 1.1 mrg do 479 1.1 mrg { 480 1.1 mrg mpfr_urandomb (tmp, RANDS); 481 1.1 mrg } 482 1.1 mrg while (mpfr_cmp_ui (tmp, 0) == 0); 483 1.1 mrg mpfr_mul (x, z, tmp, MPFR_RNDN); /* exact */ 484 1.1 mrg c = test_div (z2, x, tmp, MPFR_RNDN); 485 1.1 mrg 486 1.1 mrg if (c || mpfr_cmp (z2, z)) 487 1.1 mrg { 488 1.1 mrg printf ("Error in mpfr_div rnd=MPFR_RNDN\n"); 489 1.1.1.4 mrg printf ("got "); mpfr_dump (z2); 490 1.1.1.4 mrg printf ("instead of "); mpfr_dump (z); 491 1.1 mrg printf ("inex flag = %d, expected 0\n", c); 492 1.1 mrg exit (1); 493 1.1 mrg } 494 1.1 mrg } 495 1.1 mrg 496 1.1 mrg /* x has still precision 1000, z precision 10, and tmp prec 850 */ 497 1.1 mrg mpfr_set_prec (z2, 9); 498 1.1 mrg for (k = 1; k < KMAX; k++) 499 1.1 mrg { 500 1.1 mrg mpfr_urandomb (z, RANDS); 501 1.1 mrg do 502 1.1 mrg { 503 1.1 mrg mpfr_urandomb (tmp, RANDS); 504 1.1 mrg } 505 1.1 mrg while (mpfr_cmp_ui (tmp, 0) == 0); 506 1.1 mrg mpfr_mul (x, z, tmp, MPFR_RNDN); /* exact */ 507 1.1 mrg c = test_div (z2, x, tmp, MPFR_RNDN); 508 1.1 mrg /* since z2 has one less bit that z, either the division is exact 509 1.1 mrg if z is representable on 9 bits, or we have an even round case */ 510 1.1 mrg 511 1.1 mrg c2 = get_inexact (z2, x, tmp); 512 1.1 mrg if ((mpfr_cmp (z2, z) == 0 && c) || inex_cmp (c, c2)) 513 1.1 mrg { 514 1.1 mrg printf ("Error in mpfr_div rnd=MPFR_RNDN\n"); 515 1.1.1.4 mrg printf ("got "); mpfr_dump (z2); 516 1.1.1.4 mrg printf ("instead of "); mpfr_dump (z); 517 1.1 mrg printf ("inex flag = %d, expected %d\n", c, c2); 518 1.1 mrg exit (1); 519 1.1 mrg } 520 1.1 mrg else if (c == 2) 521 1.1 mrg { 522 1.1 mrg mpfr_nexttoinf (z); 523 1.1 mrg if (mpfr_cmp(z2, z)) 524 1.1 mrg { 525 1.1 mrg printf ("Error in mpfr_div [even rnd?] rnd=MPFR_RNDN\n"); 526 1.1 mrg printf ("Dividing "); 527 1.1.1.4 mrg printf ("got "); mpfr_dump (z2); 528 1.1.1.4 mrg printf ("instead of "); mpfr_dump (z); 529 1.1 mrg printf ("inex flag = %d\n", 1); 530 1.1 mrg exit (1); 531 1.1 mrg } 532 1.1 mrg } 533 1.1 mrg else if (c == -2) 534 1.1 mrg { 535 1.1 mrg mpfr_nexttozero (z); 536 1.1 mrg if (mpfr_cmp(z2, z)) 537 1.1 mrg { 538 1.1 mrg printf ("Error in mpfr_div [even rnd?] rnd=MPFR_RNDN\n"); 539 1.1 mrg printf ("Dividing "); 540 1.1.1.4 mrg printf ("got "); mpfr_dump (z2); 541 1.1.1.4 mrg printf ("instead of "); mpfr_dump (z); 542 1.1 mrg printf ("inex flag = %d\n", 1); 543 1.1 mrg exit (1); 544 1.1 mrg } 545 1.1 mrg } 546 1.1 mrg } 547 1.1 mrg 548 1.1 mrg mpfr_set_prec(x, 1000); 549 1.1 mrg mpfr_set_prec(y, 100); 550 1.1 mrg mpfr_set_prec(tmp, 850); 551 1.1 mrg mpfr_set_prec(z, 10); 552 1.1 mrg mpfr_set_prec(z2, 10); 553 1.1 mrg 554 1.1 mrg /* almost exact divisions */ 555 1.1 mrg for (k = 1; k < KMAX; k++) 556 1.1 mrg { 557 1.1 mrg do 558 1.1 mrg { 559 1.1 mrg mpfr_urandomb (z, RANDS); 560 1.1 mrg } 561 1.1 mrg while (mpfr_cmp_ui (z, 0) == 0); 562 1.1 mrg do 563 1.1 mrg { 564 1.1 mrg mpfr_urandomb (tmp, RANDS); 565 1.1 mrg } 566 1.1 mrg while (mpfr_cmp_ui (tmp, 0) == 0); 567 1.1 mrg mpfr_mul(x, z, tmp, MPFR_RNDN); 568 1.1 mrg mpfr_set(y, tmp, MPFR_RNDD); 569 1.1 mrg mpfr_nexttoinf (x); 570 1.1 mrg 571 1.1 mrg c = test_div(z2, x, y, MPFR_RNDD); 572 1.1 mrg test_div(z3, x, y, MPFR_RNDD); 573 1.1 mrg mpfr_set(z, z3, MPFR_RNDD); 574 1.1 mrg 575 1.1 mrg if (c != -1 || mpfr_cmp(z2, z)) 576 1.1 mrg { 577 1.1 mrg printf ("Error in mpfr_div rnd=MPFR_RNDD\n"); 578 1.1.1.4 mrg printf ("got "); mpfr_dump (z2); 579 1.1.1.4 mrg printf ("instead of "); mpfr_dump (z); 580 1.1 mrg printf ("inex flag = %d\n", c); 581 1.1 mrg exit (1); 582 1.1 mrg } 583 1.1 mrg 584 1.1 mrg mpfr_set (y, tmp, MPFR_RNDU); 585 1.1 mrg test_div (z3, x, y, MPFR_RNDU); 586 1.1 mrg mpfr_set (z, z3, MPFR_RNDU); 587 1.1 mrg c = test_div (z2, x, y, MPFR_RNDU); 588 1.1 mrg if (c != 1 || mpfr_cmp (z2, z)) 589 1.1 mrg { 590 1.1 mrg printf ("Error in mpfr_div rnd=MPFR_RNDU\n"); 591 1.1 mrg printf ("u="); mpfr_dump (x); 592 1.1 mrg printf ("v="); mpfr_dump (y); 593 1.1.1.4 mrg printf ("got "); mpfr_dump (z2); 594 1.1.1.4 mrg printf ("instead of "); mpfr_dump (z); 595 1.1 mrg printf ("inex flag = %d\n", c); 596 1.1 mrg exit (1); 597 1.1 mrg } 598 1.1 mrg } 599 1.1 mrg 600 1.1 mrg mpfr_clear (x); 601 1.1 mrg mpfr_clear (y); 602 1.1 mrg mpfr_clear (z); 603 1.1 mrg mpfr_clear (z2); 604 1.1 mrg mpfr_clear (z3); 605 1.1 mrg mpfr_clear (tmp); 606 1.1 mrg } 607 1.1 mrg 608 1.1 mrg #define MAX_PREC 128 609 1.1 mrg 610 1.1 mrg static void 611 1.1 mrg check_inexact (void) 612 1.1 mrg { 613 1.1 mrg mpfr_t x, y, z, u; 614 1.1 mrg mpfr_prec_t px, py, pu; 615 1.1 mrg int inexact, cmp; 616 1.1 mrg mpfr_rnd_t rnd; 617 1.1 mrg 618 1.1 mrg mpfr_init (x); 619 1.1 mrg mpfr_init (y); 620 1.1 mrg mpfr_init (z); 621 1.1 mrg mpfr_init (u); 622 1.1 mrg 623 1.1 mrg mpfr_set_prec (x, 28); 624 1.1 mrg mpfr_set_prec (y, 28); 625 1.1 mrg mpfr_set_prec (z, 1023); 626 1.1 mrg mpfr_set_str_binary (x, "0.1000001001101101111100010011E0"); 627 1.1 mrg mpfr_set_str (z, "48284762641021308813686974720835219181653367326353400027913400579340343320519877153813133510034402932651132854764198688352364361009429039801248971901380781746767119334993621199563870113045276395603170432175354501451429471578325545278975153148347684600400321033502982713296919861760382863826626093689036010394", 10, MPFR_RNDN); 628 1.1 mrg mpfr_div (x, x, z, MPFR_RNDN); 629 1.1 mrg mpfr_set_str_binary (y, "0.1111001011001101001001111100E-1023"); 630 1.1 mrg if (mpfr_cmp (x, y)) 631 1.1 mrg { 632 1.1 mrg printf ("Error in mpfr_div for prec=28, RNDN\n"); 633 1.1 mrg printf ("Expected "); mpfr_dump (y); 634 1.1 mrg printf ("Got "); mpfr_dump (x); 635 1.1 mrg exit (1); 636 1.1 mrg } 637 1.1 mrg 638 1.1 mrg mpfr_set_prec (x, 53); 639 1.1 mrg mpfr_set_str_binary (x, "0.11101100110010100011011000000100001111011111110010101E0"); 640 1.1 mrg mpfr_set_prec (u, 127); 641 1.1 mrg mpfr_set_str_binary (u, "0.1000001100110110110101110110101101111000110000001111111110000000011111001010110100110010111111111101000001011011101011101101000E-2"); 642 1.1 mrg mpfr_set_prec (y, 95); 643 1.1 mrg inexact = test_div (y, x, u, MPFR_RNDN); 644 1.1 mrg if (inexact != (cmp = get_inexact (y, x, u))) 645 1.1 mrg { 646 1.1 mrg printf ("Wrong inexact flag (0): expected %d, got %d\n", cmp, inexact); 647 1.1 mrg printf ("x="); mpfr_out_str (stdout, 10, 99, x, MPFR_RNDN); printf ("\n"); 648 1.1 mrg printf ("u="); mpfr_out_str (stdout, 10, 99, u, MPFR_RNDN); printf ("\n"); 649 1.1 mrg printf ("y="); mpfr_out_str (stdout, 10, 99, y, MPFR_RNDN); printf ("\n"); 650 1.1 mrg exit (1); 651 1.1 mrg } 652 1.1 mrg 653 1.1 mrg mpfr_set_prec (x, 33); 654 1.1 mrg mpfr_set_str_binary (x, "0.101111100011011101010011101100001E0"); 655 1.1 mrg mpfr_set_prec (u, 2); 656 1.1 mrg mpfr_set_str_binary (u, "0.1E0"); 657 1.1 mrg mpfr_set_prec (y, 28); 658 1.1.1.3 mrg inexact = test_div (y, x, u, MPFR_RNDN); 659 1.1.1.3 mrg if (inexact >= 0) 660 1.1 mrg { 661 1.1 mrg printf ("Wrong inexact flag (1): expected -1, got %d\n", 662 1.1 mrg inexact); 663 1.1 mrg exit (1); 664 1.1 mrg } 665 1.1 mrg 666 1.1 mrg mpfr_set_prec (x, 129); 667 1.1 mrg mpfr_set_str_binary (x, "0.111110101111001100000101011100101100110011011101010001000110110101100101000010000001110110100001101010001010100010001111001101010E-2"); 668 1.1 mrg mpfr_set_prec (u, 15); 669 1.1 mrg mpfr_set_str_binary (u, "0.101101000001100E-1"); 670 1.1 mrg mpfr_set_prec (y, 92); 671 1.1.1.3 mrg inexact = test_div (y, x, u, MPFR_RNDN); 672 1.1.1.3 mrg if (inexact <= 0) 673 1.1 mrg { 674 1.1 mrg printf ("Wrong inexact flag for rnd=MPFR_RNDN(1): expected 1, got %d\n", 675 1.1 mrg inexact); 676 1.1 mrg mpfr_dump (x); 677 1.1 mrg mpfr_dump (u); 678 1.1 mrg mpfr_dump (y); 679 1.1 mrg exit (1); 680 1.1 mrg } 681 1.1 mrg 682 1.1 mrg for (px=2; px<MAX_PREC; px++) 683 1.1 mrg { 684 1.1 mrg mpfr_set_prec (x, px); 685 1.1 mrg mpfr_urandomb (x, RANDS); 686 1.1 mrg for (pu=2; pu<=MAX_PREC; pu++) 687 1.1 mrg { 688 1.1 mrg mpfr_set_prec (u, pu); 689 1.1 mrg do { mpfr_urandomb (u, RANDS); } while (mpfr_cmp_ui (u, 0) == 0); 690 1.1 mrg { 691 1.1 mrg py = MPFR_PREC_MIN + (randlimb () % (MAX_PREC - MPFR_PREC_MIN)); 692 1.1 mrg mpfr_set_prec (y, py); 693 1.1 mrg mpfr_set_prec (z, py + pu); 694 1.1 mrg { 695 1.1.1.4 mrg /* inexact is undefined for RNDF */ 696 1.1.1.4 mrg rnd = RND_RAND_NO_RNDF (); 697 1.1 mrg inexact = test_div (y, x, u, rnd); 698 1.1 mrg if (mpfr_mul (z, y, u, rnd)) 699 1.1 mrg { 700 1.1 mrg printf ("z <- y * u should be exact\n"); 701 1.1 mrg exit (1); 702 1.1 mrg } 703 1.1 mrg cmp = mpfr_cmp (z, x); 704 1.1 mrg if (((inexact == 0) && (cmp != 0)) || 705 1.1 mrg ((inexact > 0) && (cmp <= 0)) || 706 1.1 mrg ((inexact < 0) && (cmp >= 0))) 707 1.1 mrg { 708 1.1 mrg printf ("Wrong inexact flag for rnd=%s\n", 709 1.1 mrg mpfr_print_rnd_mode(rnd)); 710 1.1 mrg printf ("expected %d, got %d\n", cmp, inexact); 711 1.1.1.4 mrg printf ("x="); mpfr_dump (x); 712 1.1.1.4 mrg printf ("u="); mpfr_dump (u); 713 1.1.1.4 mrg printf ("y="); mpfr_dump (y); 714 1.1.1.4 mrg printf ("y*u="); mpfr_dump (z); 715 1.1 mrg exit (1); 716 1.1 mrg } 717 1.1 mrg } 718 1.1 mrg } 719 1.1 mrg } 720 1.1 mrg } 721 1.1 mrg 722 1.1 mrg mpfr_clear (x); 723 1.1 mrg mpfr_clear (y); 724 1.1 mrg mpfr_clear (z); 725 1.1 mrg mpfr_clear (u); 726 1.1 mrg } 727 1.1 mrg 728 1.1 mrg static void 729 1.1.1.2 mrg check_special (void) 730 1.1 mrg { 731 1.1 mrg mpfr_t a, d, q; 732 1.1 mrg mpfr_exp_t emax, emin; 733 1.1 mrg int i; 734 1.1 mrg 735 1.1 mrg mpfr_init2 (a, 100L); 736 1.1 mrg mpfr_init2 (d, 100L); 737 1.1 mrg mpfr_init2 (q, 100L); 738 1.1 mrg 739 1.1 mrg /* 1/nan == nan */ 740 1.1 mrg mpfr_set_ui (a, 1L, MPFR_RNDN); 741 1.1 mrg MPFR_SET_NAN (d); 742 1.1.1.2 mrg mpfr_clear_flags (); 743 1.1 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */ 744 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_NAN); 745 1.1 mrg 746 1.1 mrg /* nan/1 == nan */ 747 1.1 mrg MPFR_SET_NAN (a); 748 1.1 mrg mpfr_set_ui (d, 1L, MPFR_RNDN); 749 1.1.1.2 mrg mpfr_clear_flags (); 750 1.1 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */ 751 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_NAN); 752 1.1 mrg 753 1.1 mrg /* +inf/1 == +inf */ 754 1.1 mrg MPFR_SET_INF (a); 755 1.1 mrg MPFR_SET_POS (a); 756 1.1 mrg mpfr_set_ui (d, 1L, MPFR_RNDN); 757 1.1.1.2 mrg mpfr_clear_flags (); 758 1.1.1.2 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */ 759 1.1.1.2 mrg MPFR_ASSERTN (mpfr_inf_p (q)); 760 1.1.1.2 mrg MPFR_ASSERTN (mpfr_sgn (q) > 0); 761 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == 0); 762 1.1.1.2 mrg 763 1.1.1.2 mrg /* +inf/-1 == -inf */ 764 1.1.1.2 mrg MPFR_SET_INF (a); 765 1.1.1.2 mrg MPFR_SET_POS (a); 766 1.1.1.2 mrg mpfr_set_si (d, -1, MPFR_RNDN); 767 1.1.1.2 mrg mpfr_clear_flags (); 768 1.1.1.2 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */ 769 1.1.1.2 mrg MPFR_ASSERTN (mpfr_inf_p (q)); 770 1.1.1.2 mrg MPFR_ASSERTN (mpfr_sgn (q) < 0); 771 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == 0); 772 1.1.1.2 mrg 773 1.1.1.2 mrg /* -inf/1 == -inf */ 774 1.1.1.2 mrg MPFR_SET_INF (a); 775 1.1.1.2 mrg MPFR_SET_NEG (a); 776 1.1.1.2 mrg mpfr_set_ui (d, 1L, MPFR_RNDN); 777 1.1.1.2 mrg mpfr_clear_flags (); 778 1.1.1.2 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */ 779 1.1.1.2 mrg MPFR_ASSERTN (mpfr_inf_p (q)); 780 1.1.1.2 mrg MPFR_ASSERTN (mpfr_sgn (q) < 0); 781 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == 0); 782 1.1.1.2 mrg 783 1.1.1.2 mrg /* -inf/-1 == +inf */ 784 1.1.1.2 mrg MPFR_SET_INF (a); 785 1.1.1.2 mrg MPFR_SET_NEG (a); 786 1.1.1.2 mrg mpfr_set_si (d, -1, MPFR_RNDN); 787 1.1.1.2 mrg mpfr_clear_flags (); 788 1.1 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */ 789 1.1 mrg MPFR_ASSERTN (mpfr_inf_p (q)); 790 1.1 mrg MPFR_ASSERTN (mpfr_sgn (q) > 0); 791 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == 0); 792 1.1.1.2 mrg 793 1.1.1.2 mrg /* 1/+inf == +0 */ 794 1.1.1.2 mrg mpfr_set_ui (a, 1L, MPFR_RNDN); 795 1.1.1.2 mrg MPFR_SET_INF (d); 796 1.1.1.2 mrg MPFR_SET_POS (d); 797 1.1.1.2 mrg mpfr_clear_flags (); 798 1.1.1.2 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */ 799 1.1.1.4 mrg MPFR_ASSERTN (MPFR_IS_ZERO (q)); 800 1.1.1.2 mrg MPFR_ASSERTN (MPFR_IS_POS (q)); 801 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == 0); 802 1.1 mrg 803 1.1.1.2 mrg /* 1/-inf == -0 */ 804 1.1 mrg mpfr_set_ui (a, 1L, MPFR_RNDN); 805 1.1 mrg MPFR_SET_INF (d); 806 1.1.1.2 mrg MPFR_SET_NEG (d); 807 1.1.1.2 mrg mpfr_clear_flags (); 808 1.1.1.2 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */ 809 1.1.1.4 mrg MPFR_ASSERTN (MPFR_IS_ZERO (q)); 810 1.1.1.2 mrg MPFR_ASSERTN (MPFR_IS_NEG (q)); 811 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == 0); 812 1.1.1.2 mrg 813 1.1.1.2 mrg /* -1/+inf == -0 */ 814 1.1.1.2 mrg mpfr_set_si (a, -1, MPFR_RNDN); 815 1.1.1.2 mrg MPFR_SET_INF (d); 816 1.1 mrg MPFR_SET_POS (d); 817 1.1.1.2 mrg mpfr_clear_flags (); 818 1.1 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */ 819 1.1.1.4 mrg MPFR_ASSERTN (MPFR_IS_ZERO (q)); 820 1.1.1.2 mrg MPFR_ASSERTN (MPFR_IS_NEG (q)); 821 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == 0); 822 1.1.1.2 mrg 823 1.1.1.2 mrg /* -1/-inf == +0 */ 824 1.1.1.2 mrg mpfr_set_si (a, -1, MPFR_RNDN); 825 1.1.1.2 mrg MPFR_SET_INF (d); 826 1.1.1.2 mrg MPFR_SET_NEG (d); 827 1.1.1.2 mrg mpfr_clear_flags (); 828 1.1.1.2 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */ 829 1.1.1.4 mrg MPFR_ASSERTN (MPFR_IS_ZERO (q)); 830 1.1.1.2 mrg MPFR_ASSERTN (MPFR_IS_POS (q)); 831 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == 0); 832 1.1 mrg 833 1.1 mrg /* 0/0 == nan */ 834 1.1 mrg mpfr_set_ui (a, 0L, MPFR_RNDN); 835 1.1 mrg mpfr_set_ui (d, 0L, MPFR_RNDN); 836 1.1.1.2 mrg mpfr_clear_flags (); 837 1.1 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */ 838 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_NAN); 839 1.1 mrg 840 1.1 mrg /* +inf/+inf == nan */ 841 1.1 mrg MPFR_SET_INF (a); 842 1.1 mrg MPFR_SET_POS (a); 843 1.1 mrg MPFR_SET_INF (d); 844 1.1 mrg MPFR_SET_POS (d); 845 1.1.1.2 mrg mpfr_clear_flags (); 846 1.1 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */ 847 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_NAN); 848 1.1 mrg 849 1.1.1.2 mrg /* 1/+0 = +inf */ 850 1.1 mrg mpfr_set_ui (a, 1, MPFR_RNDZ); 851 1.1 mrg mpfr_set_ui (d, 0, MPFR_RNDZ); 852 1.1.1.2 mrg mpfr_clear_flags (); 853 1.1 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */ 854 1.1 mrg MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) > 0); 855 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_DIVBY0); 856 1.1 mrg 857 1.1.1.2 mrg /* 1/-0 = -inf */ 858 1.1 mrg mpfr_set_ui (a, 1, MPFR_RNDZ); 859 1.1 mrg mpfr_set_ui (d, 0, MPFR_RNDZ); 860 1.1 mrg mpfr_neg (d, d, MPFR_RNDZ); 861 1.1.1.2 mrg mpfr_clear_flags (); 862 1.1 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */ 863 1.1 mrg MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) < 0); 864 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_DIVBY0); 865 1.1 mrg 866 1.1.1.2 mrg /* -1/+0 = -inf */ 867 1.1 mrg mpfr_set_si (a, -1, MPFR_RNDZ); 868 1.1 mrg mpfr_set_ui (d, 0, MPFR_RNDZ); 869 1.1.1.2 mrg mpfr_clear_flags (); 870 1.1 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */ 871 1.1 mrg MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) < 0); 872 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_DIVBY0); 873 1.1 mrg 874 1.1.1.2 mrg /* -1/-0 = +inf */ 875 1.1 mrg mpfr_set_si (a, -1, MPFR_RNDZ); 876 1.1 mrg mpfr_set_ui (d, 0, MPFR_RNDZ); 877 1.1 mrg mpfr_neg (d, d, MPFR_RNDZ); 878 1.1.1.2 mrg mpfr_clear_flags (); 879 1.1 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */ 880 1.1 mrg MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) > 0); 881 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_DIVBY0); 882 1.1.1.2 mrg 883 1.1.1.2 mrg /* +inf/+0 = +inf */ 884 1.1.1.2 mrg MPFR_SET_INF (a); 885 1.1.1.2 mrg MPFR_SET_POS (a); 886 1.1.1.2 mrg mpfr_set_ui (d, 0, MPFR_RNDZ); 887 1.1.1.2 mrg mpfr_clear_flags (); 888 1.1.1.2 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */ 889 1.1.1.2 mrg MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) > 0); 890 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == 0); 891 1.1.1.2 mrg 892 1.1.1.2 mrg /* +inf/-0 = -inf */ 893 1.1.1.2 mrg MPFR_SET_INF (a); 894 1.1.1.2 mrg MPFR_SET_POS (a); 895 1.1.1.2 mrg mpfr_set_ui (d, 0, MPFR_RNDZ); 896 1.1.1.2 mrg mpfr_neg (d, d, MPFR_RNDZ); 897 1.1.1.2 mrg mpfr_clear_flags (); 898 1.1.1.2 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */ 899 1.1.1.2 mrg MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) < 0); 900 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == 0); 901 1.1.1.2 mrg 902 1.1.1.2 mrg /* -inf/+0 = -inf */ 903 1.1.1.2 mrg MPFR_SET_INF (a); 904 1.1.1.2 mrg MPFR_SET_NEG (a); 905 1.1.1.2 mrg mpfr_set_ui (d, 0, MPFR_RNDZ); 906 1.1.1.2 mrg mpfr_clear_flags (); 907 1.1.1.2 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */ 908 1.1.1.2 mrg MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) < 0); 909 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == 0); 910 1.1.1.2 mrg 911 1.1.1.2 mrg /* -inf/-0 = +inf */ 912 1.1.1.2 mrg MPFR_SET_INF (a); 913 1.1.1.2 mrg MPFR_SET_NEG (a); 914 1.1.1.2 mrg mpfr_set_ui (d, 0, MPFR_RNDZ); 915 1.1.1.2 mrg mpfr_neg (d, d, MPFR_RNDZ); 916 1.1.1.2 mrg mpfr_clear_flags (); 917 1.1.1.2 mrg MPFR_ASSERTN (test_div (q, a, d, MPFR_RNDZ) == 0); /* exact */ 918 1.1.1.2 mrg MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) > 0); 919 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == 0); 920 1.1 mrg 921 1.1 mrg /* check overflow */ 922 1.1 mrg emax = mpfr_get_emax (); 923 1.1 mrg set_emax (1); 924 1.1 mrg mpfr_set_ui (a, 1, MPFR_RNDZ); 925 1.1 mrg mpfr_set_ui (d, 1, MPFR_RNDZ); 926 1.1.1.5 mrg mpfr_div_2ui (d, d, 1, MPFR_RNDZ); 927 1.1.1.2 mrg mpfr_clear_flags (); 928 1.1 mrg test_div (q, a, d, MPFR_RNDU); /* 1 / 0.5 = 2 -> overflow */ 929 1.1 mrg MPFR_ASSERTN (mpfr_inf_p (q) && mpfr_sgn (q) > 0); 930 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == (MPFR_FLAGS_OVERFLOW | MPFR_FLAGS_INEXACT)); 931 1.1 mrg set_emax (emax); 932 1.1 mrg 933 1.1 mrg /* check underflow */ 934 1.1 mrg emin = mpfr_get_emin (); 935 1.1 mrg set_emin (-1); 936 1.1 mrg mpfr_set_ui (a, 1, MPFR_RNDZ); 937 1.1.1.5 mrg mpfr_div_2ui (a, a, 2, MPFR_RNDZ); 938 1.1 mrg mpfr_set_prec (d, mpfr_get_prec (q) + 8); 939 1.1 mrg for (i = -1; i <= 1; i++) 940 1.1 mrg { 941 1.1 mrg int sign; 942 1.1 mrg 943 1.1 mrg /* Test 2^(-2) / (+/- (2 + eps)), with eps < 0, eps = 0, eps > 0. 944 1.1 mrg -> underflow. 945 1.1 mrg With div.c r5513, this test fails for eps > 0 in MPFR_RNDN. */ 946 1.1 mrg mpfr_set_ui (d, 2, MPFR_RNDZ); 947 1.1 mrg if (i < 0) 948 1.1 mrg mpfr_nextbelow (d); 949 1.1 mrg if (i > 0) 950 1.1 mrg mpfr_nextabove (d); 951 1.1 mrg for (sign = 0; sign <= 1; sign++) 952 1.1 mrg { 953 1.1 mrg mpfr_clear_flags (); 954 1.1 mrg test_div (q, a, d, MPFR_RNDZ); /* result = 0 */ 955 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == 956 1.1.1.2 mrg (MPFR_FLAGS_UNDERFLOW | MPFR_FLAGS_INEXACT)); 957 1.1 mrg MPFR_ASSERTN (sign ? MPFR_IS_NEG (q) : MPFR_IS_POS (q)); 958 1.1 mrg MPFR_ASSERTN (MPFR_IS_ZERO (q)); 959 1.1 mrg mpfr_clear_flags (); 960 1.1 mrg test_div (q, a, d, MPFR_RNDN); /* result = 0 iff eps >= 0 */ 961 1.1.1.2 mrg MPFR_ASSERTN (__gmpfr_flags == 962 1.1.1.2 mrg (MPFR_FLAGS_UNDERFLOW | MPFR_FLAGS_INEXACT)); 963 1.1 mrg MPFR_ASSERTN (sign ? MPFR_IS_NEG (q) : MPFR_IS_POS (q)); 964 1.1 mrg if (i < 0) 965 1.1 mrg mpfr_nexttozero (q); 966 1.1 mrg MPFR_ASSERTN (MPFR_IS_ZERO (q)); 967 1.1 mrg mpfr_neg (d, d, MPFR_RNDN); 968 1.1 mrg } 969 1.1 mrg } 970 1.1 mrg set_emin (emin); 971 1.1 mrg 972 1.1 mrg mpfr_clear (a); 973 1.1 mrg mpfr_clear (d); 974 1.1 mrg mpfr_clear (q); 975 1.1 mrg } 976 1.1 mrg 977 1.1 mrg static void 978 1.1 mrg consistency (void) 979 1.1 mrg { 980 1.1 mrg mpfr_t x, y, z1, z2; 981 1.1 mrg int i; 982 1.1 mrg 983 1.1 mrg mpfr_inits (x, y, z1, z2, (mpfr_ptr) 0); 984 1.1 mrg 985 1.1 mrg for (i = 0; i < 10000; i++) 986 1.1 mrg { 987 1.1 mrg mpfr_rnd_t rnd; 988 1.1 mrg mpfr_prec_t px, py, pz, p; 989 1.1 mrg int inex1, inex2; 990 1.1 mrg 991 1.1.1.4 mrg /* inex is undefined for RNDF */ 992 1.1.1.4 mrg rnd = RND_RAND_NO_RNDF (); 993 1.1 mrg px = (randlimb () % 256) + 2; 994 1.1 mrg py = (randlimb () % 128) + 2; 995 1.1 mrg pz = (randlimb () % 256) + 2; 996 1.1 mrg mpfr_set_prec (x, px); 997 1.1 mrg mpfr_set_prec (y, py); 998 1.1 mrg mpfr_set_prec (z1, pz); 999 1.1 mrg mpfr_set_prec (z2, pz); 1000 1.1 mrg mpfr_urandomb (x, RANDS); 1001 1.1 mrg do 1002 1.1 mrg mpfr_urandomb (y, RANDS); 1003 1.1 mrg while (mpfr_zero_p (y)); 1004 1.1 mrg inex1 = mpfr_div (z1, x, y, rnd); 1005 1.1 mrg MPFR_ASSERTN (!MPFR_IS_NAN (z1)); 1006 1.1 mrg p = MAX (MAX (px, py), pz); 1007 1.1 mrg if (mpfr_prec_round (x, p, MPFR_RNDN) != 0 || 1008 1.1 mrg mpfr_prec_round (y, p, MPFR_RNDN) != 0) 1009 1.1 mrg { 1010 1.1 mrg printf ("mpfr_prec_round error for i = %d\n", i); 1011 1.1 mrg exit (1); 1012 1.1 mrg } 1013 1.1 mrg inex2 = mpfr_div (z2, x, y, rnd); 1014 1.1 mrg MPFR_ASSERTN (!MPFR_IS_NAN (z2)); 1015 1.1 mrg if (inex1 != inex2 || mpfr_cmp (z1, z2) != 0) 1016 1.1 mrg { 1017 1.1.1.4 mrg printf ("Consistency error for i = %d, rnd = %s\n", i, 1018 1.1.1.4 mrg mpfr_print_rnd_mode (rnd)); 1019 1.1.1.4 mrg printf ("inex1=%d inex2=%d\n", inex1, inex2); 1020 1.1.1.4 mrg printf ("z1="); mpfr_dump (z1); 1021 1.1.1.4 mrg printf ("z2="); mpfr_dump (z2); 1022 1.1 mrg exit (1); 1023 1.1 mrg } 1024 1.1 mrg } 1025 1.1 mrg 1026 1.1 mrg mpfr_clears (x, y, z1, z2, (mpfr_ptr) 0); 1027 1.1 mrg } 1028 1.1 mrg 1029 1.1 mrg /* Reported by Carl Witty on 2007-06-03 */ 1030 1.1 mrg static void 1031 1.1 mrg test_20070603 (void) 1032 1.1 mrg { 1033 1.1 mrg mpfr_t n, d, q, c; 1034 1.1 mrg 1035 1.1 mrg mpfr_init2 (n, 128); 1036 1.1 mrg mpfr_init2 (d, 128); 1037 1.1 mrg mpfr_init2 (q, 31); 1038 1.1 mrg mpfr_init2 (c, 31); 1039 1.1 mrg 1040 1.1 mrg mpfr_set_str (n, "10384593717069655257060992206846485", 10, MPFR_RNDN); 1041 1.1 mrg mpfr_set_str (d, "10384593717069655257060992206847132", 10, MPFR_RNDN); 1042 1.1 mrg mpfr_div (q, n, d, MPFR_RNDU); 1043 1.1 mrg 1044 1.1 mrg mpfr_set_ui (c, 1, MPFR_RNDN); 1045 1.1 mrg if (mpfr_cmp (q, c) != 0) 1046 1.1 mrg { 1047 1.1 mrg printf ("Error in test_20070603\nGot "); 1048 1.1 mrg mpfr_dump (q); 1049 1.1 mrg printf ("instead of "); 1050 1.1 mrg mpfr_dump (c); 1051 1.1 mrg exit (1); 1052 1.1 mrg } 1053 1.1 mrg 1054 1.1 mrg /* same for 64-bit machines */ 1055 1.1 mrg mpfr_set_prec (n, 256); 1056 1.1 mrg mpfr_set_prec (d, 256); 1057 1.1 mrg mpfr_set_prec (q, 63); 1058 1.1 mrg mpfr_set_str (n, "822752278660603021077484591278675252491367930877209729029898240", 10, MPFR_RNDN); 1059 1.1 mrg mpfr_set_str (d, "822752278660603021077484591278675252491367930877212507873738752", 10, MPFR_RNDN); 1060 1.1 mrg mpfr_div (q, n, d, MPFR_RNDU); 1061 1.1 mrg if (mpfr_cmp (q, c) != 0) 1062 1.1 mrg { 1063 1.1 mrg printf ("Error in test_20070603\nGot "); 1064 1.1 mrg mpfr_dump (q); 1065 1.1 mrg printf ("instead of "); 1066 1.1 mrg mpfr_dump (c); 1067 1.1 mrg exit (1); 1068 1.1 mrg } 1069 1.1 mrg 1070 1.1 mrg mpfr_clear (n); 1071 1.1 mrg mpfr_clear (d); 1072 1.1 mrg mpfr_clear (q); 1073 1.1 mrg mpfr_clear (c); 1074 1.1 mrg } 1075 1.1 mrg 1076 1.1 mrg /* Bug found while adding tests for mpfr_cot */ 1077 1.1 mrg static void 1078 1.1 mrg test_20070628 (void) 1079 1.1 mrg { 1080 1.1 mrg mpfr_exp_t old_emax; 1081 1.1 mrg mpfr_t x, y; 1082 1.1 mrg int inex, err = 0; 1083 1.1 mrg 1084 1.1 mrg old_emax = mpfr_get_emax (); 1085 1.1.1.6 mrg set_emax (256); 1086 1.1 mrg 1087 1.1 mrg mpfr_inits2 (53, x, y, (mpfr_ptr) 0); 1088 1.1 mrg mpfr_set_si (x, -1, MPFR_RNDN); 1089 1.1 mrg mpfr_set_si_2exp (y, 1, -256, MPFR_RNDN); 1090 1.1 mrg mpfr_clear_flags (); 1091 1.1 mrg inex = mpfr_div (x, x, y, MPFR_RNDD); 1092 1.1.1.4 mrg if (MPFR_IS_POS (x) || ! mpfr_inf_p (x)) 1093 1.1 mrg { 1094 1.1 mrg printf ("Error in test_20070628: expected -Inf, got\n"); 1095 1.1 mrg mpfr_dump (x); 1096 1.1 mrg err++; 1097 1.1 mrg } 1098 1.1 mrg if (inex >= 0) 1099 1.1 mrg { 1100 1.1 mrg printf ("Error in test_20070628: expected inex < 0, got %d\n", inex); 1101 1.1 mrg err++; 1102 1.1 mrg } 1103 1.1 mrg if (! mpfr_overflow_p ()) 1104 1.1 mrg { 1105 1.1 mrg printf ("Error in test_20070628: overflow flag is not set\n"); 1106 1.1 mrg err++; 1107 1.1 mrg } 1108 1.1 mrg mpfr_clears (x, y, (mpfr_ptr) 0); 1109 1.1.1.6 mrg set_emax (old_emax); 1110 1.1 mrg } 1111 1.1 mrg 1112 1.1.1.3 mrg /* Bug in mpfr_divhigh_n_basecase when all limbs of q (except the most 1113 1.1.1.3 mrg significant one) are B-1 where B=2^GMP_NUMB_BITS. Since we truncate 1114 1.1.1.3 mrg the divisor at each step, it might happen at some point that 1115 1.1.1.3 mrg (np[n-1],np[n-2]) > (d1,d0), and not only the equality. 1116 1.1.1.3 mrg Reported by Ricky Farr 1117 1.1.1.3 mrg <https://sympa.inria.fr/sympa/arc/mpfr/2015-10/msg00023.html> 1118 1.1.1.3 mrg To get a failure, a MPFR_DIVHIGH_TAB entry below the MPFR_DIV_THRESHOLD 1119 1.1.1.4 mrg limit must have a value 0. With most mparam.h files, this cannot occur. To 1120 1.1.1.4 mrg make the bug appear, one can configure MPFR with -DMPFR_TUNE_COVERAGE. */ 1121 1.1.1.3 mrg static void 1122 1.1.1.3 mrg test_20151023 (void) 1123 1.1.1.3 mrg { 1124 1.1.1.3 mrg mpfr_prec_t p; 1125 1.1.1.3 mrg mpfr_t n, d, q, q0; 1126 1.1.1.3 mrg int inex, i; 1127 1.1.1.3 mrg 1128 1.1.1.3 mrg for (p = GMP_NUMB_BITS; p <= 2000; p++) 1129 1.1.1.3 mrg { 1130 1.1.1.3 mrg mpfr_init2 (n, 2*p); 1131 1.1.1.3 mrg mpfr_init2 (d, p); 1132 1.1.1.3 mrg mpfr_init2 (q, p); 1133 1.1.1.3 mrg mpfr_init2 (q0, GMP_NUMB_BITS); 1134 1.1.1.3 mrg 1135 1.1.1.3 mrg /* generate a random divisor of p bits */ 1136 1.1.1.5 mrg do 1137 1.1.1.5 mrg mpfr_urandomb (d, RANDS); 1138 1.1.1.5 mrg while (mpfr_zero_p (d)); 1139 1.1.1.5 mrg /* generate a random non-zero quotient of GMP_NUMB_BITS bits */ 1140 1.1.1.5 mrg do 1141 1.1.1.5 mrg mpfr_urandomb (q0, RANDS); 1142 1.1.1.5 mrg while (mpfr_zero_p (q0)); 1143 1.1.1.3 mrg /* zero-pad the quotient to p bits */ 1144 1.1.1.3 mrg inex = mpfr_prec_round (q0, p, MPFR_RNDN); 1145 1.1.1.3 mrg MPFR_ASSERTN(inex == 0); 1146 1.1.1.3 mrg 1147 1.1.1.3 mrg for (i = 0; i < 3; i++) 1148 1.1.1.3 mrg { 1149 1.1.1.3 mrg /* i=0: try with the original quotient xxx000...000 1150 1.1.1.3 mrg i=1: try with the original quotient minus one ulp 1151 1.1.1.3 mrg i=2: try with the original quotient plus one ulp */ 1152 1.1.1.3 mrg if (i == 1) 1153 1.1.1.3 mrg mpfr_nextbelow (q0); 1154 1.1.1.3 mrg else if (i == 2) 1155 1.1.1.3 mrg { 1156 1.1.1.3 mrg mpfr_nextabove (q0); 1157 1.1.1.3 mrg mpfr_nextabove (q0); 1158 1.1.1.3 mrg } 1159 1.1.1.3 mrg 1160 1.1.1.3 mrg inex = mpfr_mul (n, d, q0, MPFR_RNDN); 1161 1.1.1.3 mrg MPFR_ASSERTN(inex == 0); 1162 1.1.1.3 mrg mpfr_nextabove (n); 1163 1.1.1.3 mrg mpfr_div (q, n, d, MPFR_RNDN); 1164 1.1.1.5 mrg if (! mpfr_equal_p (q, q0)) 1165 1.1.1.5 mrg { 1166 1.1.1.5 mrg printf ("Error in test_20151023 for p=%ld, rnd=RNDN, i=%d\n", 1167 1.1.1.5 mrg (long) p, i); 1168 1.1.1.5 mrg printf ("n="); mpfr_dump (n); 1169 1.1.1.5 mrg printf ("d="); mpfr_dump (d); 1170 1.1.1.5 mrg printf ("expected q0="); mpfr_dump (q0); 1171 1.1.1.5 mrg printf ("got q="); mpfr_dump (q); 1172 1.1.1.5 mrg exit (1); 1173 1.1.1.5 mrg } 1174 1.1.1.3 mrg 1175 1.1.1.3 mrg inex = mpfr_mul (n, d, q0, MPFR_RNDN); 1176 1.1.1.3 mrg MPFR_ASSERTN(inex == 0); 1177 1.1.1.3 mrg mpfr_nextbelow (n); 1178 1.1.1.3 mrg mpfr_div (q, n, d, MPFR_RNDN); 1179 1.1.1.3 mrg MPFR_ASSERTN(mpfr_cmp (q, q0) == 0); 1180 1.1.1.3 mrg } 1181 1.1.1.3 mrg 1182 1.1.1.3 mrg mpfr_clear (n); 1183 1.1.1.3 mrg mpfr_clear (d); 1184 1.1.1.3 mrg mpfr_clear (q); 1185 1.1.1.3 mrg mpfr_clear (q0); 1186 1.1.1.3 mrg } 1187 1.1.1.3 mrg } 1188 1.1.1.3 mrg 1189 1.1.1.4 mrg /* test a random division of p+extra bits divided by p+extra bits, 1190 1.1.1.4 mrg with quotient of p bits only, where the p+extra bit approximation 1191 1.1.1.4 mrg of the quotient is very near a rounding frontier. */ 1192 1.1.1.4 mrg static void 1193 1.1.1.4 mrg test_bad_aux (mpfr_prec_t p, mpfr_prec_t extra) 1194 1.1.1.4 mrg { 1195 1.1.1.4 mrg mpfr_t u, v, w, q0, q; 1196 1.1.1.4 mrg 1197 1.1.1.4 mrg mpfr_init2 (u, p + extra); 1198 1.1.1.4 mrg mpfr_init2 (v, p + extra); 1199 1.1.1.4 mrg mpfr_init2 (w, p + extra); 1200 1.1.1.4 mrg mpfr_init2 (q0, p); 1201 1.1.1.4 mrg mpfr_init2 (q, p); 1202 1.1.1.4 mrg do mpfr_urandomb (q0, RANDS); while (mpfr_zero_p (q0)); 1203 1.1.1.4 mrg do mpfr_urandomb (v, RANDS); while (mpfr_zero_p (v)); 1204 1.1.1.4 mrg 1205 1.1.1.4 mrg mpfr_set (w, q0, MPFR_RNDN); /* exact */ 1206 1.1.1.4 mrg mpfr_nextabove (w); /* now w > q0 */ 1207 1.1.1.4 mrg mpfr_mul (u, v, w, MPFR_RNDU); /* thus u > v*q0 */ 1208 1.1.1.4 mrg mpfr_div (q, u, v, MPFR_RNDU); /* should have q > q0 */ 1209 1.1.1.4 mrg MPFR_ASSERTN (mpfr_cmp (q, q0) > 0); 1210 1.1.1.4 mrg mpfr_div (q, u, v, MPFR_RNDZ); /* should have q = q0 */ 1211 1.1.1.4 mrg MPFR_ASSERTN (mpfr_cmp (q, q0) == 0); 1212 1.1.1.4 mrg 1213 1.1.1.4 mrg mpfr_set (w, q0, MPFR_RNDN); /* exact */ 1214 1.1.1.4 mrg mpfr_nextbelow (w); /* now w < q0 */ 1215 1.1.1.4 mrg mpfr_mul (u, v, w, MPFR_RNDZ); /* thus u < v*q0 */ 1216 1.1.1.4 mrg mpfr_div (q, u, v, MPFR_RNDZ); /* should have q < q0 */ 1217 1.1.1.4 mrg MPFR_ASSERTN (mpfr_cmp (q, q0) < 0); 1218 1.1.1.4 mrg mpfr_div (q, u, v, MPFR_RNDU); /* should have q = q0 */ 1219 1.1.1.4 mrg MPFR_ASSERTN (mpfr_cmp (q, q0) == 0); 1220 1.1.1.4 mrg 1221 1.1.1.4 mrg mpfr_clear (u); 1222 1.1.1.4 mrg mpfr_clear (v); 1223 1.1.1.4 mrg mpfr_clear (w); 1224 1.1.1.4 mrg mpfr_clear (q0); 1225 1.1.1.4 mrg mpfr_clear (q); 1226 1.1.1.4 mrg } 1227 1.1.1.4 mrg 1228 1.1.1.4 mrg static void 1229 1.1.1.4 mrg test_bad (void) 1230 1.1.1.4 mrg { 1231 1.1.1.4 mrg mpfr_prec_t p, extra; 1232 1.1.1.4 mrg 1233 1.1.1.4 mrg for (p = MPFR_PREC_MIN; p <= 1024; p += 17) 1234 1.1.1.4 mrg for (extra = 2; extra <= 64; extra++) 1235 1.1.1.4 mrg test_bad_aux (p, extra); 1236 1.1.1.4 mrg } 1237 1.1.1.4 mrg 1238 1.1 mrg #define TEST_FUNCTION test_div 1239 1.1 mrg #define TWO_ARGS 1240 1.1 mrg #define RAND_FUNCTION(x) mpfr_random2(x, MPFR_LIMB_SIZE (x), randlimb () % 100, RANDS) 1241 1.1 mrg #include "tgeneric.c" 1242 1.1 mrg 1243 1.1.1.3 mrg static void 1244 1.1.1.3 mrg test_extreme (void) 1245 1.1.1.3 mrg { 1246 1.1.1.3 mrg mpfr_t x, y, z; 1247 1.1.1.3 mrg mpfr_exp_t emin, emax; 1248 1.1.1.3 mrg mpfr_prec_t p[4] = { 8, 32, 64, 256 }; 1249 1.1.1.3 mrg int xi, yi, zi, j, r; 1250 1.1.1.3 mrg unsigned int flags, ex_flags; 1251 1.1.1.3 mrg 1252 1.1.1.3 mrg emin = mpfr_get_emin (); 1253 1.1.1.3 mrg emax = mpfr_get_emax (); 1254 1.1.1.3 mrg 1255 1.1.1.6 mrg set_emin (MPFR_EMIN_MIN); 1256 1.1.1.6 mrg set_emax (MPFR_EMAX_MAX); 1257 1.1.1.3 mrg 1258 1.1.1.3 mrg for (xi = 0; xi < 4; xi++) 1259 1.1.1.3 mrg { 1260 1.1.1.3 mrg mpfr_init2 (x, p[xi]); 1261 1.1.1.3 mrg mpfr_setmax (x, MPFR_EMAX_MAX); 1262 1.1.1.3 mrg MPFR_ASSERTN (mpfr_check (x)); 1263 1.1.1.3 mrg for (yi = 0; yi < 4; yi++) 1264 1.1.1.3 mrg { 1265 1.1.1.3 mrg mpfr_init2 (y, p[yi]); 1266 1.1.1.3 mrg mpfr_setmin (y, MPFR_EMIN_MIN); 1267 1.1.1.3 mrg for (j = 0; j < 2; j++) 1268 1.1.1.3 mrg { 1269 1.1.1.3 mrg MPFR_ASSERTN (mpfr_check (y)); 1270 1.1.1.3 mrg for (zi = 0; zi < 4; zi++) 1271 1.1.1.3 mrg { 1272 1.1.1.3 mrg mpfr_init2 (z, p[zi]); 1273 1.1.1.3 mrg RND_LOOP (r) 1274 1.1.1.3 mrg { 1275 1.1.1.3 mrg mpfr_clear_flags (); 1276 1.1.1.3 mrg mpfr_div (z, x, y, (mpfr_rnd_t) r); 1277 1.1.1.3 mrg flags = __gmpfr_flags; 1278 1.1.1.3 mrg MPFR_ASSERTN (mpfr_check (z)); 1279 1.1.1.3 mrg ex_flags = MPFR_FLAGS_OVERFLOW | MPFR_FLAGS_INEXACT; 1280 1.1.1.3 mrg if (flags != ex_flags) 1281 1.1.1.3 mrg { 1282 1.1.1.3 mrg printf ("Bad flags in test_extreme on z = a/b" 1283 1.1.1.3 mrg " with %s and\n", 1284 1.1.1.3 mrg mpfr_print_rnd_mode ((mpfr_rnd_t) r)); 1285 1.1.1.3 mrg printf ("a = "); 1286 1.1.1.3 mrg mpfr_dump (x); 1287 1.1.1.3 mrg printf ("b = "); 1288 1.1.1.3 mrg mpfr_dump (y); 1289 1.1.1.3 mrg printf ("Expected flags:"); 1290 1.1.1.3 mrg flags_out (ex_flags); 1291 1.1.1.3 mrg printf ("Got flags: "); 1292 1.1.1.3 mrg flags_out (flags); 1293 1.1.1.3 mrg printf ("z = "); 1294 1.1.1.3 mrg mpfr_dump (z); 1295 1.1.1.3 mrg exit (1); 1296 1.1.1.3 mrg } 1297 1.1.1.3 mrg mpfr_clear_flags (); 1298 1.1.1.3 mrg mpfr_div (z, y, x, (mpfr_rnd_t) r); 1299 1.1.1.3 mrg flags = __gmpfr_flags; 1300 1.1.1.3 mrg MPFR_ASSERTN (mpfr_check (z)); 1301 1.1.1.3 mrg ex_flags = MPFR_FLAGS_UNDERFLOW | MPFR_FLAGS_INEXACT; 1302 1.1.1.3 mrg if (flags != ex_flags) 1303 1.1.1.3 mrg { 1304 1.1.1.3 mrg printf ("Bad flags in test_extreme on z = a/b" 1305 1.1.1.3 mrg " with %s and\n", 1306 1.1.1.3 mrg mpfr_print_rnd_mode ((mpfr_rnd_t) r)); 1307 1.1.1.3 mrg printf ("a = "); 1308 1.1.1.3 mrg mpfr_dump (y); 1309 1.1.1.3 mrg printf ("b = "); 1310 1.1.1.3 mrg mpfr_dump (x); 1311 1.1.1.3 mrg printf ("Expected flags:"); 1312 1.1.1.3 mrg flags_out (ex_flags); 1313 1.1.1.3 mrg printf ("Got flags: "); 1314 1.1.1.3 mrg flags_out (flags); 1315 1.1.1.3 mrg printf ("z = "); 1316 1.1.1.3 mrg mpfr_dump (z); 1317 1.1.1.3 mrg exit (1); 1318 1.1.1.3 mrg } 1319 1.1.1.3 mrg } 1320 1.1.1.3 mrg mpfr_clear (z); 1321 1.1.1.3 mrg } /* zi */ 1322 1.1.1.3 mrg mpfr_nextabove (y); 1323 1.1.1.3 mrg } /* j */ 1324 1.1.1.3 mrg mpfr_clear (y); 1325 1.1.1.3 mrg } /* yi */ 1326 1.1.1.3 mrg mpfr_clear (x); 1327 1.1.1.3 mrg } /* xi */ 1328 1.1.1.3 mrg 1329 1.1.1.3 mrg set_emin (emin); 1330 1.1.1.3 mrg set_emax (emax); 1331 1.1.1.3 mrg } 1332 1.1.1.3 mrg 1333 1.1.1.4 mrg static void 1334 1.1.1.4 mrg testall_rndf (mpfr_prec_t pmax) 1335 1.1.1.4 mrg { 1336 1.1.1.4 mrg mpfr_t a, b, c, d; 1337 1.1.1.4 mrg mpfr_prec_t pa, pb, pc; 1338 1.1.1.4 mrg 1339 1.1.1.4 mrg for (pa = MPFR_PREC_MIN; pa <= pmax; pa++) 1340 1.1.1.4 mrg { 1341 1.1.1.4 mrg mpfr_init2 (a, pa); 1342 1.1.1.4 mrg mpfr_init2 (d, pa); 1343 1.1.1.4 mrg for (pb = MPFR_PREC_MIN; pb <= pmax; pb++) 1344 1.1.1.4 mrg { 1345 1.1.1.4 mrg mpfr_init2 (b, pb); 1346 1.1.1.4 mrg mpfr_set_ui (b, 1, MPFR_RNDN); 1347 1.1.1.4 mrg while (mpfr_cmp_ui (b, 2) < 0) 1348 1.1.1.4 mrg { 1349 1.1.1.4 mrg for (pc = MPFR_PREC_MIN; pc <= pmax; pc++) 1350 1.1.1.4 mrg { 1351 1.1.1.4 mrg mpfr_init2 (c, pc); 1352 1.1.1.4 mrg mpfr_set_ui (c, 1, MPFR_RNDN); 1353 1.1.1.4 mrg while (mpfr_cmp_ui (c, 2) < 0) 1354 1.1.1.4 mrg { 1355 1.1.1.4 mrg mpfr_div (a, b, c, MPFR_RNDF); 1356 1.1.1.4 mrg mpfr_div (d, b, c, MPFR_RNDD); 1357 1.1.1.4 mrg if (!mpfr_equal_p (a, d)) 1358 1.1.1.4 mrg { 1359 1.1.1.4 mrg mpfr_div (d, b, c, MPFR_RNDU); 1360 1.1.1.4 mrg if (!mpfr_equal_p (a, d)) 1361 1.1.1.4 mrg { 1362 1.1.1.4 mrg printf ("Error: mpfr_div(a,b,c,RNDF) does not " 1363 1.1.1.4 mrg "match RNDD/RNDU\n"); 1364 1.1.1.4 mrg printf ("b="); mpfr_dump (b); 1365 1.1.1.4 mrg printf ("c="); mpfr_dump (c); 1366 1.1.1.4 mrg printf ("a="); mpfr_dump (a); 1367 1.1.1.4 mrg exit (1); 1368 1.1.1.4 mrg } 1369 1.1.1.4 mrg } 1370 1.1.1.4 mrg mpfr_nextabove (c); 1371 1.1.1.4 mrg } 1372 1.1.1.4 mrg mpfr_clear (c); 1373 1.1.1.4 mrg } 1374 1.1.1.4 mrg mpfr_nextabove (b); 1375 1.1.1.4 mrg } 1376 1.1.1.4 mrg mpfr_clear (b); 1377 1.1.1.4 mrg } 1378 1.1.1.4 mrg mpfr_clear (a); 1379 1.1.1.4 mrg mpfr_clear (d); 1380 1.1.1.4 mrg } 1381 1.1.1.4 mrg } 1382 1.1.1.4 mrg 1383 1.1.1.4 mrg static void 1384 1.1.1.4 mrg test_mpfr_divsp2 (void) 1385 1.1.1.4 mrg { 1386 1.1.1.4 mrg mpfr_t u, v, q; 1387 1.1.1.4 mrg 1388 1.1.1.4 mrg /* test to exercise r2 = v1 in mpfr_divsp2 */ 1389 1.1.1.4 mrg mpfr_init2 (u, 128); 1390 1.1.1.4 mrg mpfr_init2 (v, 128); 1391 1.1.1.4 mrg mpfr_init2 (q, 83); 1392 1.1.1.4 mrg 1393 1.1.1.4 mrg mpfr_set_str (u, "286677858044426991425771529092412636160", 10, MPFR_RNDN); 1394 1.1.1.4 mrg mpfr_set_str (v, "241810647971575979588130185988987264768", 10, MPFR_RNDN); 1395 1.1.1.4 mrg mpfr_div (q, u, v, MPFR_RNDN); 1396 1.1.1.4 mrg mpfr_set_str (u, "5732952910203749289426944", 10, MPFR_RNDN); 1397 1.1.1.5 mrg mpfr_div_2ui (u, u, 82, MPFR_RNDN); 1398 1.1.1.4 mrg MPFR_ASSERTN(mpfr_equal_p (q, u)); 1399 1.1.1.4 mrg 1400 1.1.1.4 mrg mpfr_clear (u); 1401 1.1.1.4 mrg mpfr_clear (v); 1402 1.1.1.4 mrg mpfr_clear (q); 1403 1.1.1.4 mrg } 1404 1.1.1.4 mrg 1405 1.1.1.4 mrg /* Assertion failure in r10769 with --enable-assert --enable-gmp-internals 1406 1.1.1.4 mrg (same failure in tatan on a similar example). */ 1407 1.1.1.4 mrg static void 1408 1.1.1.4 mrg test_20160831 (void) 1409 1.1.1.4 mrg { 1410 1.1.1.4 mrg mpfr_t u, v, q; 1411 1.1.1.4 mrg 1412 1.1.1.4 mrg mpfr_inits2 (124, u, v, q, (mpfr_ptr) 0); 1413 1.1.1.4 mrg 1414 1.1.1.4 mrg mpfr_set_ui (u, 1, MPFR_RNDN); 1415 1.1.1.4 mrg mpfr_set_str (v, "0x40000000000000005", 16, MPFR_RNDN); 1416 1.1.1.4 mrg mpfr_div (q, u, v, MPFR_RNDN); 1417 1.1.1.4 mrg mpfr_set_str (u, "0xfffffffffffffffecp-134", 16, MPFR_RNDN); 1418 1.1.1.4 mrg MPFR_ASSERTN (mpfr_equal_p (q, u)); 1419 1.1.1.4 mrg 1420 1.1.1.4 mrg mpfr_set_prec (u, 128); 1421 1.1.1.4 mrg mpfr_set_prec (v, 128); 1422 1.1.1.4 mrg mpfr_set_str (u, "186127091671619245460026015088243485690", 10, MPFR_RNDN); 1423 1.1.1.4 mrg mpfr_set_str (v, "205987256581218236405412302590110119580", 10, MPFR_RNDN); 1424 1.1.1.4 mrg mpfr_div (q, u, v, MPFR_RNDN); 1425 1.1.1.4 mrg mpfr_set_str (u, "19217137613667309953639458782352244736", 10, MPFR_RNDN); 1426 1.1.1.5 mrg mpfr_div_2ui (u, u, 124, MPFR_RNDN); 1427 1.1.1.4 mrg MPFR_ASSERTN (mpfr_equal_p (q, u)); 1428 1.1.1.4 mrg 1429 1.1.1.4 mrg mpfr_clears (u, v, q, (mpfr_ptr) 0); 1430 1.1.1.4 mrg } 1431 1.1.1.4 mrg 1432 1.1.1.4 mrg /* With r11138, on a 64-bit machine: 1433 1.1.1.4 mrg div.c:128: MPFR assertion failed: qx >= __gmpfr_emin 1434 1.1.1.4 mrg */ 1435 1.1.1.4 mrg static void 1436 1.1.1.4 mrg test_20170104 (void) 1437 1.1.1.4 mrg { 1438 1.1.1.4 mrg mpfr_t u, v, q; 1439 1.1.1.4 mrg mpfr_exp_t emin; 1440 1.1.1.4 mrg 1441 1.1.1.4 mrg emin = mpfr_get_emin (); 1442 1.1.1.4 mrg set_emin (-42); 1443 1.1.1.4 mrg 1444 1.1.1.4 mrg mpfr_init2 (u, 12); 1445 1.1.1.4 mrg mpfr_init2 (v, 12); 1446 1.1.1.4 mrg mpfr_init2 (q, 11); 1447 1.1.1.4 mrg mpfr_set_str_binary (u, "0.111111111110E-29"); 1448 1.1.1.4 mrg mpfr_set_str_binary (v, "0.111111111111E14"); 1449 1.1.1.4 mrg mpfr_div (q, u, v, MPFR_RNDN); 1450 1.1.1.4 mrg mpfr_clears (u, v, q, (mpfr_ptr) 0); 1451 1.1.1.4 mrg 1452 1.1.1.4 mrg set_emin (emin); 1453 1.1.1.4 mrg } 1454 1.1.1.4 mrg 1455 1.1.1.4 mrg /* With r11140, on a 64-bit machine with GMP_CHECK_RANDOMIZE=1484406128: 1456 1.1.1.4 mrg Consistency error for i = 2577 1457 1.1.1.4 mrg */ 1458 1.1.1.4 mrg static void 1459 1.1.1.4 mrg test_20170105 (void) 1460 1.1.1.4 mrg { 1461 1.1.1.4 mrg mpfr_t x, y, z, t; 1462 1.1.1.4 mrg 1463 1.1.1.4 mrg mpfr_init2 (x, 138); 1464 1.1.1.4 mrg mpfr_init2 (y, 6); 1465 1.1.1.4 mrg mpfr_init2 (z, 128); 1466 1.1.1.4 mrg mpfr_init2 (t, 128); 1467 1.1.1.4 mrg mpfr_set_str_binary (x, "0.100110111001001000101111010010011101111110111111110001110100000001110111010100111010100011101010110000010100000011100100110101101011000000E-6"); 1468 1.1.1.4 mrg mpfr_set_str_binary (y, "0.100100E-2"); 1469 1.1.1.4 mrg /* up to exponents, x/y is exactly 367625553447399614694201910705139062483, 1470 1.1.1.4 mrg which has 129 bits, thus we are in the round-to-nearest-even case, and since 1471 1.1.1.4 mrg the penultimate bit of x/y is 1, we should round upwards */ 1472 1.1.1.4 mrg mpfr_set_str_binary (t, "0.10001010010010010000110110010110111111111100011011101010000000000110101000010001011110011011010000111010000000001100101101101010E-3"); 1473 1.1.1.4 mrg mpfr_div (z, x, y, MPFR_RNDN); 1474 1.1.1.4 mrg MPFR_ASSERTN(mpfr_equal_p (z, t)); 1475 1.1.1.4 mrg mpfr_clears (x, y, z, t, (mpfr_ptr) 0); 1476 1.1.1.4 mrg } 1477 1.1.1.4 mrg 1478 1.1.1.4 mrg /* The real cause of the mpfr_ttanh failure from the non-regression test 1479 1.1.1.4 mrg added in tests/ttanh.c@11993 was actually due to a bug in mpfr_div, as 1480 1.1.1.4 mrg this can be seen by comparing the logs of the 3.1 branch and the trunk 1481 1.1.1.4 mrg r11992 with MPFR_LOG_ALL=1 MPFR_LOG_PREC=50 on this particular test 1482 1.1.1.4 mrg (this was noticed because adding this test to the 3.1 branch did not 1483 1.1.1.4 mrg yield a failure like in the trunk, though the mpfr_ttanh code did not 1484 1.1.1.4 mrg change until r11993). This was the bug actually fixed in r12002. 1485 1.1.1.4 mrg */ 1486 1.1.1.4 mrg static void 1487 1.1.1.4 mrg test_20171219 (void) 1488 1.1.1.4 mrg { 1489 1.1.1.4 mrg mpfr_t x, y, z, t; 1490 1.1.1.4 mrg 1491 1.1.1.4 mrg mpfr_inits2 (126, x, y, z, t, (mpfr_ptr) 0); 1492 1.1.1.4 mrg mpfr_set_str_binary (x, "0.111000000000000111100000000000011110000000000001111000000000000111100000000000011110000000000001111000000000000111100000000000E1"); 1493 1.1.1.4 mrg /* x = 36347266450315671364380109803814927 / 2^114 */ 1494 1.1.1.4 mrg mpfr_add_ui (y, x, 2, MPFR_RNDN); 1495 1.1.1.4 mrg /* y = 77885641318594292392624080437575695 / 2^114 */ 1496 1.1.1.4 mrg mpfr_div (z, x, y, MPFR_RNDN); 1497 1.1.1.4 mrg mpfr_set_ui_2exp (t, 3823, -13, MPFR_RNDN); 1498 1.1.1.4 mrg MPFR_ASSERTN (mpfr_equal_p (z, t)); 1499 1.1.1.4 mrg mpfr_clears (x, y, z, t, (mpfr_ptr) 0); 1500 1.1.1.4 mrg } 1501 1.1.1.4 mrg 1502 1.1.1.4 mrg #if !defined(MPFR_GENERIC_ABI) && GMP_NUMB_BITS == 64 1503 1.1.1.4 mrg /* exercise mpfr_div2_approx */ 1504 1.1.1.4 mrg static void 1505 1.1.1.4 mrg test_mpfr_div2_approx (unsigned long n) 1506 1.1.1.4 mrg { 1507 1.1.1.4 mrg mpfr_t x, y, z; 1508 1.1.1.4 mrg 1509 1.1.1.4 mrg mpfr_init2 (x, 113); 1510 1.1.1.4 mrg mpfr_init2 (y, 113); 1511 1.1.1.4 mrg mpfr_init2 (z, 113); 1512 1.1.1.4 mrg while (n--) 1513 1.1.1.4 mrg { 1514 1.1.1.4 mrg mpfr_urandomb (x, RANDS); 1515 1.1.1.4 mrg mpfr_urandomb (y, RANDS); 1516 1.1.1.4 mrg mpfr_div (z, x, y, MPFR_RNDN); 1517 1.1.1.4 mrg } 1518 1.1.1.4 mrg mpfr_clear (x); 1519 1.1.1.4 mrg mpfr_clear (y); 1520 1.1.1.4 mrg mpfr_clear (z); 1521 1.1.1.4 mrg } 1522 1.1.1.4 mrg #endif 1523 1.1.1.4 mrg 1524 1.1.1.4 mrg /* bug found in ttan with GMP_CHECK_RANDOMIZE=1514257254 */ 1525 1.1.1.4 mrg static void 1526 1.1.1.4 mrg bug20171218 (void) 1527 1.1.1.4 mrg { 1528 1.1.1.4 mrg mpfr_t s, c; 1529 1.1.1.4 mrg mpfr_init2 (s, 124); 1530 1.1.1.4 mrg mpfr_init2 (c, 124); 1531 1.1.1.4 mrg mpfr_set_str_binary (s, "-0.1110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110E0"); 1532 1.1.1.4 mrg mpfr_set_str_binary (c, "0.1111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111E-1"); 1533 1.1.1.4 mrg mpfr_div (c, s, c, MPFR_RNDN); 1534 1.1.1.4 mrg mpfr_set_str_binary (s, "-1.111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"); 1535 1.1.1.4 mrg MPFR_ASSERTN(mpfr_equal_p (c, s)); 1536 1.1.1.4 mrg mpfr_clear (s); 1537 1.1.1.4 mrg mpfr_clear (c); 1538 1.1.1.4 mrg } 1539 1.1.1.4 mrg 1540 1.1.1.4 mrg /* Extended test based on a bug found with flint-arb test suite with a 1541 1.1.1.4 mrg 32-bit ABI: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=888459 1542 1.1.1.4 mrg Division of the form: (1 - 2^(-pa)) / (1 - 2^(-pb)). 1543 1.1.1.4 mrg The result is compared to the one obtained by increasing the precision of 1544 1.1.1.4 mrg the divisor (without changing its value, so that both results should be 1545 1.1.1.4 mrg equal). For all of these tests, a failure may occur in r12126 only with 1546 1.1.1.4 mrg pb=GMP_NUMB_BITS and MPFR_RNDN (and some particular values of pa and pc). 1547 1.1.1.4 mrg This bug was introduced by r9086, where mpfr_div uses mpfr_div_ui when 1548 1.1.1.4 mrg the divisor has only one limb. 1549 1.1.1.4 mrg */ 1550 1.1.1.4 mrg static void 1551 1.1.1.4 mrg bug20180126 (void) 1552 1.1.1.4 mrg { 1553 1.1.1.4 mrg mpfr_t a, b1, b2, c1, c2; 1554 1.1.1.4 mrg int pa, i, j, pc, sa, sb, r, inex1, inex2; 1555 1.1.1.4 mrg 1556 1.1.1.4 mrg for (pa = 100; pa < 800; pa += 11) 1557 1.1.1.4 mrg for (i = 1; i <= 4; i++) 1558 1.1.1.4 mrg for (j = -2; j <= 2; j++) 1559 1.1.1.4 mrg { 1560 1.1.1.4 mrg int pb = GMP_NUMB_BITS * i + j; 1561 1.1.1.4 mrg 1562 1.1.1.4 mrg if (pb > pa) 1563 1.1.1.4 mrg continue; 1564 1.1.1.4 mrg 1565 1.1.1.4 mrg mpfr_inits2 (pa, a, b1, (mpfr_ptr) 0); 1566 1.1.1.4 mrg mpfr_inits2 (pb, b2, (mpfr_ptr) 0); 1567 1.1.1.4 mrg 1568 1.1.1.4 mrg mpfr_set_ui (a, 1, MPFR_RNDN); 1569 1.1.1.4 mrg mpfr_nextbelow (a); /* 1 - 2^(-pa) */ 1570 1.1.1.4 mrg mpfr_set_ui (b2, 1, MPFR_RNDN); 1571 1.1.1.4 mrg mpfr_nextbelow (b2); /* 1 - 2^(-pb) */ 1572 1.1.1.4 mrg inex1 = mpfr_set (b1, b2, MPFR_RNDN); 1573 1.1.1.4 mrg MPFR_ASSERTN (inex1 == 0); 1574 1.1.1.4 mrg 1575 1.1.1.4 mrg for (pc = 32; pc <= 320; pc += 32) 1576 1.1.1.4 mrg { 1577 1.1.1.4 mrg mpfr_inits2 (pc, c1, c2, (mpfr_ptr) 0); 1578 1.1.1.4 mrg 1579 1.1.1.4 mrg for (sa = 0; sa < 2; sa++) 1580 1.1.1.4 mrg { 1581 1.1.1.4 mrg for (sb = 0; sb < 2; sb++) 1582 1.1.1.4 mrg { 1583 1.1.1.4 mrg RND_LOOP_NO_RNDF (r) 1584 1.1.1.4 mrg { 1585 1.1.1.4 mrg MPFR_ASSERTN (mpfr_equal_p (b1, b2)); 1586 1.1.1.4 mrg inex1 = mpfr_div (c1, a, b1, (mpfr_rnd_t) r); 1587 1.1.1.4 mrg inex2 = mpfr_div (c2, a, b2, (mpfr_rnd_t) r); 1588 1.1.1.4 mrg 1589 1.1.1.4 mrg if (! mpfr_equal_p (c1, c2) || 1590 1.1.1.4 mrg ! SAME_SIGN (inex1, inex2)) 1591 1.1.1.4 mrg { 1592 1.1.1.4 mrg printf ("Error in bug20180126 for " 1593 1.1.1.4 mrg "pa=%d pb=%d pc=%d sa=%d sb=%d %s\n", 1594 1.1.1.4 mrg pa, pb, pc, sa, sb, 1595 1.1.1.4 mrg mpfr_print_rnd_mode ((mpfr_rnd_t) r)); 1596 1.1.1.4 mrg printf ("inex1 = %d, c1 = ", inex1); 1597 1.1.1.4 mrg mpfr_dump (c1); 1598 1.1.1.4 mrg printf ("inex2 = %d, c2 = ", inex2); 1599 1.1.1.4 mrg mpfr_dump (c2); 1600 1.1.1.4 mrg exit (1); 1601 1.1.1.4 mrg } 1602 1.1.1.4 mrg } 1603 1.1.1.4 mrg 1604 1.1.1.4 mrg mpfr_neg (b1, b1, MPFR_RNDN); 1605 1.1.1.4 mrg mpfr_neg (b2, b2, MPFR_RNDN); 1606 1.1.1.4 mrg } /* sb */ 1607 1.1.1.4 mrg 1608 1.1.1.4 mrg mpfr_neg (a, a, MPFR_RNDN); 1609 1.1.1.4 mrg } /* sa */ 1610 1.1.1.4 mrg 1611 1.1.1.4 mrg mpfr_clears (c1, c2, (mpfr_ptr) 0); 1612 1.1.1.4 mrg } /* pc */ 1613 1.1.1.4 mrg 1614 1.1.1.4 mrg mpfr_clears (a, b1, b2, (mpfr_ptr) 0); 1615 1.1.1.4 mrg } /* j */ 1616 1.1.1.4 mrg } 1617 1.1.1.4 mrg 1618 1.1.1.5 mrg static void 1619 1.1.1.5 mrg coverage (mpfr_prec_t pmax) 1620 1.1.1.5 mrg { 1621 1.1.1.5 mrg mpfr_prec_t p; 1622 1.1.1.5 mrg 1623 1.1.1.5 mrg for (p = MPFR_PREC_MIN; p <= pmax; p++) 1624 1.1.1.5 mrg { 1625 1.1.1.5 mrg int inex; 1626 1.1.1.5 mrg mpfr_t q, u, v; 1627 1.1.1.5 mrg 1628 1.1.1.5 mrg mpfr_init2 (q, p); 1629 1.1.1.5 mrg mpfr_init2 (u, p); 1630 1.1.1.5 mrg mpfr_init2 (v, p); 1631 1.1.1.5 mrg 1632 1.1.1.5 mrg /* exercise case qx < emin */ 1633 1.1.1.5 mrg mpfr_set_ui_2exp (u, 1, mpfr_get_emin (), MPFR_RNDN); 1634 1.1.1.5 mrg mpfr_set_ui (v, 4, MPFR_RNDN); 1635 1.1.1.5 mrg 1636 1.1.1.5 mrg mpfr_clear_flags (); 1637 1.1.1.5 mrg /* u/v = 2^(emin-2), should be rounded to +0 for RNDN */ 1638 1.1.1.5 mrg inex = mpfr_div (q, u, v, MPFR_RNDN); 1639 1.1.1.5 mrg MPFR_ASSERTN(inex < 0); 1640 1.1.1.5 mrg MPFR_ASSERTN(mpfr_zero_p (q) && mpfr_signbit (q) == 0); 1641 1.1.1.5 mrg MPFR_ASSERTN(mpfr_underflow_p ()); 1642 1.1.1.5 mrg 1643 1.1.1.5 mrg mpfr_clear_flags (); 1644 1.1.1.5 mrg /* u/v = 2^(emin-2), should be rounded to 2^(emin-1) for RNDU */ 1645 1.1.1.5 mrg inex = mpfr_div (q, u, v, MPFR_RNDU); 1646 1.1.1.5 mrg MPFR_ASSERTN(inex > 0); 1647 1.1.1.5 mrg MPFR_ASSERTN(mpfr_cmp_ui_2exp (q, 1, mpfr_get_emin () - 1) == 0); 1648 1.1.1.5 mrg MPFR_ASSERTN(mpfr_underflow_p ()); 1649 1.1.1.5 mrg 1650 1.1.1.5 mrg mpfr_clear_flags (); 1651 1.1.1.5 mrg /* u/v = 2^(emin-2), should be rounded to +0 for RNDZ */ 1652 1.1.1.5 mrg inex = mpfr_div (q, u, v, MPFR_RNDZ); 1653 1.1.1.5 mrg MPFR_ASSERTN(inex < 0); 1654 1.1.1.5 mrg MPFR_ASSERTN(mpfr_zero_p (q) && mpfr_signbit (q) == 0); 1655 1.1.1.5 mrg MPFR_ASSERTN(mpfr_underflow_p ()); 1656 1.1.1.5 mrg 1657 1.1.1.5 mrg if (p == 1) 1658 1.1.1.5 mrg goto end_of_loop; 1659 1.1.1.5 mrg 1660 1.1.1.5 mrg mpfr_set_ui_2exp (u, 1, mpfr_get_emin (), MPFR_RNDN); 1661 1.1.1.5 mrg mpfr_nextbelow (u); /* u = (1-2^(-p))*2^emin */ 1662 1.1.1.5 mrg mpfr_set_ui (v, 2, MPFR_RNDN); 1663 1.1.1.5 mrg 1664 1.1.1.5 mrg mpfr_clear_flags (); 1665 1.1.1.5 mrg /* u/v = (1-2^(-p))*2^(emin-1), will round to 2^(emin-1) for RNDN */ 1666 1.1.1.5 mrg inex = mpfr_div (q, u, v, MPFR_RNDN); 1667 1.1.1.5 mrg MPFR_ASSERTN(inex > 0); 1668 1.1.1.5 mrg MPFR_ASSERTN(mpfr_cmp_ui_2exp (q, 1, mpfr_get_emin () - 1) == 0); 1669 1.1.1.5 mrg MPFR_ASSERTN(mpfr_underflow_p ()); 1670 1.1.1.5 mrg 1671 1.1.1.5 mrg mpfr_clear_flags (); 1672 1.1.1.5 mrg /* u/v should round to 2^(emin-1) for RNDU */ 1673 1.1.1.5 mrg inex = mpfr_div (q, u, v, MPFR_RNDU); 1674 1.1.1.5 mrg MPFR_ASSERTN(inex > 0); 1675 1.1.1.5 mrg MPFR_ASSERTN(mpfr_cmp_ui_2exp (q, 1, mpfr_get_emin () - 1) == 0); 1676 1.1.1.5 mrg MPFR_ASSERTN(mpfr_underflow_p ()); 1677 1.1.1.5 mrg 1678 1.1.1.5 mrg mpfr_clear_flags (); 1679 1.1.1.5 mrg /* u/v should round to +0 for RNDZ */ 1680 1.1.1.5 mrg inex = mpfr_div (q, u, v, MPFR_RNDZ); 1681 1.1.1.5 mrg MPFR_ASSERTN(inex < 0); 1682 1.1.1.5 mrg MPFR_ASSERTN(mpfr_zero_p (q) && mpfr_signbit (q) == 0); 1683 1.1.1.5 mrg MPFR_ASSERTN(mpfr_underflow_p ()); 1684 1.1.1.5 mrg 1685 1.1.1.5 mrg end_of_loop: 1686 1.1.1.5 mrg mpfr_clear (q); 1687 1.1.1.5 mrg mpfr_clear (u); 1688 1.1.1.5 mrg mpfr_clear (v); 1689 1.1.1.5 mrg } 1690 1.1.1.5 mrg } 1691 1.1.1.5 mrg 1692 1.1.1.5 mrg /* coverage for case usize >= n + n in Mulders' algorithm */ 1693 1.1.1.5 mrg static void 1694 1.1.1.5 mrg coverage2 (void) 1695 1.1.1.5 mrg { 1696 1.1.1.5 mrg mpfr_prec_t p; 1697 1.1.1.5 mrg mpfr_t q, u, v, t, w; 1698 1.1.1.5 mrg int inex, inex2; 1699 1.1.1.5 mrg 1700 1.1.1.5 mrg p = MPFR_DIV_THRESHOLD * GMP_NUMB_BITS; 1701 1.1.1.5 mrg mpfr_init2 (q, p); 1702 1.1.1.5 mrg mpfr_init2 (u, 2 * p + 3 * GMP_NUMB_BITS); 1703 1.1.1.5 mrg mpfr_init2 (v, p); 1704 1.1.1.5 mrg do mpfr_urandomb (u, RANDS); while (mpfr_zero_p (u)); 1705 1.1.1.5 mrg do mpfr_urandomb (v, RANDS); while (mpfr_zero_p (v)); 1706 1.1.1.5 mrg inex = mpfr_div (q, u, v, MPFR_RNDN); 1707 1.1.1.5 mrg mpfr_init2 (t, mpfr_get_prec (u)); 1708 1.1.1.5 mrg mpfr_init2 (w, mpfr_get_prec (u)); 1709 1.1.1.5 mrg inex2 = mpfr_mul (t, q, v, MPFR_RNDN); 1710 1.1.1.5 mrg MPFR_ASSERTN(inex2 == 0); 1711 1.1.1.5 mrg if (inex == 0) /* check q*v = u */ 1712 1.1.1.5 mrg MPFR_ASSERTN(mpfr_equal_p (u, t)); 1713 1.1.1.5 mrg else 1714 1.1.1.5 mrg { 1715 1.1.1.5 mrg if (inex > 0) 1716 1.1.1.5 mrg mpfr_nextbelow (q); 1717 1.1.1.5 mrg else 1718 1.1.1.5 mrg mpfr_nextabove (q); 1719 1.1.1.5 mrg inex2 = mpfr_mul (w, q, v, MPFR_RNDN); 1720 1.1.1.5 mrg MPFR_ASSERTN(inex2 == 0); 1721 1.1.1.5 mrg inex2 = mpfr_sub (t, t, u, MPFR_RNDN); 1722 1.1.1.5 mrg MPFR_ASSERTN(inex2 == 0); 1723 1.1.1.5 mrg inex2 = mpfr_sub (w, w, u, MPFR_RNDN); 1724 1.1.1.5 mrg MPFR_ASSERTN(inex2 == 0); 1725 1.1.1.5 mrg MPFR_ASSERTN(mpfr_cmpabs (t, w) <= 0); 1726 1.1.1.5 mrg if (mpfr_cmpabs (t, w) == 0) /* even rule: significand of q should now 1727 1.1.1.5 mrg be odd */ 1728 1.1.1.5 mrg MPFR_ASSERTN(mpfr_min_prec (q) == mpfr_get_prec (q)); 1729 1.1.1.5 mrg } 1730 1.1.1.5 mrg 1731 1.1.1.5 mrg mpfr_clear (q); 1732 1.1.1.5 mrg mpfr_clear (u); 1733 1.1.1.5 mrg mpfr_clear (v); 1734 1.1.1.5 mrg mpfr_clear (t); 1735 1.1.1.5 mrg mpfr_clear (w); 1736 1.1.1.5 mrg } 1737 1.1.1.5 mrg 1738 1.1 mrg int 1739 1.1 mrg main (int argc, char *argv[]) 1740 1.1 mrg { 1741 1.1 mrg tests_start_mpfr (); 1742 1.1 mrg 1743 1.1.1.5 mrg coverage (1024); 1744 1.1.1.5 mrg coverage2 (); 1745 1.1.1.4 mrg bug20180126 (); 1746 1.1.1.4 mrg bug20171218 (); 1747 1.1.1.4 mrg testall_rndf (9); 1748 1.1.1.4 mrg test_20170105 (); 1749 1.1 mrg check_inexact (); 1750 1.1 mrg check_hard (); 1751 1.1.1.2 mrg check_special (); 1752 1.1 mrg check_lowr (); 1753 1.1 mrg check_float (); /* checks single precision */ 1754 1.1 mrg check_double (); 1755 1.1 mrg check_convergence (); 1756 1.1 mrg check_64 (); 1757 1.1 mrg 1758 1.1 mrg check4("4.0","4.503599627370496e15", MPFR_RNDZ, 62, 1759 1.1 mrg "0.10000000000000000000000000000000000000000000000000000000000000E-49"); 1760 1.1 mrg check4("1.0","2.10263340267725788209e+187", MPFR_RNDU, 65, 1761 1.1 mrg "0.11010011111001101011111001100111110100000001101001111100111000000E-622"); 1762 1.1 mrg check4("2.44394909079968374564e-150", "2.10263340267725788209e+187",MPFR_RNDU, 1763 1.1 mrg 65, 1764 1.1 mrg "0.11010011111001101011111001100111110100000001101001111100111000000E-1119"); 1765 1.1 mrg 1766 1.1 mrg consistency (); 1767 1.1 mrg test_20070603 (); 1768 1.1 mrg test_20070628 (); 1769 1.1.1.3 mrg test_20151023 (); 1770 1.1.1.4 mrg test_20160831 (); 1771 1.1.1.4 mrg test_20170104 (); 1772 1.1.1.4 mrg test_20171219 (); 1773 1.1.1.4 mrg test_generic (MPFR_PREC_MIN, 800, 50); 1774 1.1.1.4 mrg test_bad (); 1775 1.1.1.3 mrg test_extreme (); 1776 1.1.1.4 mrg test_mpfr_divsp2 (); 1777 1.1.1.4 mrg #if !defined(MPFR_GENERIC_ABI) && GMP_NUMB_BITS == 64 1778 1.1.1.4 mrg test_mpfr_div2_approx (1000000); 1779 1.1.1.4 mrg #endif 1780 1.1 mrg 1781 1.1 mrg tests_end_mpfr (); 1782 1.1 mrg return 0; 1783 1.1 mrg } 1784