1 /* mpfr_mul -- multiply two floating-point numbers 2 3 Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. 4 Contributed by the Arenaire and Caramel projects, INRIA. 5 6 This file is part of the GNU MPFR Library. 7 8 The GNU MPFR Library is free software; you can redistribute it and/or modify 9 it under the terms of the GNU Lesser General Public License as published by 10 the Free Software Foundation; either version 3 of the License, or (at your 11 option) any later version. 12 13 The GNU MPFR Library is distributed in the hope that it will be useful, but 14 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 15 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 16 License for more details. 17 18 You should have received a copy of the GNU Lesser General Public License 19 along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see 20 http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc., 21 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ 22 23 #define MPFR_NEED_LONGLONG_H 24 #include "mpfr-impl.h" 25 26 27 /********* BEGINNING CHECK *************/ 28 29 /* Check if we have to check the result of mpfr_mul. 30 TODO: Find a better (and faster?) check than using old implementation */ 31 #ifdef WANT_ASSERT 32 # if WANT_ASSERT >= 3 33 34 int mpfr_mul2 (mpfr_ptr a, mpfr_srcptr b, mpfr_srcptr c, mpfr_rnd_t rnd_mode); 35 static int 36 mpfr_mul3 (mpfr_ptr a, mpfr_srcptr b, mpfr_srcptr c, mpfr_rnd_t rnd_mode) 37 { 38 /* Old implementation */ 39 int sign_product, cc, inexact; 40 mpfr_exp_t ax; 41 mp_limb_t *tmp; 42 mp_limb_t b1; 43 mpfr_prec_t bq, cq; 44 mp_size_t bn, cn, tn, k; 45 MPFR_TMP_DECL(marker); 46 47 /* deal with special cases */ 48 if (MPFR_ARE_SINGULAR(b,c)) 49 { 50 if (MPFR_IS_NAN(b) || MPFR_IS_NAN(c)) 51 { 52 MPFR_SET_NAN(a); 53 MPFR_RET_NAN; 54 } 55 sign_product = MPFR_MULT_SIGN( MPFR_SIGN(b) , MPFR_SIGN(c) ); 56 if (MPFR_IS_INF(b)) 57 { 58 if (MPFR_IS_INF(c) || MPFR_NOTZERO(c)) 59 { 60 MPFR_SET_SIGN(a,sign_product); 61 MPFR_SET_INF(a); 62 MPFR_RET(0); /* exact */ 63 } 64 else 65 { 66 MPFR_SET_NAN(a); 67 MPFR_RET_NAN; 68 } 69 } 70 else if (MPFR_IS_INF(c)) 71 { 72 if (MPFR_NOTZERO(b)) 73 { 74 MPFR_SET_SIGN(a, sign_product); 75 MPFR_SET_INF(a); 76 MPFR_RET(0); /* exact */ 77 } 78 else 79 { 80 MPFR_SET_NAN(a); 81 MPFR_RET_NAN; 82 } 83 } 84 else 85 { 86 MPFR_ASSERTD(MPFR_IS_ZERO(b) || MPFR_IS_ZERO(c)); 87 MPFR_SET_SIGN(a, sign_product); 88 MPFR_SET_ZERO(a); 89 MPFR_RET(0); /* 0 * 0 is exact */ 90 } 91 } 92 sign_product = MPFR_MULT_SIGN( MPFR_SIGN(b) , MPFR_SIGN(c) ); 93 94 ax = MPFR_GET_EXP (b) + MPFR_GET_EXP (c); 95 96 bq = MPFR_PREC(b); 97 cq = MPFR_PREC(c); 98 99 MPFR_ASSERTD(bq+cq > bq); /* PREC_MAX is /2 so no integer overflow */ 100 101 bn = (bq+GMP_NUMB_BITS-1)/GMP_NUMB_BITS; /* number of limbs of b */ 102 cn = (cq+GMP_NUMB_BITS-1)/GMP_NUMB_BITS; /* number of limbs of c */ 103 k = bn + cn; /* effective nb of limbs used by b*c (= tn or tn+1) below */ 104 tn = (bq + cq + GMP_NUMB_BITS - 1) / GMP_NUMB_BITS; 105 /* <= k, thus no int overflow */ 106 MPFR_ASSERTD(tn <= k); 107 108 /* Check for no size_t overflow*/ 109 MPFR_ASSERTD((size_t) k <= ((size_t) -1) / BYTES_PER_MP_LIMB); 110 MPFR_TMP_MARK(marker); 111 tmp = MPFR_TMP_LIMBS_ALLOC (k); 112 113 /* multiplies two mantissa in temporary allocated space */ 114 b1 = (MPFR_LIKELY(bn >= cn)) ? 115 mpn_mul (tmp, MPFR_MANT(b), bn, MPFR_MANT(c), cn) 116 : mpn_mul (tmp, MPFR_MANT(c), cn, MPFR_MANT(b), bn); 117 118 /* now tmp[0]..tmp[k-1] contains the product of both mantissa, 119 with tmp[k-1]>=2^(GMP_NUMB_BITS-2) */ 120 b1 >>= GMP_NUMB_BITS - 1; /* msb from the product */ 121 122 /* if the mantissas of b and c are uniformly distributed in ]1/2, 1], 123 then their product is in ]1/4, 1/2] with probability 2*ln(2)-1 ~ 0.386 124 and in [1/2, 1] with probability 2-2*ln(2) ~ 0.614 */ 125 tmp += k - tn; 126 if (MPFR_UNLIKELY(b1 == 0)) 127 mpn_lshift (tmp, tmp, tn, 1); /* tn <= k, so no stack corruption */ 128 cc = mpfr_round_raw (MPFR_MANT (a), tmp, bq + cq, 129 MPFR_IS_NEG_SIGN(sign_product), 130 MPFR_PREC (a), rnd_mode, &inexact); 131 132 /* cc = 1 ==> result is a power of two */ 133 if (MPFR_UNLIKELY(cc)) 134 MPFR_MANT(a)[MPFR_LIMB_SIZE(a)-1] = MPFR_LIMB_HIGHBIT; 135 136 MPFR_TMP_FREE(marker); 137 138 { 139 mpfr_exp_t ax2 = ax + (mpfr_exp_t) (b1 - 1 + cc); 140 if (MPFR_UNLIKELY( ax2 > __gmpfr_emax)) 141 return mpfr_overflow (a, rnd_mode, sign_product); 142 if (MPFR_UNLIKELY( ax2 < __gmpfr_emin)) 143 { 144 /* In the rounding to the nearest mode, if the exponent of the exact 145 result (i.e. before rounding, i.e. without taking cc into account) 146 is < __gmpfr_emin - 1 or the exact result is a power of 2 (i.e. if 147 both arguments are powers of 2) in absolute value, then round to 148 zero. */ 149 if (rnd_mode == MPFR_RNDN && 150 (ax + (mpfr_exp_t) b1 < __gmpfr_emin || 151 (mpfr_powerof2_raw (b) && mpfr_powerof2_raw (c)))) 152 rnd_mode = MPFR_RNDZ; 153 return mpfr_underflow (a, rnd_mode, sign_product); 154 } 155 MPFR_SET_EXP (a, ax2); 156 MPFR_SET_SIGN(a, sign_product); 157 } 158 MPFR_RET (inexact); 159 } 160 161 int 162 mpfr_mul (mpfr_ptr a, mpfr_srcptr b, mpfr_srcptr c, mpfr_rnd_t rnd_mode) 163 { 164 mpfr_t ta, tb, tc; 165 int inexact1, inexact2; 166 167 mpfr_init2 (ta, MPFR_PREC (a)); 168 mpfr_init2 (tb, MPFR_PREC (b)); 169 mpfr_init2 (tc, MPFR_PREC (c)); 170 MPFR_ASSERTN (mpfr_set (tb, b, MPFR_RNDN) == 0); 171 MPFR_ASSERTN (mpfr_set (tc, c, MPFR_RNDN) == 0); 172 173 inexact2 = mpfr_mul3 (ta, tb, tc, rnd_mode); 174 inexact1 = mpfr_mul2 (a, b, c, rnd_mode); 175 if (mpfr_cmp (ta, a) || inexact1*inexact2 < 0 176 || (inexact1*inexact2 == 0 && (inexact1|inexact2) != 0)) 177 { 178 fprintf (stderr, "mpfr_mul return different values for %s\n" 179 "Prec_a = %lu, Prec_b = %lu, Prec_c = %lu\nB = ", 180 mpfr_print_rnd_mode (rnd_mode), 181 MPFR_PREC (a), MPFR_PREC (b), MPFR_PREC (c)); 182 mpfr_out_str (stderr, 16, 0, tb, MPFR_RNDN); 183 fprintf (stderr, "\nC = "); 184 mpfr_out_str (stderr, 16, 0, tc, MPFR_RNDN); 185 fprintf (stderr, "\nOldMul: "); 186 mpfr_out_str (stderr, 16, 0, ta, MPFR_RNDN); 187 fprintf (stderr, "\nNewMul: "); 188 mpfr_out_str (stderr, 16, 0, a, MPFR_RNDN); 189 fprintf (stderr, "\nNewInexact = %d | OldInexact = %d\n", 190 inexact1, inexact2); 191 MPFR_ASSERTN(0); 192 } 193 194 mpfr_clears (ta, tb, tc, (mpfr_ptr) 0); 195 return inexact1; 196 } 197 198 # define mpfr_mul mpfr_mul2 199 # endif 200 #endif 201 202 /****** END OF CHECK *******/ 203 204 /* Multiply 2 mpfr_t */ 205 206 /* Note: mpfr_sqr will call mpfr_mul if bn > MPFR_SQR_THRESHOLD, 207 in order to use Mulders' mulhigh, which is handled only here 208 to avoid partial code duplication. There is some overhead due 209 to the additional tests, but slowdown should not be noticeable 210 as this code is not executed in very small precisions. */ 211 212 int 213 mpfr_mul (mpfr_ptr a, mpfr_srcptr b, mpfr_srcptr c, mpfr_rnd_t rnd_mode) 214 { 215 int sign, inexact; 216 mpfr_exp_t ax, ax2; 217 mp_limb_t *tmp; 218 mp_limb_t b1; 219 mpfr_prec_t bq, cq; 220 mp_size_t bn, cn, tn, k, threshold; 221 MPFR_TMP_DECL (marker); 222 223 MPFR_LOG_FUNC 224 (("b[%Pu]=%.*Rg c[%Pu]=%.*Rg rnd=%d", 225 mpfr_get_prec (b), mpfr_log_prec, b, 226 mpfr_get_prec (c), mpfr_log_prec, c, rnd_mode), 227 ("a[%Pu]=%.*Rg inexact=%d", 228 mpfr_get_prec (a), mpfr_log_prec, a, inexact)); 229 230 /* deal with special cases */ 231 if (MPFR_ARE_SINGULAR (b, c)) 232 { 233 if (MPFR_IS_NAN (b) || MPFR_IS_NAN (c)) 234 { 235 MPFR_SET_NAN (a); 236 MPFR_RET_NAN; 237 } 238 sign = MPFR_MULT_SIGN (MPFR_SIGN (b), MPFR_SIGN (c)); 239 if (MPFR_IS_INF (b)) 240 { 241 if (!MPFR_IS_ZERO (c)) 242 { 243 MPFR_SET_SIGN (a, sign); 244 MPFR_SET_INF (a); 245 MPFR_RET (0); 246 } 247 else 248 { 249 MPFR_SET_NAN (a); 250 MPFR_RET_NAN; 251 } 252 } 253 else if (MPFR_IS_INF (c)) 254 { 255 if (!MPFR_IS_ZERO (b)) 256 { 257 MPFR_SET_SIGN (a, sign); 258 MPFR_SET_INF (a); 259 MPFR_RET(0); 260 } 261 else 262 { 263 MPFR_SET_NAN (a); 264 MPFR_RET_NAN; 265 } 266 } 267 else 268 { 269 MPFR_ASSERTD (MPFR_IS_ZERO(b) || MPFR_IS_ZERO(c)); 270 MPFR_SET_SIGN (a, sign); 271 MPFR_SET_ZERO (a); 272 MPFR_RET (0); 273 } 274 } 275 sign = MPFR_MULT_SIGN (MPFR_SIGN (b), MPFR_SIGN (c)); 276 277 ax = MPFR_GET_EXP (b) + MPFR_GET_EXP (c); 278 /* Note: the exponent of the exact result will be e = bx + cx + ec with 279 ec in {-1,0,1} and the following assumes that e is representable. */ 280 281 /* FIXME: Useful since we do an exponent check after ? 282 * It is useful iff the precision is big, there is an overflow 283 * and we are doing further mults...*/ 284 #ifdef HUGE 285 if (MPFR_UNLIKELY (ax > __gmpfr_emax + 1)) 286 return mpfr_overflow (a, rnd_mode, sign); 287 if (MPFR_UNLIKELY (ax < __gmpfr_emin - 2)) 288 return mpfr_underflow (a, rnd_mode == MPFR_RNDN ? MPFR_RNDZ : rnd_mode, 289 sign); 290 #endif 291 292 bq = MPFR_PREC (b); 293 cq = MPFR_PREC (c); 294 295 MPFR_ASSERTD (bq+cq > bq); /* PREC_MAX is /2 so no integer overflow */ 296 297 bn = (bq+GMP_NUMB_BITS-1)/GMP_NUMB_BITS; /* number of limbs of b */ 298 cn = (cq+GMP_NUMB_BITS-1)/GMP_NUMB_BITS; /* number of limbs of c */ 299 k = bn + cn; /* effective nb of limbs used by b*c (= tn or tn+1) below */ 300 tn = (bq + cq + GMP_NUMB_BITS - 1) / GMP_NUMB_BITS; 301 MPFR_ASSERTD (tn <= k); /* tn <= k, thus no int overflow */ 302 303 /* Check for no size_t overflow*/ 304 MPFR_ASSERTD ((size_t) k <= ((size_t) -1) / BYTES_PER_MP_LIMB); 305 MPFR_TMP_MARK (marker); 306 tmp = MPFR_TMP_LIMBS_ALLOC (k); 307 308 /* multiplies two mantissa in temporary allocated space */ 309 if (MPFR_UNLIKELY (bn < cn)) 310 { 311 mpfr_srcptr z = b; 312 mp_size_t zn = bn; 313 b = c; 314 bn = cn; 315 c = z; 316 cn = zn; 317 } 318 MPFR_ASSERTD (bn >= cn); 319 if (MPFR_LIKELY (bn <= 2)) 320 { 321 if (bn == 1) 322 { 323 /* 1 limb * 1 limb */ 324 umul_ppmm (tmp[1], tmp[0], MPFR_MANT (b)[0], MPFR_MANT (c)[0]); 325 b1 = tmp[1]; 326 } 327 else if (MPFR_UNLIKELY (cn == 1)) 328 { 329 /* 2 limbs * 1 limb */ 330 mp_limb_t t; 331 umul_ppmm (tmp[1], tmp[0], MPFR_MANT (b)[0], MPFR_MANT (c)[0]); 332 umul_ppmm (tmp[2], t, MPFR_MANT (b)[1], MPFR_MANT (c)[0]); 333 add_ssaaaa (tmp[2], tmp[1], tmp[2], tmp[1], 0, t); 334 b1 = tmp[2]; 335 } 336 else 337 { 338 /* 2 limbs * 2 limbs */ 339 mp_limb_t t1, t2, t3; 340 /* First 2 limbs * 1 limb */ 341 umul_ppmm (tmp[1], tmp[0], MPFR_MANT (b)[0], MPFR_MANT (c)[0]); 342 umul_ppmm (tmp[2], t1, MPFR_MANT (b)[1], MPFR_MANT (c)[0]); 343 add_ssaaaa (tmp[2], tmp[1], tmp[2], tmp[1], 0, t1); 344 /* Second, the other 2 limbs * 1 limb product */ 345 umul_ppmm (t1, t2, MPFR_MANT (b)[0], MPFR_MANT (c)[1]); 346 umul_ppmm (tmp[3], t3, MPFR_MANT (b)[1], MPFR_MANT (c)[1]); 347 add_ssaaaa (tmp[3], t1, tmp[3], t1, 0, t3); 348 /* Sum those two partial products */ 349 add_ssaaaa (tmp[2], tmp[1], tmp[2], tmp[1], t1, t2); 350 tmp[3] += (tmp[2] < t1); 351 b1 = tmp[3]; 352 } 353 b1 >>= (GMP_NUMB_BITS - 1); 354 tmp += k - tn; 355 if (MPFR_UNLIKELY (b1 == 0)) 356 mpn_lshift (tmp, tmp, tn, 1); /* tn <= k, so no stack corruption */ 357 } 358 else 359 /* Mulders' mulhigh. This code can also be used via mpfr_sqr, 360 hence the tests b != c. */ 361 if (MPFR_UNLIKELY (bn > (threshold = b != c ? 362 MPFR_MUL_THRESHOLD : MPFR_SQR_THRESHOLD))) 363 { 364 mp_limb_t *bp, *cp; 365 mp_size_t n; 366 mpfr_prec_t p; 367 368 /* First check if we can reduce the precision of b or c: 369 exact values are a nightmare for the short product trick */ 370 bp = MPFR_MANT (b); 371 cp = MPFR_MANT (c); 372 MPFR_ASSERTN (threshold >= 1); 373 if (MPFR_UNLIKELY ((bp[0] == 0 && bp[1] == 0) || 374 (cp[0] == 0 && cp[1] == 0))) 375 { 376 mpfr_t b_tmp, c_tmp; 377 378 MPFR_TMP_FREE (marker); 379 /* Check for b */ 380 while (*bp == 0) 381 { 382 bp++; 383 bn--; 384 MPFR_ASSERTD (bn > 0); 385 } /* This must end since the most significant limb is != 0 */ 386 387 /* Check for c too: if b ==c, will do nothing */ 388 while (*cp == 0) 389 { 390 cp++; 391 cn--; 392 MPFR_ASSERTD (cn > 0); 393 } /* This must end since the most significant limb is != 0 */ 394 395 /* It is not the faster way, but it is safer */ 396 MPFR_SET_SAME_SIGN (b_tmp, b); 397 MPFR_SET_EXP (b_tmp, MPFR_GET_EXP (b)); 398 MPFR_PREC (b_tmp) = bn * GMP_NUMB_BITS; 399 MPFR_MANT (b_tmp) = bp; 400 401 if (b != c) 402 { 403 MPFR_SET_SAME_SIGN (c_tmp, c); 404 MPFR_SET_EXP (c_tmp, MPFR_GET_EXP (c)); 405 MPFR_PREC (c_tmp) = cn * GMP_NUMB_BITS; 406 MPFR_MANT (c_tmp) = cp; 407 408 /* Call again mpfr_mul with the fixed arguments */ 409 return mpfr_mul (a, b_tmp, c_tmp, rnd_mode); 410 } 411 else 412 /* Call mpfr_mul instead of mpfr_sqr as the precision 413 is probably still high enough. */ 414 return mpfr_mul (a, b_tmp, b_tmp, rnd_mode); 415 } 416 417 /* Compute estimated precision of mulhigh. 418 We could use `+ (n < cn) + (n < bn)' instead of `+ 2', 419 but does it worth it? */ 420 n = MPFR_LIMB_SIZE (a) + 1; 421 n = MIN (n, cn); 422 MPFR_ASSERTD (n >= 1 && 2*n <= k && n <= cn && n <= bn); 423 p = n * GMP_NUMB_BITS - MPFR_INT_CEIL_LOG2 (n + 2); 424 bp += bn - n; 425 cp += cn - n; 426 427 /* Check if MulHigh can produce a roundable result. 428 We may lose 1 bit due to RNDN, 1 due to final shift. */ 429 if (MPFR_UNLIKELY (MPFR_PREC (a) > p - 5)) 430 { 431 if (MPFR_UNLIKELY (MPFR_PREC (a) > p - 5 + GMP_NUMB_BITS 432 || bn <= threshold + 1)) 433 { 434 /* MulHigh can't produce a roundable result. */ 435 MPFR_LOG_MSG (("mpfr_mulhigh can't be used (%lu VS %lu)\n", 436 MPFR_PREC (a), p)); 437 goto full_multiply; 438 } 439 /* Add one extra limb to mantissa of b and c. */ 440 if (bn > n) 441 bp --; 442 else 443 { 444 bp = MPFR_TMP_LIMBS_ALLOC (n + 1); 445 bp[0] = 0; 446 MPN_COPY (bp + 1, MPFR_MANT (b) + bn - n, n); 447 } 448 if (b != c) 449 { 450 if (cn > n) 451 cp --; /* FIXME: Could this happen? */ 452 else 453 { 454 cp = MPFR_TMP_LIMBS_ALLOC (n + 1); 455 cp[0] = 0; 456 MPN_COPY (cp + 1, MPFR_MANT (c) + cn - n, n); 457 } 458 } 459 /* We will compute with one extra limb */ 460 n++; 461 /* ceil(log2(n+2)) takes into account the lost bits due to 462 Mulders' short product */ 463 p = n * GMP_NUMB_BITS - MPFR_INT_CEIL_LOG2 (n + 2); 464 /* Due to some nasty reasons we can have only 4 bits */ 465 MPFR_ASSERTD (MPFR_PREC (a) <= p - 4); 466 467 if (MPFR_LIKELY (k < 2*n)) 468 { 469 tmp = MPFR_TMP_LIMBS_ALLOC (2 * n); 470 tmp += 2*n-k; /* `tmp' still points to an area of `k' limbs */ 471 } 472 } 473 MPFR_LOG_MSG (("Use mpfr_mulhigh (%lu VS %lu)\n", MPFR_PREC (a), p)); 474 /* Compute an approximation of the product of b and c */ 475 if (b != c) 476 mpfr_mulhigh_n (tmp + k - 2 * n, bp, cp, n); 477 else 478 mpfr_sqrhigh_n (tmp + k - 2 * n, bp, n); 479 /* now tmp[0]..tmp[k-1] contains the product of both mantissa, 480 with tmp[k-1]>=2^(GMP_NUMB_BITS-2) */ 481 /* [VL] FIXME: This cannot be true: mpfr_mulhigh_n only 482 depends on pointers and n. As k can be arbitrarily larger, 483 the result cannot depend on k. And indeed, with GMP compiled 484 with --enable-alloca=debug, valgrind was complaining, at 485 least because MPFR_RNDRAW at the end tried to compute the 486 sticky bit even when not necessary; this problem is fixed, 487 but there's at least something wrong with the comment above. */ 488 b1 = tmp[k-1] >> (GMP_NUMB_BITS - 1); /* msb from the product */ 489 490 /* If the mantissas of b and c are uniformly distributed in (1/2, 1], 491 then their product is in (1/4, 1/2] with probability 2*ln(2)-1 492 ~ 0.386 and in [1/2, 1] with probability 2-2*ln(2) ~ 0.614 */ 493 if (MPFR_UNLIKELY (b1 == 0)) 494 /* Warning: the mpfr_mulhigh_n call above only surely affects 495 tmp[k-n-1..k-1], thus we shift only those limbs */ 496 mpn_lshift (tmp + k - n - 1, tmp + k - n - 1, n + 1, 1); 497 tmp += k - tn; 498 MPFR_ASSERTD (MPFR_LIMB_MSB (tmp[tn-1]) != 0); 499 500 /* if the most significant bit b1 is zero, we have only p-1 correct 501 bits */ 502 if (MPFR_UNLIKELY (!mpfr_round_p (tmp, tn, p + b1 - 1, MPFR_PREC(a) 503 + (rnd_mode == MPFR_RNDN)))) 504 { 505 tmp -= k - tn; /* tmp may have changed, FIX IT!!!!! */ 506 goto full_multiply; 507 } 508 } 509 else 510 { 511 full_multiply: 512 MPFR_LOG_MSG (("Use mpn_mul\n", 0)); 513 b1 = mpn_mul (tmp, MPFR_MANT (b), bn, MPFR_MANT (c), cn); 514 515 /* now tmp[0]..tmp[k-1] contains the product of both mantissa, 516 with tmp[k-1]>=2^(GMP_NUMB_BITS-2) */ 517 b1 >>= GMP_NUMB_BITS - 1; /* msb from the product */ 518 519 /* if the mantissas of b and c are uniformly distributed in (1/2, 1], 520 then their product is in (1/4, 1/2] with probability 2*ln(2)-1 521 ~ 0.386 and in [1/2, 1] with probability 2-2*ln(2) ~ 0.614 */ 522 tmp += k - tn; 523 if (MPFR_UNLIKELY (b1 == 0)) 524 mpn_lshift (tmp, tmp, tn, 1); /* tn <= k, so no stack corruption */ 525 } 526 527 ax2 = ax + (mpfr_exp_t) (b1 - 1); 528 MPFR_RNDRAW (inexact, a, tmp, bq+cq, rnd_mode, sign, ax2++); 529 MPFR_TMP_FREE (marker); 530 MPFR_EXP (a) = ax2; /* Can't use MPFR_SET_EXP: Expo may be out of range */ 531 MPFR_SET_SIGN (a, sign); 532 if (MPFR_UNLIKELY (ax2 > __gmpfr_emax)) 533 return mpfr_overflow (a, rnd_mode, sign); 534 if (MPFR_UNLIKELY (ax2 < __gmpfr_emin)) 535 { 536 /* In the rounding to the nearest mode, if the exponent of the exact 537 result (i.e. before rounding, i.e. without taking cc into account) 538 is < __gmpfr_emin - 1 or the exact result is a power of 2 (i.e. if 539 both arguments are powers of 2), then round to zero. */ 540 if (rnd_mode == MPFR_RNDN 541 && (ax + (mpfr_exp_t) b1 < __gmpfr_emin 542 || (mpfr_powerof2_raw (b) && mpfr_powerof2_raw (c)))) 543 rnd_mode = MPFR_RNDZ; 544 return mpfr_underflow (a, rnd_mode, sign); 545 } 546 MPFR_RET (inexact); 547 } 548