1 /* mpfr_pow -- power function x^y
3 Copyright 2001-2016 Free Software Foundation, Inc.
4 Contributed by the AriC and Caramba projects, INRIA.
6 This file is part of the GNU MPFR Library.
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.
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.
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. */
23 #define MPFR_NEED_LONGLONG_H
24 #include "mpfr-impl.h"
26 /* return non zero iff x^y is exact.
27 Assumes x and y are ordinary numbers,
28 y is not an integer, x is not a power of 2 and x is positive
30 If x^y is exact, it computes it and sets *inexact.
33 mpfr_pow_is_exact (mpfr_ptr z
, mpfr_srcptr x
, mpfr_srcptr y
,
34 mpfr_rnd_t rnd_mode
, int *inexact
)
41 MPFR_ASSERTD (!MPFR_IS_SINGULAR (y
));
42 MPFR_ASSERTD (!MPFR_IS_SINGULAR (x
));
43 MPFR_ASSERTD (!mpfr_integer_p (y
));
44 MPFR_ASSERTD (mpfr_cmp_si_2exp (x
, MPFR_INT_SIGN (x
),
45 MPFR_GET_EXP (x
) - 1) != 0);
46 MPFR_ASSERTD (MPFR_IS_POS (x
));
49 return 0; /* x is not a power of two => x^-y is not exact */
51 /* compute d such that y = c*2^d with c odd integer */
53 d
= mpfr_get_z_2exp (c
, y
);
55 mpz_fdiv_q_2exp (c
, c
, i
);
57 /* now y=c*2^d with c odd */
58 /* Since y is not an integer, d is necessarily < 0 */
61 /* Compute a,b such that x=a*2^b */
63 b
= mpfr_get_z_2exp (a
, x
);
65 mpz_fdiv_q_2exp (a
, a
, i
);
67 /* now x=a*2^b with a is odd */
69 for (res
= 1 ; d
!= 0 ; d
++)
71 /* a*2^b is a square iff
72 (i) a is a square when b is even
73 (ii) 2*a is a square when b is odd */
76 mpz_mul_2exp (a
, a
, 1); /* 2*a */
79 MPFR_ASSERTD ((b
% 2) == 0);
80 if (!mpz_perfect_square_p (a
))
88 /* Now x = (a'*2^b')^(2^-d) with d < 0
89 so x^y = ((a'*2^b')^(2^-d))^(c*2^d)
90 = ((a'*2^b')^c with c odd integer */
94 MPFR_MPZ_SIZEINBASE2 (p
, a
);
95 mpfr_init2 (tmp
, p
); /* prec = 1 should not be possible */
96 res
= mpfr_set_z (tmp
, a
, MPFR_RNDN
);
97 MPFR_ASSERTD (res
== 0);
98 res
= mpfr_mul_2si (tmp
, tmp
, b
, MPFR_RNDN
);
99 MPFR_ASSERTD (res
== 0);
100 *inexact
= mpfr_pow_z (z
, tmp
, c
, rnd_mode
);
110 /* Return 1 if y is an odd integer, 0 otherwise. */
112 is_odd (mpfr_srcptr y
)
119 /* NAN, INF or ZERO are not allowed */
120 MPFR_ASSERTD (!MPFR_IS_SINGULAR (y
));
122 expo
= MPFR_GET_EXP (y
);
124 return 0; /* |y| < 1 and not 0 */
127 if ((mpfr_prec_t
) expo
> prec
)
128 return 0; /* y is a multiple of 2^(expo-prec), thus not odd */
131 y = 1xxxxxxxxxt.zzzzzzzzzzzzzzzzzz[000]
132 expo bits (prec-expo) bits
134 We have to check that:
135 (a) the bit 't' is set
136 (b) all the 'z' bits are zero
139 prec
= MPFR_PREC2LIMBS (prec
) * GMP_NUMB_BITS
- expo
;
140 /* number of z+0 bits */
142 yn
= prec
/ GMP_NUMB_BITS
;
143 MPFR_ASSERTN(yn
>= 0);
144 /* yn is the index of limb containing the 't' bit */
147 /* if expo is a multiple of GMP_NUMB_BITS, t is bit 0 */
148 if (expo
% GMP_NUMB_BITS
== 0 ? (yp
[yn
] & 1) == 0
149 : yp
[yn
] << ((expo
% GMP_NUMB_BITS
) - 1) != MPFR_LIMB_HIGHBIT
)
157 /* Assumes that the exponent range has already been extended and if y is
158 an integer, then the result is not exact in unbounded exponent range. */
160 mpfr_pow_general (mpfr_ptr z
, mpfr_srcptr x
, mpfr_srcptr y
,
161 mpfr_rnd_t rnd_mode
, int y_is_integer
, mpfr_save_expo_t
*expo
)
163 mpfr_t t
, u
, k
, absx
;
166 int check_exact_case
= 0;
168 /* Declaration of the size variable */
169 mpfr_prec_t Nz
= MPFR_PREC(z
); /* target precision */
170 mpfr_prec_t Nt
; /* working precision */
171 mpfr_exp_t err
; /* error */
172 MPFR_ZIV_DECL (ziv_loop
);
176 (("x[%Pu]=%.*Rg y[%Pu]=%.*Rg rnd=%d",
177 mpfr_get_prec (x
), mpfr_log_prec
, x
,
178 mpfr_get_prec (y
), mpfr_log_prec
, y
, rnd_mode
),
179 ("z[%Pu]=%.*Rg inexact=%d",
180 mpfr_get_prec (z
), mpfr_log_prec
, z
, inexact
));
182 /* We put the absolute value of x in absx, pointing to the significand
183 of x to avoid allocating memory for the significand of absx. */
184 MPFR_ALIAS(absx
, x
, /*sign=*/ 1, /*EXP=*/ MPFR_EXP(x
));
186 /* We will compute the absolute value of the result. So, let's
187 invert the rounding mode if the result is negative. */
188 if (MPFR_IS_NEG (x
) && is_odd (y
))
191 rnd_mode
= MPFR_INVERT_RND (rnd_mode
);
194 /* compute the precision of intermediary variable */
195 /* the optimal number of bits : see algorithms.tex */
196 Nt
= Nz
+ 5 + MPFR_INT_CEIL_LOG2 (Nz
);
198 /* initialise of intermediary variable */
201 MPFR_ZIV_INIT (ziv_loop
, Nt
);
204 MPFR_BLOCK_DECL (flags1
);
206 /* compute exp(y*ln|x|), using MPFR_RNDU to get an upper bound, so
207 that we can detect underflows. */
208 mpfr_log (t
, absx
, MPFR_IS_NEG (y
) ? MPFR_RNDD
: MPFR_RNDU
); /* ln|x| */
209 mpfr_mul (t
, y
, t
, MPFR_RNDU
); /* y*ln|x| */
212 MPFR_LOG_MSG (("subtract k * ln(2)\n", 0));
213 mpfr_const_log2 (u
, MPFR_RNDD
);
214 mpfr_mul (u
, u
, k
, MPFR_RNDD
);
215 /* Error on u = k * log(2): < k * 2^(-Nt) < 1. */
216 mpfr_sub (t
, t
, u
, MPFR_RNDU
);
217 MPFR_LOG_MSG (("t = y * ln|x| - k * ln(2)\n", 0));
220 /* estimate of the error -- see pow function in algorithms.tex.
221 The error on t is at most 1/2 + 3*2^(EXP(t)+1) ulps, which is
222 <= 2^(EXP(t)+3) for EXP(t) >= -1, and <= 2 ulps for EXP(t) <= -2.
223 Additional error if k_no_zero: treal = t * errk, with
224 1 - |k| * 2^(-Nt) <= exp(-|k| * 2^(-Nt)) <= errk <= 1,
225 i.e., additional absolute error <= 2^(EXP(k)+EXP(t)-Nt).
226 Total error <= 2^err1 + 2^err2 <= 2^(max(err1,err2)+1). */
227 err
= MPFR_NOTZERO (t
) && MPFR_GET_EXP (t
) >= -1 ?
228 MPFR_GET_EXP (t
) + 3 : 1;
231 if (MPFR_GET_EXP (k
) > err
)
232 err
= MPFR_GET_EXP (k
);
235 MPFR_BLOCK (flags1
, mpfr_exp (t
, t
, MPFR_RNDN
)); /* exp(y*ln|x|)*/
236 /* We need to test */
237 if (MPFR_UNLIKELY (MPFR_IS_SINGULAR (t
) || MPFR_UNDERFLOW (flags1
)))
240 MPFR_BLOCK_DECL (flags2
);
242 MPFR_ASSERTN (!k_non_zero
);
243 MPFR_ASSERTN (!MPFR_IS_NAN (t
));
245 /* Real underflow? */
246 if (MPFR_IS_ZERO (t
))
248 /* Underflow. We computed rndn(exp(t)), where t >= y*ln|x|.
249 Therefore rndn(|x|^y) = 0, and we have a real underflow on
251 inexact
= mpfr_underflow (z
, rnd_mode
== MPFR_RNDN
? MPFR_RNDZ
252 : rnd_mode
, MPFR_SIGN_POS
);
254 MPFR_SAVE_EXPO_UPDATE_FLAGS (*expo
, MPFR_FLAGS_INEXACT
255 | MPFR_FLAGS_UNDERFLOW
);
262 /* Note: we can probably use a low precision for this test. */
263 mpfr_log (t
, absx
, MPFR_IS_NEG (y
) ? MPFR_RNDU
: MPFR_RNDD
);
264 mpfr_mul (t
, y
, t
, MPFR_RNDD
); /* y * ln|x| */
265 MPFR_BLOCK (flags2
, mpfr_exp (t
, t
, MPFR_RNDD
));
266 /* t = lower bound on exp(y * ln|x|) */
267 if (MPFR_OVERFLOW (flags2
))
269 /* We have computed a lower bound on |x|^y, and it
270 overflowed. Therefore we have a real overflow
272 inexact
= mpfr_overflow (z
, rnd_mode
, MPFR_SIGN_POS
);
274 MPFR_SAVE_EXPO_UPDATE_FLAGS (*expo
, MPFR_FLAGS_INEXACT
275 | MPFR_FLAGS_OVERFLOW
);
281 Ntmin
= sizeof(mpfr_exp_t
) * CHAR_BIT
;
285 mpfr_set_prec (t
, Nt
);
288 mpfr_init2 (k
, Ntmin
);
289 mpfr_log2 (k
, absx
, MPFR_RNDN
);
290 mpfr_mul (k
, y
, k
, MPFR_RNDN
);
293 /* |y| < 2^Ntmin, therefore |k| < 2^Nt. */
296 if (MPFR_LIKELY (MPFR_CAN_ROUND (t
, Nt
- err
, Nz
, rnd_mode
)))
298 inexact
= mpfr_set (z
, t
, rnd_mode
);
302 /* check exact power, except when y is an integer (since the
303 exact cases for y integer have already been filtered out) */
304 if (check_exact_case
== 0 && ! y_is_integer
)
306 if (mpfr_pow_is_exact (z
, absx
, y
, rnd_mode
, &inexact
))
308 check_exact_case
= 1;
311 /* reactualisation of the precision */
312 MPFR_ZIV_NEXT (ziv_loop
, Nt
);
313 mpfr_set_prec (t
, Nt
);
315 mpfr_set_prec (u
, Nt
);
317 MPFR_ZIV_FREE (ziv_loop
);
324 /* The rounded result in an unbounded exponent range is z * 2^k. As
325 * MPFR chooses underflow after rounding, the mpfr_mul_2si below will
326 * correctly detect underflows and overflows. However, in rounding to
327 * nearest, if z * 2^k = 2^(emin - 2), then the double rounding may
328 * affect the result. We need to cope with that before overwriting z.
329 * This can occur only if k < 0 (this test is necessary to avoid a
330 * potential integer overflow).
331 * If inexact >= 0, then the real result is <= 2^(emin - 2), so that
332 * o(2^(emin - 2)) = +0 is correct. If inexact < 0, then the real
333 * result is > 2^(emin - 2) and we need to round to 2^(emin - 1).
335 MPFR_ASSERTN (MPFR_EXP_MAX
<= LONG_MAX
);
336 lk
= mpfr_get_si (k
, MPFR_RNDN
);
337 /* Due to early overflow detection, |k| should not be much larger than
338 * MPFR_EMAX_MAX, and as MPFR_EMAX_MAX <= MPFR_EXP_MAX/2 <= LONG_MAX/2,
339 * an overflow should not be possible in mpfr_get_si (and lk is exact).
340 * And one even has the following assertion. TODO: complete proof.
342 MPFR_ASSERTD (lk
> LONG_MIN
&& lk
< LONG_MAX
);
343 /* Note: even in case of overflow (lk inexact), the code is correct.
344 * Indeed, for the 3 occurrences of lk:
345 * - The test lk < 0 is correct as sign(lk) = sign(k).
346 * - In the test MPFR_GET_EXP (z) == __gmpfr_emin - 1 - lk,
347 * if lk is inexact, then lk = LONG_MIN <= MPFR_EXP_MIN
348 * (the minimum value of the mpfr_exp_t type), and
349 * __gmpfr_emin - 1 - lk >= MPFR_EMIN_MIN - 1 - 2 * MPFR_EMIN_MIN
350 * >= - MPFR_EMIN_MIN - 1 = MPFR_EMAX_MAX - 1. However, from the
351 * choice of k, z has been chosen to be around 1, so that the
352 * result of the test is false, as if lk were exact.
353 * - In the mpfr_mul_2si (z, z, lk, rnd_mode), if lk is inexact,
354 * then |lk| >= LONG_MAX >= MPFR_EXP_MAX, and as z is around 1,
355 * mpfr_mul_2si underflows or overflows in the same way as if
357 * TODO: give a bound on |t|, then on |EXP(z)|.
359 if (rnd_mode
== MPFR_RNDN
&& inexact
< 0 && lk
< 0 &&
360 MPFR_GET_EXP (z
) == __gmpfr_emin
- 1 - lk
&& mpfr_powerof2_raw (z
))
362 /* Rounding to nearest, real result > z * 2^k = 2^(emin - 2),
363 * underflow case: as the minimum precision is > 1, we will
364 * obtain the correct result and exceptions by replacing z by
367 MPFR_ASSERTN (MPFR_PREC_MIN
> 1);
371 inex2
= mpfr_mul_2si (z
, z
, lk
, rnd_mode
);
372 if (inex2
) /* underflow or overflow */
376 MPFR_SAVE_EXPO_UPDATE_FLAGS (*expo
, __gmpfr_flags
);
378 mpfr_clears (u
, k
, (mpfr_ptr
) 0);
382 /* update the sign of the result if x was negative */
392 /* The computation of z = pow(x,y) is done by
393 z = exp(y * log(x)) = x^y
394 For the special cases, see Section F.9.4.4 of the C standard:
395 _ pow(±0, y) = ±inf for y an odd integer < 0.
396 _ pow(±0, y) = +inf for y < 0 and not an odd integer.
397 _ pow(±0, y) = ±0 for y an odd integer > 0.
398 _ pow(±0, y) = +0 for y > 0 and not an odd integer.
399 _ pow(-1, ±inf) = 1.
400 _ pow(+1, y) = 1 for any y, even a NaN.
401 _ pow(x, ±0) = 1 for any x, even a NaN.
402 _ pow(x, y) = NaN for finite x < 0 and finite non-integer y.
403 _ pow(x, -inf) = +inf for |x| < 1.
404 _ pow(x, -inf) = +0 for |x| > 1.
405 _ pow(x, +inf) = +0 for |x| < 1.
406 _ pow(x, +inf) = +inf for |x| > 1.
407 _ pow(-inf, y) = -0 for y an odd integer < 0.
408 _ pow(-inf, y) = +0 for y < 0 and not an odd integer.
409 _ pow(-inf, y) = -inf for y an odd integer > 0.
410 _ pow(-inf, y) = +inf for y > 0 and not an odd integer.
411 _ pow(+inf, y) = +0 for y < 0.
412 _ pow(+inf, y) = +inf for y > 0. */
414 mpfr_pow (mpfr_ptr z
, mpfr_srcptr x
, mpfr_srcptr y
, mpfr_rnd_t rnd_mode
)
419 MPFR_SAVE_EXPO_DECL (expo
);
422 (("x[%Pu]=%.*Rg y[%Pu]=%.*Rg rnd=%d",
423 mpfr_get_prec (x
), mpfr_log_prec
, x
,
424 mpfr_get_prec (y
), mpfr_log_prec
, y
, rnd_mode
),
425 ("z[%Pu]=%.*Rg inexact=%d",
426 mpfr_get_prec (z
), mpfr_log_prec
, z
, inexact
));
428 if (MPFR_ARE_SINGULAR (x
, y
))
430 /* pow(x, 0) returns 1 for any x, even a NaN. */
431 if (MPFR_UNLIKELY (MPFR_IS_ZERO (y
)))
432 return mpfr_set_ui (z
, 1, rnd_mode
);
433 else if (MPFR_IS_NAN (x
))
438 else if (MPFR_IS_NAN (y
))
440 /* pow(+1, NaN) returns 1. */
441 if (mpfr_cmp_ui (x
, 1) == 0)
442 return mpfr_set_ui (z
, 1, rnd_mode
);
446 else if (MPFR_IS_INF (y
))
460 cmp
= mpfr_cmpabs (x
, __gmpfr_one
) * MPFR_INT_SIGN (y
);
477 return mpfr_set_ui (z
, 1, rnd_mode
);
481 else if (MPFR_IS_INF (x
))
484 /* Determine the sign now, in case y and z are the same object */
485 negative
= MPFR_IS_NEG (x
) && is_odd (y
);
499 MPFR_ASSERTD (MPFR_IS_ZERO (x
));
500 /* Determine the sign now, in case y and z are the same object */
501 negative
= MPFR_IS_NEG(x
) && is_odd (y
);
504 MPFR_ASSERTD (! MPFR_IS_INF (y
));
518 /* x^y for x < 0 and y not an integer is not defined */
519 y_is_integer
= mpfr_integer_p (y
);
520 if (MPFR_IS_NEG (x
) && ! y_is_integer
)
526 /* now the result cannot be NaN:
528 (2) or x < 0 and y is an integer */
530 cmp_x_1
= mpfr_cmpabs (x
, __gmpfr_one
);
532 return mpfr_set_si (z
, MPFR_IS_NEG (x
) && is_odd (y
) ? -1 : 1, rnd_mode
);
536 (2) or x < 0 and y is an integer
537 and in addition |x| <> 1.
540 /* detect overflow: an overflow is possible if
541 (a) |x| > 1 and y > 0
542 (b) |x| < 1 and y < 0.
543 FIXME: this assumes 1 is always representable.
545 FIXME2: maybe we can test overflow and underflow simultaneously.
546 The idea is the following: first compute an approximation to
547 y * log2|x|, using rounding to nearest. If |x| is not too near from 1,
548 this approximation should be accurate enough, and in most cases enable
549 one to prove that there is no underflow nor overflow.
550 Otherwise, it should enable one to check only underflow or overflow,
551 instead of both cases as in the present case.
553 if (cmp_x_1
* MPFR_SIGN (y
) > 0)
556 int negative
, overflow
;
558 MPFR_SAVE_EXPO_MARK (expo
);
560 /* we want a lower bound on y*log2|x|:
561 (i) if x > 0, it suffices to round log2(x) toward zero, and
562 to round y*o(log2(x)) toward zero too;
563 (ii) if x < 0, we first compute t = o(-x), with rounding toward 1,
564 and then follow as in case (1). */
565 if (MPFR_SIGN (x
) > 0)
566 mpfr_log2 (t
, x
, MPFR_RNDZ
);
569 mpfr_neg (t
, x
, (cmp_x_1
> 0) ? MPFR_RNDZ
: MPFR_RNDU
);
570 mpfr_log2 (t
, t
, MPFR_RNDZ
);
572 mpfr_mul (t
, t
, y
, MPFR_RNDZ
);
573 overflow
= mpfr_cmp_si (t
, __gmpfr_emax
) > 0;
575 MPFR_SAVE_EXPO_FREE (expo
);
578 MPFR_LOG_MSG (("early overflow detection\n", 0));
579 negative
= MPFR_SIGN(x
) < 0 && is_odd (y
);
580 return mpfr_overflow (z
, rnd_mode
, negative
? -1 : 1);
584 /* Basic underflow checking. One has:
585 * - if y > 0, |x^y| < 2^(EXP(x) * y);
586 * - if y < 0, |x^y| <= 2^((EXP(x) - 1) * y);
587 * so that one can compute a value ebound such that |x^y| < 2^ebound.
588 * If we have ebound <= emin - 2 (emin - 1 in directed rounding modes),
589 * then there is an underflow and we can decide the return value.
591 if (MPFR_IS_NEG (y
) ? (MPFR_GET_EXP (x
) > 1) : (MPFR_GET_EXP (x
) < 0))
597 /* We must restore the flags. */
598 MPFR_SAVE_EXPO_MARK (expo
);
599 mpfr_init2 (tmp
, sizeof (mpfr_exp_t
) * CHAR_BIT
);
600 inex2
= mpfr_set_exp_t (tmp
, MPFR_GET_EXP (x
), MPFR_RNDN
);
601 MPFR_ASSERTN (inex2
== 0);
604 inex2
= mpfr_sub_ui (tmp
, tmp
, 1, MPFR_RNDN
);
605 MPFR_ASSERTN (inex2
== 0);
607 mpfr_mul (tmp
, tmp
, y
, MPFR_RNDU
);
609 mpfr_nextabove (tmp
);
610 /* tmp doesn't necessarily fit in ebound, but that doesn't matter
611 since we get the minimum value in such a case. */
612 ebound
= mpfr_get_exp_t (tmp
, MPFR_RNDU
);
614 MPFR_SAVE_EXPO_FREE (expo
);
615 if (MPFR_UNLIKELY (ebound
<=
616 __gmpfr_emin
- (rnd_mode
== MPFR_RNDN
? 2 : 1)))
618 /* warning: mpfr_underflow rounds away from 0 for MPFR_RNDN */
619 MPFR_LOG_MSG (("early underflow detection\n", 0));
620 return mpfr_underflow (z
,
621 rnd_mode
== MPFR_RNDN
? MPFR_RNDZ
: rnd_mode
,
622 MPFR_SIGN (x
) < 0 && is_odd (y
) ? -1 : 1);
626 /* If y is an integer, we can use mpfr_pow_z (based on multiplications),
627 but if y is very large (I'm not sure about the best threshold -- VL),
628 we shouldn't use it, as it can be very slow and take a lot of memory
629 (and even crash or make other programs crash, as several hundred of
630 MBs may be necessary). Note that in such a case, either x = +/-2^b
631 (this case is handled below) or x^y cannot be represented exactly in
632 any precision supported by MPFR (the general case uses this property).
634 if (y_is_integer
&& (MPFR_GET_EXP (y
) <= 256))
638 MPFR_LOG_MSG (("special code for y not too large integer\n", 0));
640 mpfr_get_z (zi
, y
, MPFR_RNDN
);
641 inexact
= mpfr_pow_z (z
, x
, zi
, rnd_mode
);
646 /* Special case (+/-2^b)^Y which could be exact. If x is negative, then
647 necessarily y is a large integer. */
649 mpfr_exp_t b
= MPFR_GET_EXP (x
) - 1;
651 MPFR_ASSERTN (b
>= LONG_MIN
&& b
<= LONG_MAX
); /* FIXME... */
652 if (mpfr_cmp_si_2exp (x
, MPFR_SIGN(x
), b
) == 0)
655 int sgnx
= MPFR_SIGN (x
);
657 MPFR_LOG_MSG (("special case (+/-2^b)^Y\n", 0));
658 /* now x = +/-2^b, so x^y = (+/-1)^y*2^(b*y) is exact whenever b*y is
660 MPFR_SAVE_EXPO_MARK (expo
);
661 mpfr_init2 (tmp
, MPFR_PREC (y
) + sizeof (long) * CHAR_BIT
);
662 inexact
= mpfr_mul_si (tmp
, y
, b
, MPFR_RNDN
); /* exact */
663 MPFR_ASSERTN (inexact
== 0);
664 /* Note: as the exponent range has been extended, an overflow is not
665 possible (due to basic overflow and underflow checking above, as
666 the result is ~ 2^tmp), and an underflow is not possible either
667 because b is an integer (thus either 0 or >= 1). */
669 inexact
= mpfr_exp2 (z
, tmp
, rnd_mode
);
671 if (sgnx
< 0 && is_odd (y
))
673 mpfr_neg (z
, z
, rnd_mode
);
676 /* Without the following, the overflows3 test in tpow.c fails. */
677 MPFR_SAVE_EXPO_UPDATE_FLAGS (expo
, __gmpfr_flags
);
678 MPFR_SAVE_EXPO_FREE (expo
);
679 return mpfr_check_range (z
, inexact
, rnd_mode
);
683 MPFR_SAVE_EXPO_MARK (expo
);
685 /* Case where |y * log(x)| is very small. Warning: x can be negative, in
686 that case y is a large integer. */
691 /* We need an upper bound on the exponent of y * log(x). */
694 mpfr_log (t
, x
, cmp_x_1
< 0 ? MPFR_RNDD
: MPFR_RNDU
); /* away from 0 */
697 /* if x < -1, round to +Inf, else round to zero */
698 mpfr_neg (t
, x
, (mpfr_cmp_si (x
, -1) < 0) ? MPFR_RNDU
: MPFR_RNDD
);
699 mpfr_log (t
, t
, (mpfr_cmp_ui (t
, 1) < 0) ? MPFR_RNDD
: MPFR_RNDU
);
701 MPFR_ASSERTN (MPFR_IS_PURE_FP (t
));
702 err
= MPFR_GET_EXP (y
) + MPFR_GET_EXP (t
);
705 MPFR_SMALL_INPUT_AFTER_SAVE_EXPO (z
, __gmpfr_one
, - err
, 0,
706 (MPFR_SIGN (y
) > 0) ^ (cmp_x_1
< 0),
711 inexact
= mpfr_pow_general (z
, x
, y
, rnd_mode
, y_is_integer
, &expo
);
713 MPFR_SAVE_EXPO_FREE (expo
);
714 return mpfr_check_range (z
, inexact
, rnd_mode
);