diff options
author | thevenyp <thevenyp@211d60ee-9f03-0410-a15a-8952a2c7a4e4> | 2009-07-29 16:41:45 +0000 |
---|---|---|
committer | thevenyp <thevenyp@211d60ee-9f03-0410-a15a-8952a2c7a4e4> | 2009-07-29 16:41:45 +0000 |
commit | acc9fd2dc1cff899745e08217deec27dd5bb741a (patch) | |
tree | 648c9c98689b495559ac5b0c3600fc946f5e30a3 | |
parent | 310ebdd32c1d7679c3aa560c61b4a6dafd67aae0 (diff) | |
download | mpc-acc9fd2dc1cff899745e08217deec27dd5bb741a.tar.gz |
src/pow.c: set sign of the zero imaginary part as determined in the proof in algorithms.tex revision r628.
tests/pow.dat: Zero signs in test values according to the proof in algorithms.tex revision r628.
git-svn-id: svn://scm.gforge.inria.fr/svn/mpc/trunk@629 211d60ee-9f03-0410-a15a-8952a2c7a4e4
-rw-r--r-- | src/pow.c | 165 | ||||
-rw-r--r-- | tests/pow.dat | 342 |
2 files changed, 310 insertions, 197 deletions
@@ -401,20 +401,6 @@ mpc_pow (mpc_ptr z, mpc_srcptr x, mpc_srcptr y, mpc_rnd_t rnd) mp_prec_t p, q, pr, pi, maxprec; long Q; - if (mpfr_nan_p (MPC_RE(x)) || mpfr_nan_p (MPC_IM(x)) || - mpfr_nan_p (MPC_RE(y)) || mpfr_nan_p (MPC_IM(y)) || - mpfr_inf_p (MPC_RE(x)) || mpfr_inf_p (MPC_IM(x)) || - mpfr_inf_p (MPC_RE(y)) || mpfr_inf_p (MPC_IM(y))) - { - /* special values: exp(y*log(x)) */ - mpc_init2 (u, 2); - mpc_log (u, x, MPC_RNDNN); - mpc_mul (u, u, y, MPC_RNDNN); - ret = mpc_exp (z, u, rnd); - mpc_clear (u); - goto end; - } - x_real = mpfr_zero_p (MPC_IM(x)); y_real = mpfr_zero_p (MPC_IM(y)); @@ -426,27 +412,50 @@ mpc_pow (mpc_ptr z, mpc_srcptr x, mpc_srcptr y, mpc_rnd_t rnd) mpfr_set_nan (MPC_IM(z)); return 0; } - else /* x^0 = 1 +/- i*0 even for x=NaN */ + else /* x^0 = 1 +/- i*0 even for x=NaN see algorithms.tex for the + sign of zero */ { - int sa, sb, sc, sd; - mpc_init2 (u, 2); - mpc_log (u, x, MPC_RNDNN); - /* sa = sign(Re(log(x))), sb = sign(Im(log(x))) */ - sa = mpfr_signbit (MPC_RE(u)) ? -2 : 2; - if (mpfr_cmp_ui (MPC_RE(x), 1) == 0) - sa = 1; - sb = mpfr_signbit (MPC_IM(u)) ? -2 : 2; - /* sc = sign(Re(y)), sd = sign(Im(y)) */ - sc = mpfr_signbit (MPC_RE(y)) ? -2 : 2; - sd = mpfr_signbit (MPC_IM(y)) ? -2 : 2; + mpfr_t n; + int inex, cx1; + /* warning: mpc_set_ui_ui does not set Im(z) to -0 if Im(rnd)=RNDD */ ret = mpc_set_ui_ui (z, 1, 0, rnd); - if (sa * sd + sb * sc < 0) - mpfr_neg (MPC_IM(z), MPC_IM(z), MPC_RND_IM(rnd)); - mpc_clear (u); + + /* cx1 < 0 if |x| < 1 + cx1 = 0 if |x| = 1 + cx1 > 0 if |x| > 1 + */ + mpfr_init (n); + inex = mpc_norm (n, x, GMP_RNDN); + cx1 = mpfr_cmp_ui (n, 1); + if (cx1 == 0 && inex != 0) + cx1 = -inex; + + if (MPC_RND_IM (rnd) == GMP_RNDD + || ((cx1 < 0 && mpfr_signbit (MPC_IM (y)) == 0) + ||(cx1 == 0 + && mpfr_signbit (MPC_IM(x)) != mpfr_signbit (MPC_RE(y))) + ||(cx1 > 0 && mpfr_signbit (MPC_IM (y))))) + mpc_conj (z, z, MPC_RNDNN); + + mpfr_clear (n); return ret; } } + if (mpfr_nan_p (MPC_RE(x)) || mpfr_nan_p (MPC_IM(x)) || + mpfr_nan_p (MPC_RE(y)) || mpfr_nan_p (MPC_IM(y)) || + mpfr_inf_p (MPC_RE(x)) || mpfr_inf_p (MPC_IM(x)) || + mpfr_inf_p (MPC_RE(y)) || mpfr_inf_p (MPC_IM(y))) + { + /* special values: exp(y*log(x)) */ + mpc_init2 (u, 2); + mpc_log (u, x, MPC_RNDNN); + mpc_mul (u, u, y, MPC_RNDNN); + ret = mpc_exp (z, u, rnd); + mpc_clear (u); + goto end; + } + if (x_real) /* case x real */ { if (mpfr_zero_p (MPC_RE(x))) /* x is zero */ @@ -463,9 +472,21 @@ mpc_pow (mpc_ptr z, mpc_srcptr x, mpc_srcptr y, mpc_rnd_t rnd) /* Special case 1^y = 1 */ if (mpfr_cmp_ui (MPC_RE(x), 1) == 0) { + int s1, s2; + s1 = mpfr_signbit (MPC_RE (y)); + s2 = mpfr_signbit (MPC_IM (x)); + ret = mpc_set_ui (z, +1, rnd); - if (mpfr_signbit (MPC_IM (y)) - && mpfr_signbit (MPC_RE (y)) != mpfr_signbit (MPC_IM (x))) + /* the sign of the zero imaginary part is known in some cases (see + algorithm.tex). In such cases we have + (x +s*0i)^(y+/-0i) = x^y + s*sign(y)*0i + where s = +/-1. We extend here this rule to fix the sign of the + zero part. + + Note that the sign must also be set explicitly when rnd=RNDD + because mpfr_set_ui(z_i, 0, rnd) always sets z_i to +0. + */ + if (MPC_RND_IM (rnd) == GMP_RNDD || s1 != s2) mpc_conj (z, z, MPC_RNDNN); goto end; } @@ -477,32 +498,21 @@ mpc_pow (mpc_ptr z, mpc_srcptr x, mpc_srcptr y, mpc_rnd_t rnd) mpfr_cmp_ui (MPC_RE(x), 0) >= 0)) { int s1, s2; - /* if x = x + eps*i and y = y + delta*i, then for x > 0: - log(x) ~ log(x) + eps/x*i thus - y*log(x) ~ y*log(x) + [y/x*eps + log(x)*delta]*i - For x < 0 and y integer: - log(x) ~ log|x| + sign(eps)*[Pi - |eps/x|]*i thus - y*log(x) ~ y*log|x| + [sign(eps)*y*Pi-y/|x|*eps+log|x|*delta]*i - thus if y is even we get the same term as for x > 0 for the - imaginary part, otherwise its opposite. */ - s1 = mpfr_signbit (MPC_RE(x)) ? 1 : -1; /* sign of x */ - s1 *= mpfr_signbit (MPC_RE(y)) ? 1 : -1; /* sign of y/x for x > 0 - or -y/|x| for x < 0 */ - s1 *= MPFR_SIGN(MPC_IM(x)); /* sign of -y*eps */ - s2 = mpfr_get_exp (MPC_RE(x)) >= 1 ? 1 : -1; /* sign of log|x| */ - s2 *= MPFR_SIGN(MPC_IM(y)); /* sign of log|x|*delta */ - if (s1 != s2) - { - if (MPC_RND_IM(rnd) == GMP_RNDD) - s1 = -1; - else - s1 = 1; /* take +0 as arbitrary sign */ - } - else if (MPFR_SIGN(MPC_RE(x)) < 0 && is_odd (MPC_RE(y), 0)) - s1 = -s1; + s1 = mpfr_signbit (MPC_RE (y)); + s2 = mpfr_signbit (MPC_IM (x)); + ret = mpfr_pow (MPC_RE(z), MPC_RE(x), MPC_RE(y), MPC_RND_RE(rnd)); ret = MPC_INEX(ret, mpfr_set_ui (MPC_IM(z), 0, MPC_RND_IM(rnd))); - if (s1 == -1) + + /* the sign of the zero imaginary part is known in some cases + (see algorithm.tex). In such cases we have (x +s*0i)^(y+/-0i) + = x^y + s*sign(y)*0i where s = +/-1. + We extend here this rule to fix the sign of the zero part. + + Note that the sign must also be set explicitly when rnd=RNDD + because mpfr_set_ui(z_i, 0, rnd) always sets z_i to +0. + */ + if (MPC_RND_IM(rnd) == GMP_RNDD || s1 != s2) mpfr_neg (MPC_IM(z), MPC_IM(z), MPC_RND_IM(rnd)); goto end; } @@ -536,12 +546,12 @@ mpc_pow (mpc_ptr z, mpc_srcptr x, mpc_srcptr y, mpc_rnd_t rnd) else /* (t+/-t*I)^(2n) is imaginary for n odd and real for n even */ if (mpfr_cmpabs (MPC_RE(x), MPC_IM(x)) == 0 && y_real && mpfr_integer_p (MPC_RE(y)) && is_odd (MPC_RE(y), 0) == 0) - { - if (is_odd (MPC_RE(y), -1)) /* y/2 is odd */ - z_imag = 1; - else - z_real = 1; - } + { + if (is_odd (MPC_RE(y), -1)) /* y/2 is odd */ + z_imag = 1; + else + z_real = 1; + } /* first bound |Re(y log(x))|, |Im(y log(x)| < 2^q */ mpc_init2 (t, 64); @@ -638,12 +648,37 @@ mpc_pow (mpc_ptr z, mpc_srcptr x, mpc_srcptr y, mpc_rnd_t rnd) if (z_real) { - int s = mpfr_signbit (MPC_IM (y)) - && mpfr_signbit (MPC_RE (y)) != mpfr_signbit (MPC_IM (x)); + /* When the result is real (see algorithm.tex for details), + Im(x^y) = + + sign(imag(y))*0i, if |x| > 1 + + sign(imag(x))*sign(real(y))*0i, if |x| = 1 + - sign(imag(y))*0i, if |x| < 1 + */ + mpfr_t n; + int inex, cx1; + ret = mpfr_set (MPC_RE(z), MPC_RE(u), MPC_RND_RE(rnd)); - ret = MPC_INEX(ret, mpfr_set_ui (MPC_IM(z), 0, MPC_RND_IM(rnd))); - if (s) + /* warning: mpfr_set_ui does not set Im(z) to -0 if Im(rnd) = RNDD */ + ret = MPC_INEX (ret, mpfr_set_ui (MPC_IM (z), 0, MPC_RND_IM (rnd))); + + /* cx1 < 0 if |x| < 1 + cx1 = 0 if |x| = 1 + cx1 > 0 if |x| > 1 + */ + mpfr_init (n); + inex = mpc_norm (n, x, GMP_RNDN); + cx1 = mpfr_cmp_ui (n, 1); + if (cx1 == 0 && inex != 0) + cx1 = -inex; + + if (MPC_RND_IM (rnd) == GMP_RNDD + || ((cx1 < 0 && mpfr_signbit (MPC_IM (y)) == 0) + ||(cx1 == 0 + && mpfr_signbit (MPC_IM (x)) != mpfr_signbit (MPC_RE (y))) + ||(cx1 > 0 && mpfr_signbit (MPC_IM (y))))) mpc_conj (z, z, MPC_RNDNN); + + mpfr_clear (n); } else if (z_imag) { diff --git a/tests/pow.dat b/tests/pow.dat index 281853a..cafe264 100644 --- a/tests/pow.dat +++ b/tests/pow.dat @@ -1,6 +1,6 @@ # Data file for mpc_pow. # -# Copyright (C) 2009 Paul Zimmermann +# Copyright (C) 2009 Paul Zimmermann, Philippe Theveny # # This file is part of the MPC Library. # @@ -21,7 +21,7 @@ # # For explanations on the file format, see add.dat. -0 0 53 nan 53 nan 53 nan 53 +0 53 +0 53 +0 N N +0 0 53 +1 53 0 53 nan 53 +0 53 +0 53 +0 N N 0 0 53 nan 53 nan 53 nan 53 +0 53 +0 53 +1 N N 0 0 53 nan 53 nan 53 nan 53 +0 53 +0 53 -1 N N 0 0 53 nan 53 nan 53 nan 53 +0 53 +1 53 +0 N N @@ -32,7 +32,6 @@ 0 0 53 nan 53 nan 53 nan 53 +0 53 +inf 53 +1 N N 0 0 53 nan 53 nan 53 nan 53 +0 53 +inf 53 -1 N N 0 0 53 nan 53 nan 53 nan 53 +0 53 -inf 53 +0 N N -0 0 53 nan 53 nan 53 +inf 53 +0 53 +0 53 +0 N N 0 0 53 nan 53 nan 53 +inf 53 +0 53 +0 53 +1 N N 0 0 53 nan 53 nan 53 +inf 53 +0 53 +0 53 -1 N N 0 0 53 inf 53 nan 53 +inf 53 +0 53 +1 53 +0 N N @@ -50,7 +49,6 @@ 0 0 53 0 53 0 53 +inf 53 +0 53 -inf 53 +0 N N 0 0 53 0 53 0 53 +inf 53 +0 53 -inf 53 +1 N N 0 0 53 0 53 0 53 +inf 53 +0 53 -inf 53 -1 N N -0 0 53 nan 53 nan 53 +inf 53 +1 53 +0 53 +0 N N 0 0 53 nan 53 nan 53 +inf 53 +1 53 +0 53 +1 N N 0 0 53 nan 53 nan 53 +inf 53 +1 53 +0 53 -1 N N 0 0 53 +inf 53 nan 53 +inf 53 +1 53 +1 53 +0 N N @@ -68,7 +66,6 @@ 0 0 53 0 53 0 53 +inf 53 +1 53 -inf 53 +0 N N 0 0 53 0 53 0 53 +inf 53 +1 53 -inf 53 +1 N N 0 0 53 0 53 0 53 +inf 53 +1 53 -inf 53 -1 N N -0 0 53 nan 53 nan 53 +inf 53 -1 53 +0 53 +0 N N 0 0 53 nan 53 nan 53 +inf 53 -1 53 +0 53 +1 N N 0 0 53 nan 53 nan 53 +inf 53 -1 53 +0 53 -1 N N 0 0 53 +inf 53 nan 53 +inf 53 -1 53 +1 53 +0 N N @@ -86,7 +83,6 @@ 0 0 53 0 53 0 53 +inf 53 -1 53 -inf 53 +0 N N 0 0 53 0 53 0 53 +inf 53 -1 53 -inf 53 +1 N N 0 0 53 0 53 0 53 +inf 53 -1 53 -inf 53 -1 N N -0 0 53 nan 53 nan 53 -inf 53 +0 53 +0 53 +0 N N 0 0 53 nan 53 nan 53 -inf 53 +0 53 +0 53 +1 N N 0 0 53 nan 53 nan 53 -inf 53 +0 53 +0 53 -1 N N 0 0 53 +inf 53 nan 53 -inf 53 +0 53 +1 53 +0 N N @@ -104,7 +100,6 @@ 0 0 53 0 53 0 53 -inf 53 +0 53 -inf 53 +0 N N 0 0 53 0 53 0 53 -inf 53 +0 53 -inf 53 +1 N N 0 0 53 0 53 0 53 -inf 53 +0 53 -inf 53 -1 N N -0 0 53 nan 53 nan 53 -inf 53 +1 53 +0 53 +0 N N 0 0 53 nan 53 nan 53 -inf 53 +1 53 +0 53 +1 N N 0 0 53 nan 53 nan 53 -inf 53 +1 53 +0 53 -1 N N 0 0 53 +inf 53 nan 53 -inf 53 +1 53 +1 53 +0 N N @@ -122,7 +117,6 @@ 0 0 53 0 53 0 53 -inf 53 +1 53 -inf 53 +0 N N 0 0 53 0 53 0 53 -inf 53 +1 53 -inf 53 +1 N N 0 0 53 0 53 0 53 -inf 53 +1 53 -inf 53 -1 N N -0 0 53 nan 53 nan 53 -inf 53 -1 53 +0 53 +0 N N 0 0 53 nan 53 nan 53 -inf 53 -1 53 +0 53 +1 N N 0 0 53 nan 53 nan 53 -inf 53 -1 53 +0 53 -1 N N 0 0 53 +inf 53 nan 53 -inf 53 -1 53 +1 53 +0 N N @@ -141,7 +135,6 @@ 0 0 53 0 53 0 53 -inf 53 -1 53 -inf 53 +1 N N 0 0 53 0 53 0 53 -inf 53 -1 53 -inf 53 -1 N N -0 0 53 nan 53 nan 53 +0 53 +0 53 +0 53 +0 N N 0 0 53 nan 53 nan 53 +0 53 +0 53 +0 53 +1 N N 0 0 53 nan 53 nan 53 +0 53 +0 53 +0 53 -1 N N 0 0 53 0 53 0 53 +0 53 +0 53 +1 53 +0 N N @@ -160,136 +153,221 @@ 0 0 53 +inf 53 nan 53 +0 53 +0 53 -inf 53 +1 N N 0 0 53 +inf 53 nan 53 +0 53 +0 53 -inf 53 -1 N N +# zeros with determined sign, see algorithms.tex +# x^0 = +1 +sign(Im(x))*sign(Re(y))*0i when |x|=1 0 0 53 +1 53 +0 53 +0 53 +1 53 +0 53 +0 N N -# zero cases from algorithms.tex -# (1+0*i)^(-0+0*i) -> 1-0*i -0 0 53 +1 53 -0 53 +1 53 +0 53 -0 53 +0 N N -# (1-0*i)^(+0+0*i) -> 1-0*i -0 0 53 +1 53 -0 53 +1 53 -0 53 +0 53 +0 N N -# (1-0*i)^(-0-0*i) -> 1+0*i -0 0 53 +1 53 +0 53 +1 53 -0 53 -0 53 -0 N N +0 0 53 +1 53 -0 53 +0 53 +1 53 +0 53 +0 N D #round toward -oo +0 0 53 +1 53 +0 53 -0 53 +1 53 +0 53 +0 N N +0 0 53 +1 53 +0 53 -1 53 +0 53 +0 53 +0 N N +0 0 53 +1 53 -0 53 -1 53 -0 53 +0 53 +0 N N +0 0 53 +1 53 -0 53 -0 53 -1 53 +0 53 +0 N N +0 0 53 +1 53 -0 53 +0 53 -1 53 +0 53 +0 N N -# (x-0i)^(y-0i) = +a +0i when 0 < x < 1 and y <= -0 -0 0 53 4 53 +0 53 +0.5 53 -0 53 -2 53 -0 N N -0 0 53 1 53 +0 53 +0.5 53 -0 53 -0 53 -0 N N -# x^(-0-0i) = +1 +0i when |x| < 1 and Im(x) < 0 -0 0 53 1 53 +0 53 -0.5 53 -0.5 53 -0 53 -0 N N -0 0 53 1 53 +0 53 -0 53 -0.5 53 -0 53 -0 N N -0 0 53 1 53 +0 53 +0 53 -0.5 53 -0 53 -0 N N -0 0 53 1 53 +0 53 +0.5 53 -0.5 53 -0 53 -0 N N -# x^(+0-0i) = +1 +0i when |x| < 1 and Im(x) > 0 -0 0 53 1 53 +0 53 +0.5 53 +0.5 53 +0 53 -0 N N -0 0 53 1 53 +0 53 +0 53 +0.5 53 +0 53 -0 N N -0 0 53 1 53 +0 53 -0 53 +0.5 53 +0 53 -0 N N -0 0 53 1 53 +0 53 -0.5 53 +0.5 53 +0 53 -0 N N -# (x+0i)^(y-0i) = +a +0i when 0 < x < 1 and y >= +0 -0 0 53 1 53 +0 53 +0.5 53 +0 53 +0 53 -0 N N -0 0 53 0.25 53 +0 53 +0.5 53 +0 53 +2 53 -0 N N +0 0 53 +1 53 +0 53 +0 53 +1 53 +0 53 -0 N N +0 0 53 +1 53 +0 53 -0 53 +1 53 +0 53 -0 N N +0 0 53 +1 53 +0 53 -1 53 +0 53 +0 53 -0 N N +0 0 53 +1 53 -0 53 -1 53 -0 53 +0 53 -0 N N +0 0 53 +1 53 -0 53 -0 53 -1 53 +0 53 -0 N N +0 0 53 +1 53 -0 53 +0 53 -1 53 +0 53 -0 N N -# (x-0i)^(y+0i) = +a +0i when x >= 1 and y <= -0 -0 0 53 0.5 53 +0 53 +2 53 -0 53 -1 53 +0 N N -0 0 53 1 53 +0 53 +3 53 -0 53 -0 53 +0 N N -0 0 53 1 53 +0 53 +1 53 -0 53 -1 53 +0 N N -0 0 53 1 53 +0 53 +1 53 -0 53 -0 53 +0 N N -# x^(-0+0i) = +1 +0i when |x| >= 1 and Im(x) < 0 -0 0 53 1 53 +0 53 +0.5 53 -0.5 53 -0 53 +0 N N -0 0 53 1 53 +0 53 +0 53 -0.5 53 -0 53 +0 N N -0 0 53 1 53 +0 53 -0 53 -0.5 53 -0 53 +0 N N -0 0 53 1 53 +0 53 -0.5 53 -0.5 53 -0 53 +0 N N -# x^(+0+0i) = +1 +0i when |x| >= 1 and Im(x) > 0 -0 0 53 1 53 +0 53 +0.5 53 +0.5 53 +0 53 +0 N N -0 0 53 1 53 +0 53 +0 53 -1 53 +0 53 +0 N N -0 0 53 1 53 +0 53 -0 53 +1 53 +0 53 +0 N N -0 0 53 1 53 +0 53 -0.5 53 +0.5 53 +0 53 +0 N N -# (x+0i)^(y+0i) = +a +0i when x >= 1 and y >= +0 -0 0 53 1 53 +0 53 +2 53 +0 53 +0 53 +0 N N -0 0 53 4 53 +0 53 +2 53 +0 53 +2 53 +0 N N -0 0 53 1 53 +0 53 +1 53 +0 53 +0 53 +0 N N -0 0 53 1 53 +0 53 +1 53 +0 53 +2 53 +0 N N +0 0 53 +1 53 -0 53 +0 53 +1 53 -0 53 +0 N N +0 0 53 +1 53 -0 53 -0 53 +1 53 -0 53 +0 N N +0 0 53 +1 53 -0 53 -1 53 +0 53 -0 53 +0 N N +0 0 53 +1 53 +0 53 -1 53 -0 53 -0 53 +0 N N +0 0 53 +1 53 +0 53 -0 53 -1 53 -0 53 +0 N N +0 0 53 +1 53 +0 53 +0 53 -1 53 -0 53 +0 N N -# (+1-0i)^(y1+y2 i) = +1 +0i when y1 <= -0 and y2 > 0 -0 0 53 1 53 +0 53 +1 53 -0 53 -2 53 +1 N N -0 0 53 1 53 +0 53 +1 53 -0 53 -1 53 +2 N N -# (+/-1-0i)^(+0+y i) = +a +0i when y > 0 -0 0 53 1 53 +0 53 +1 53 -0 53 -0 53 +1 N N -- 0 53 +0x10BBEEE9177E19p-43 53 +0 53 -1 53 -0 53 -0 53 +2 N N -# x^(-0-y i) = +a +0i when |x| = 1, Im(x) < 0 and y > 0 -+ 0 53 +0x1724046EB0933Ap-48 53 +0 53 -1 53 -0 53 -0 53 +1 N N -+ 0 53 +0x1724046EB0933Ap-48 53 +0 53 -0 53 -1 53 -0 53 +2 N N -- 0 53 +0x1BD4567B975381p-46 53 +0 53 +0 53 -1 53 -0 53 +3 N N -0 0 53 1 53 +0 53 +1 53 -0 53 -0 53 +4 N N -# x^(+0+y i) = +a +0i when |x| = 1, Im(x) > 0 and y > 0 -0 0 53 1 53 +0 53 +1 53 +0 53 +0 53 +1 N N -+ 0 53 +0x1620227B598EF9p-57 53 +0 53 +0 53 +1 53 +0 53 +2 N N -- 0 53 +0x1265D4E92B6B9Bp-59 53 +0 53 -0 53 +1 53 +0 53 +3 N N -+ 0 53 +0x1D4102BC3F7D4Cp-71 53 +0 53 -1 53 +0 53 +0 53 +4 N N -# (+/-1+0i)^(0+yi) = +a +0i when y > 0 -+ 0 53 +0x1E989F5D6DFF5Cp-62 53 +0 53 -1 53 +0 53 +0 53 +2 N N -0 0 53 1 53 +0 53 +1 53 +0 53 +0 53 +2 N N -# (+1 +0i)^(y1+y2 i) = +1 +0i when y1 >= +0 and y2 >0 -0 0 53 1 53 +0 53 +1 53 +0 53 +2 53 +2 N N -0 0 53 1 53 +0 53 +1 53 +0 53 +0 53 +2 N N +0 0 53 +1 53 -0 53 +0 53 +1 53 -0 53 -0 N N +0 0 53 +1 53 -0 53 -0 53 +1 53 -0 53 -0 N N +0 0 53 +1 53 -0 53 -1 53 +0 53 -0 53 -0 N N +0 0 53 +1 53 +0 53 -1 53 -0 53 -0 53 -0 N N +0 0 53 +1 53 +0 53 -0 53 -1 53 -0 53 -0 N N +0 0 53 +1 53 +0 53 +0 53 -1 53 -0 53 -0 N N -# (+1 +0i)^y = +1 -0i when Re(y) <= -0 and Im(y) < 0 -0 0 53 1 53 -0 53 +1 53 +0 53 -1 53 -1 N N -# (+/-1 +0i)^(-0 +yi) = +a -0i when y < 0 -0 0 53 1 53 -0 53 +1 53 +0 53 -0 53 -1 N N -+ 0 53 +0x1724046EB0933Ap-48 53 -0 53 -1 53 +0 53 -0 53 -1 N N -# x^(-0+y i) = +a -0i when |x| = 1, Im(x) >= +0 and y < 0 -+ 0 53 +0x1724046EB0933Ap-48 53 -0 53 +0 53 +1 53 -0 53 -2 N N -- 0 53 +0x1BD4567B975381p-46 53 -0 53 -0 53 +1 53 -0 53 -3 N N -# x^(+0+y i) = +a -0i when |x| = 1, Im(x) <= -0 and y < 0 -- 0 53 +0x1A9BCC46F767DFp-55 53 -0 53 +0 53 -1 53 +0 53 -1 N N -+ 0 53 +0x1620227B598EF9p-57 53 -0 53 -0 53 -1 53 +0 53 -2 N N -# (+/-1 -0i)^(+0+y i) = +a -0i when y < 0 -0 0 53 1 53 -0 53 +1 53 -0 53 +0 53 -1 N N -+ 0 53 +0x1620227B598EF9p-57 53 -0 53 -1 53 -0 53 +0 53 -1 N N -# (+1 -0i)^y = +1 -0i when Re(y) > 0 and Im(y) < 0 -0 0 53 1 53 -0 53 +1 53 -0 53 +2 53 -3 N N +# x^0 = +1 +sign(Im(y))*0i when |x| > 1 +0 0 53 +1 53 +0 53 +inf 53 +2 53 +0 53 +0 N N +0 0 53 +1 53 +0 53 +inf 53 -0 53 +0 53 +0 N N +0 0 53 +1 53 +0 53 +2 53 +inf 53 +0 53 +0 N N +0 0 53 +1 53 +0 53 +2 53 +0 53 +0 53 +0 N N +0 0 53 +1 53 +0 53 +0 53 +2 53 +0 53 +0 N N +0 0 53 +1 53 +0 53 +0 53 +inf 53 +0 53 +0 N N +0 0 53 +1 53 +0 53 -0 53 +2 53 +0 53 +0 N N +0 0 53 +1 53 +0 53 -0 53 +inf 53 +0 53 +0 N N +0 0 53 +1 53 +0 53 -5 53 +inf 53 +0 53 +0 N N +0 0 53 +1 53 +0 53 -2 53 +0 53 +0 53 +0 N N +0 0 53 +1 53 +0 53 -inf 53 +0 53 +0 53 +0 N N +0 0 53 +1 53 +0 53 -inf 53 +3 53 +0 53 +0 N N -# (x +0i)^(y -0i) = +a -0i when x >= 1 and y < 0 -0 0 53 0.5 53 -0 53 +2 53 +0 53 -1 53 -0 N N -0 0 53 1 53 -0 53 +1 53 +0 53 -1 53 -0 N N -# x^(-0 -0i) = +1 -0i when |x| >= 1 and Im (x) >= +0 -0 0 53 1 53 -0 53 +1.5 53 +0 53 -0 53 -0 N N -0 0 53 1 53 -0 53 +1 53 +0 53 -0 53 -0 N N -0 0 53 1 53 -0 53 -1 53 +0 53 -0 53 -0 N N -0 0 53 1 53 -0 53 -1.5 53 +0 53 -0 53 -0 N N -0 0 53 1 53 -0 53 +1.5 53 +4 53 -0 53 -0 N N -0 0 53 1 53 -0 53 +1 53 +4 53 -0 53 -0 N N -0 0 53 1 53 -0 53 -1 53 +4 53 -0 53 -0 N N -0 0 53 1 53 -0 53 -1.5 53 +4 53 -0 53 -0 N N -# x^(+0 -0i) = +1 -0i when |x| >= 1 and Im (x) <= -0 -0 0 53 1 53 -0 53 +1.5 53 -0 53 +0 53 -0 N N -0 0 53 1 53 -0 53 +1 53 -0 53 +0 53 -0 N N -0 0 53 1 53 -0 53 -1 53 -0 53 +0 53 -0 N N -0 0 53 1 53 -0 53 -1.5 53 -0 53 +0 53 -0 N N -0 0 53 1 53 -0 53 +1.5 53 -4 53 +0 53 -0 N N -0 0 53 1 53 -0 53 +1 53 -4 53 +0 53 -0 N N -0 0 53 1 53 -0 53 -1 53 -4 53 +0 53 -0 N N -0 0 53 1 53 -0 53 -1.5 53 -4 53 +0 53 -0 N N -# (x -0i)^(y -0i) = x^y -0i when x >= 1 and y > 0 -0 0 53 9 53 -0 53 +3 53 -0 53 +2 53 -0 N N -0 0 53 1 53 -0 53 +1 53 -0 53 +2 53 -0 N N +0 0 53 +1 53 -0 53 +inf 53 -inf 53 +0 53 -0 N N +0 0 53 +1 53 -0 53 +inf 53 +0 53 +0 53 -0 N N +0 0 53 +1 53 -0 53 +inf 53 -2 53 +0 53 -0 N N +0 0 53 +1 53 -0 53 +2 53 -5 53 +0 53 -0 N N +0 0 53 +1 53 -0 53 +5 53 +0 53 +0 53 -0 N N +0 0 53 +1 53 -0 53 +0 53 -inf 53 +0 53 -0 N N +0 0 53 +1 53 -0 53 -0 53 -inf 53 +0 53 -0 N N +0 0 53 +1 53 -0 53 -5 53 -0 53 +0 53 -0 N N +0 0 53 +1 53 -0 53 +inf 53 -0 53 +0 53 -0 N N +0 0 53 +1 53 -0 53 +inf 53 -2 53 +0 53 -0 N N -# (x +0i)^(y +0i) = x^y -0i when 0 < x < 1 and y < 0 -0 0 53 2 53 -0 53 +0.5 53 +0 53 -1 53 +0 N N -# x^(-0+0i) = +1 -0i when |x| < 1 and Im(x) >= +0 -0 0 53 1 53 -0 53 -0.5 53 +0 53 -0 53 +0 N N -0 0 53 1 53 -0 53 -0.1 53 +0.3 53 -0 53 +0 N N -0 0 53 1 53 -0 53 -0.0 53 +0.3 53 -0 53 +0 N N -0 0 53 1 53 -0 53 +0.0 53 +0.3 53 -0 53 +0 N N -0 0 53 1 53 -0 53 +0.1 53 +0.3 53 -0 53 +0 N N -0 0 53 1 53 -0 53 +0.5 53 +0 53 -0 53 +0 N N -# x^(+0+0i) = +1 -0i when |x| < 1 and Im(x) <= -0 -0 0 53 1 53 -0 53 -0.5 53 -0 53 +0 53 +0 N N -0 0 53 1 53 -0 53 -0.1 53 -0.3 53 +0 53 +0 N N -0 0 53 1 53 -0 53 -0.0 53 -0.3 53 +0 53 +0 N N -0 0 53 1 53 -0 53 +0.0 53 -0.3 53 +0 53 +0 N N -0 0 53 1 53 -0 53 +0.1 53 -0.3 53 +0 53 +0 N N -0 0 53 1 53 -0 53 +0.5 53 -0 53 +0 53 +0 N N -# (x-0i)^(y+0i) = x^y -0i when 0 < x < 1 and y > 0 -0 0 53 +0.25 53 -0 53 +0.5 53 -0 53 +2 53 +0 N N +0 0 53 +1 53 +0 53 -inf 53 -inf 53 -0 53 +0 N N +0 0 53 +1 53 +0 53 +inf 53 +0 53 -0 53 +0 N N +0 0 53 +1 53 +0 53 +2 53 -5 53 -0 53 +0 N N +0 0 53 +1 53 +0 53 +5 53 +0 53 -0 53 +0 N N +0 0 53 +1 53 +0 53 +5 53 -0 53 -0 53 +0 N N +0 0 53 +1 53 +0 53 +0 53 -2 53 -0 53 +0 N N +0 0 53 +1 53 +0 53 -0 53 -2 53 -0 53 +0 N N +0 0 53 +1 53 +0 53 -5 53 -0 53 -0 53 +0 N N +0 0 53 +1 53 +0 53 -inf 53 -0 53 -0 53 +0 N N + +0 0 53 +1 53 -0 53 +inf 53 +inf 53 -0 53 -0 N N +0 0 53 +1 53 -0 53 +2 53 +5 53 -0 53 -0 N N +0 0 53 +1 53 -0 53 +2 53 +0 53 -0 53 -0 N N +0 0 53 +1 53 -0 53 +2 53 -0 53 -0 53 -0 N N +0 0 53 +1 53 -0 53 +0 53 +2 53 -0 53 -0 N N +0 0 53 +1 53 -0 53 -0 53 +2 53 -0 53 -0 N N +0 0 53 +1 53 -0 53 -5 53 +2 53 -0 53 -0 N N +0 0 53 +1 53 -0 53 -5 53 +0 53 -0 53 -0 N N +0 0 53 +1 53 -0 53 -inf 53 +inf 53 -0 53 -0 N N +0 0 53 +1 53 -0 53 -inf 53 +inf 53 -0 53 -0 N N + +# x^0 = +1 -sign(Im(y))*0i when 1 > |x| > 0 +0 0 53 +1 53 -0 53 +0.5 53 -0.5 53 +0 53 +0 N N +0 0 53 +1 53 -0 53 +0.5 53 +0 53 +0 53 +0 N N +0 0 53 +1 53 -0 53 +0.5 53 -0 53 +0 53 +0 N N +0 0 53 +1 53 -0 53 -0.5 53 -0 53 +0 53 +0 N N +0 0 53 +1 53 -0 53 +0 53 -0.5 53 +0 53 +0 N N +0 0 53 +1 53 -0 53 -0 53 -0.5 53 +0 53 +0 N N + +0 0 53 +1 53 +0 53 +0.5 53 +0.5 53 +0 53 -0 N N +0 0 53 +1 53 +0 53 +0.5 53 +0 53 +0 53 -0 N N +0 0 53 +1 53 +0 53 +0.5 53 -0 53 +0 53 -0 N N +0 0 53 +1 53 +0 53 -0.5 53 +0 53 +0 53 -0 N N +0 0 53 +1 53 +0 53 +0 53 +0.5 53 +0 53 -0 N N +0 0 53 +1 53 +0 53 -0 53 +0.5 53 +0 53 -0 N N + +0 0 53 +1 53 -0 53 +0.5 53 +0.5 53 -0 53 +0 N N +0 0 53 +1 53 -0 53 +0.5 53 +0 53 -0 53 +0 N N +0 0 53 +1 53 -0 53 +0.5 53 -0 53 -0 53 +0 N N +0 0 53 +1 53 -0 53 -0.5 53 -0 53 -0 53 +0 N N +0 0 53 +1 53 -0 53 +0 53 +0.5 53 -0 53 +0 N N +0 0 53 +1 53 -0 53 -0 53 +0.5 53 -0 53 +0 N N + +0 0 53 +1 53 +0 53 +0.5 53 -0.5 53 -0 53 -0 N N +0 0 53 +1 53 +0 53 +0.5 53 +0 53 -0 53 -0 N N +0 0 53 +1 53 +0 53 +0.5 53 -0 53 -0 53 -0 N N +0 0 53 +1 53 +0 53 -0.5 53 -0 53 -0 53 -0 N N +0 0 53 +1 53 +0 53 +0 53 -0.5 53 -0 53 -0 N N +0 0 53 +1 53 +0 53 -0 53 -0.5 53 -0 53 -0 N N + +# determined sign of imaginary part in pure real powers +0 0 53 +9 53 +0 53 +3 53 +0 53 +2 53 +0 N N +0 0 53 +9 53 -0 53 +3 53 -0 53 +2 53 -0 N N +0 0 53 0.25 53 +0 53 +2 53 -0 53 -2 53 +0 N N +0 0 53 0.25 53 -0 53 +2 53 +0 53 -2 53 -0 N N +0 0 53 +1 53 +0 53 +1 53 +0 53 +4 53 +0 N N +0 0 53 +1 53 +0 53 +1 53 +0 53 +4 53 -0 N N +0 0 53 +1 53 -0 53 +1 53 -0 53 +4 53 +0 N N +0 0 53 +1 53 -0 53 +1 53 -0 53 +4 53 -0 N N +0 0 53 +1 53 +0 53 +1 53 -0 53 -4 53 +0 N N +0 0 53 +1 53 +0 53 +1 53 -0 53 -4 53 -0 N N +0 0 53 +1 53 -0 53 +1 53 +0 53 -4 53 +0 N N +0 0 53 +1 53 -0 53 +1 53 +0 53 -4 53 -0 N N +0 0 53 0.25 53 +0 53 +0.5 53 +0 53 +2 53 -0 N N +0 0 53 0.25 53 -0 53 +0.5 53 -0 53 +2 53 +0 N N +0 0 53 +4 53 +0 53 +0.5 53 -0 53 -2 53 -0 N N +0 0 53 +4 53 -0 53 +0.5 53 +0 53 -2 53 +0 N N + + +# pure real power with nondetermined sign in imaginary part +0 0 53 1 53 0 53 +2 53 -1 53 +0 53 +0 N N +0 0 53 1 53 0 53 -2 53 -1 53 +0 53 +0 N N +0 0 53 1 53 0 53 -2 53 -0 53 +0 53 +0 N N +0 0 53 1 53 0 53 +0.5 53 +0.5 53 +0 53 +0 N N +0 0 53 1 53 0 53 -0.5 53 +0.5 53 +0 53 +0 N N +0 0 53 1 53 0 53 -0.5 53 +0 53 +0 53 +0 N N +0 0 53 1 53 0 53 +0 53 +0.5 53 +0 53 +0 N N +0 0 53 1 53 0 53 -0 53 +0.5 53 +0 53 +0 N N +0 0 53 1 53 0 53 -0 53 -4 53 +0 53 +0 N N +0 0 53 1 53 0 53 +0 53 -4 53 +0 53 +0 N N +0 0 53 1 53 0 53 -1 53 -0 53 +0 53 +0 N N +0 0 53 1 53 0 53 -1 53 +0 53 +0 53 +0 N N +0 0 53 1 53 0 53 +2 53 -1 53 -0 53 -0 N N +0 0 53 1 53 0 53 -2 53 -1 53 -0 53 -0 N N +0 0 53 1 53 0 53 -2 53 -0 53 -0 53 -0 N N +0 0 53 1 53 0 53 +0.5 53 +0.5 53 -0 53 -0 N N +0 0 53 1 53 0 53 -0.5 53 +0.5 53 -0 53 -0 N N +0 0 53 1 53 0 53 -0.5 53 +0 53 -0 53 -0 N N +0 0 53 1 53 0 53 +0 53 +0.5 53 -0 53 -0 N N +0 0 53 1 53 0 53 -0 53 +0.5 53 -0 53 -0 N N +0 0 53 1 53 0 53 -0 53 -4 53 -0 53 -0 N N +0 0 53 1 53 0 53 +0 53 -4 53 -0 53 -0 N N +0 0 53 1 53 0 53 -1 53 -0 53 -0 53 -0 N N +0 0 53 1 53 0 53 -1 53 +0 53 -0 53 -0 N N +0 0 53 1 53 0 53 +2 53 +1 53 -0 53 +0 N N +0 0 53 1 53 0 53 -2 53 +1 53 -0 53 +0 N N +0 0 53 1 53 0 53 -2 53 +0 53 -0 53 +0 N N +0 0 53 1 53 0 53 +0.5 53 -0.5 53 -0 53 +0 N N +0 0 53 1 53 0 53 -0.5 53 -0.5 53 -0 53 +0 N N +0 0 53 1 53 0 53 -0.5 53 -0 53 -0 53 +0 N N +0 0 53 1 53 0 53 +0 53 +5 53 -0 53 +0 N N +0 0 53 1 53 0 53 -0 53 +5 53 -0 53 +0 N N +0 0 53 1 53 0 53 -0 53 -0.5 53 -0 53 +0 N N +0 0 53 1 53 0 53 +0 53 -0.5 53 -0 53 +0 N N +0 0 53 1 53 0 53 -1 53 -0 53 -0 53 +0 N N +0 0 53 1 53 0 53 -1 53 +0 53 -0 53 +0 N N +0 0 53 1 53 0 53 +2 53 +1 53 +0 53 -0 N N +0 0 53 1 53 0 53 -2 53 +1 53 +0 53 -0 N N +0 0 53 1 53 0 53 -2 53 +0 53 +0 53 -0 N N +0 0 53 1 53 0 53 +0.5 53 -0.5 53 +0 53 -0 N N +0 0 53 1 53 0 53 -0.5 53 -0.5 53 +0 53 -0 N N +0 0 53 1 53 0 53 -0.5 53 -0 53 +0 53 -0 N N +0 0 53 1 53 0 53 +0 53 +5 53 +0 53 -0 N N +0 0 53 1 53 0 53 -0 53 +5 53 +0 53 -0 N N +0 0 53 1 53 0 53 -0 53 -0.5 53 +0 53 -0 N N +0 0 53 1 53 0 53 +0 53 -0.5 53 +0 53 -0 N N +0 0 53 1 53 0 53 -1 53 -0 53 +0 53 -0 N N +0 0 53 1 53 0 53 -1 53 +0 53 +0 53 -0 N N + +0 0 53 4 53 0 53 +2 53 -0 53 +2 53 +0 N N +0 0 53 1 53 0 53 +1 53 +0 53 +2 53 +0 N N +0 0 53 1 53 0 53 +1 53 +0 53 +2 53 -0 N N +0 0 53 4 53 0 53 +2 53 +0 53 +2 53 -0 N N +0 0 53 1 53 0 53 +1 53 -0 53 +2 53 +0 N N +0 0 53 1 53 0 53 +1 53 -0 53 +2 53 -0 N N +0 0 53 +.25 53 0 53 +2 53 +0 53 -2 53 +0 N N +0 0 53 1 53 0 53 +1 53 +0 53 -2 53 +0 N N +0 0 53 1 53 0 53 +1 53 +0 53 -2 53 -0 N N +0 0 53 +.25 53 0 53 +2 53 -0 53 -2 53 -0 N N +0 0 53 1 53 0 53 +1 53 -0 53 -2 53 +0 N N +0 0 53 1 53 0 53 +1 53 -0 53 -2 53 -0 N N + +# when (+/-1 +/-0i)^y is pure real +0 0 53 1 53 0 53 +1 53 -0 53 -2 53 +1 N N +0 0 53 1 53 0 53 +1 53 -0 53 -1 53 +2 N N +0 0 53 1 53 0 53 +1 53 -0 53 -0 53 +1 N N +- 0 53 +0x10BBEEE9177E19p-43 53 0 53 -1 53 -0 53 -0 53 +2 N N ++ 0 53 +0x1E989F5D6DFF5Cp-62 53 0 53 -1 53 +0 53 +0 53 +2 N N +0 0 53 1 53 0 53 +1 53 +0 53 +0 53 +2 N N +0 0 53 1 53 0 53 +1 53 +0 53 +2 53 +2 N N +0 0 53 1 53 0 53 +1 53 +0 53 +0 53 +2 N N +0 0 53 1 53 0 53 +1 53 +0 53 -1 53 -1 N N +0 0 53 1 53 0 53 +1 53 +0 53 -0 53 -1 N N ++ 0 53 +0x1724046EB0933Ap-48 53 0 53 -1 53 +0 53 -0 53 -1 N N +0 0 53 1 53 0 53 +1 53 -0 53 +0 53 -1 N N ++ 0 53 +0x1620227B598EF9p-57 53 0 53 -1 53 -0 53 +0 53 -1 N N +0 0 53 1 53 0 53 +1 53 -0 53 +2 53 -3 N N ++ 0 53 +0x1D4102BC3F7D4Cp-71 53 0 53 -1 53 +0 53 +0 53 +4 N N ++ 0 53 +0x1724046EB0933Ap-48 53 0 53 -1 53 -0 53 -0 53 +1 N N + +# when (0 +/-i)^y is pure real ++ 0 53 +0x1724046EB0933Ap-48 53 0 53 -0 53 -1 53 -0 53 +2 N N +- 0 53 +0x1BD4567B975381p-46 53 0 53 +0 53 -1 53 -0 53 +3 N N ++ 0 53 +0x1620227B598EF9p-57 53 0 53 +0 53 +1 53 +0 53 +2 N N +- 0 53 +0x1265D4E92B6B9Bp-59 53 0 53 -0 53 +1 53 +0 53 +3 N N ++ 0 53 +0x1724046EB0933Ap-48 53 0 53 +0 53 +1 53 -0 53 -2 N N +- 0 53 +0x1BD4567B975381p-46 53 0 53 -0 53 +1 53 -0 53 -3 N N +- 0 53 +0x1A9BCC46F767DFp-55 53 0 53 +0 53 -1 53 +0 53 -1 N N ++ 0 53 +0x1620227B598EF9p-57 53 0 53 -0 53 -1 53 +0 53 -2 N N # exact cases # (-4)^(1/4) = 1+i |