summaryrefslogtreecommitdiff
path: root/src/pow_z.c
diff options
context:
space:
mode:
authorzimmerma <zimmerma@211d60ee-9f03-0410-a15a-8952a2c7a4e4>2010-05-15 08:05:57 +0000
committerzimmerma <zimmerma@211d60ee-9f03-0410-a15a-8952a2c7a4e4>2010-05-15 08:05:57 +0000
commit6da61c7fe250b2a1770cd536653510a666e3af2e (patch)
tree45b58e444d88b547a405695e948586817f170ecd /src/pow_z.c
parent4f0bb20965e51cde6383d69dc8abc9a84b6d18ae (diff)
downloadmpc-6da61c7fe250b2a1770cd536653510a666e3af2e.tar.gz
[src/pow_z.c] calls mpc_pow_ui or mpc_pow_si when the exponent fits
git-svn-id: svn://scm.gforge.inria.fr/svn/mpc/trunk@767 211d60ee-9f03-0410-a15a-8952a2c7a4e4
Diffstat (limited to 'src/pow_z.c')
-rw-r--r--src/pow_z.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/pow_z.c b/src/pow_z.c
index 9ce20d1..9b769fe 100644
--- a/src/pow_z.c
+++ b/src/pow_z.c
@@ -1,6 +1,6 @@
/* mpc_pow_z -- Raise a complex number to an integer power.
-Copyright (C) 2009 Paul Zimmermann
+Copyright (C) 2009, 2010 Paul Zimmermann
This file is part of the MPC Library.
@@ -28,6 +28,13 @@ mpc_pow_z (mpc_ptr z, mpc_srcptr x, mpz_srcptr y, mpc_rnd_t rnd)
int inex;
size_t n = mpz_sizeinbase (y, 2);
+ /* if y fits in an unsigned long or long, call the corresponding functions,
+ which are supposed to be more efficient */
+ if (mpz_fits_ulong_p (y))
+ return mpc_pow_ui (z, x, mpz_get_ui (y), rnd);
+ else if (mpz_fits_slong_p (y))
+ return mpc_pow_si (z, x, mpz_get_si (y), rnd);
+
mpc_init3 (yy, (n < MPFR_PREC_MIN) ? MPFR_PREC_MIN : n, MPFR_PREC_MIN);
mpc_set_z (yy, y, MPC_RNDNN); /* exact */
inex = mpc_pow (z, x, yy, rnd);