summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorthevenyp <thevenyp@211d60ee-9f03-0410-a15a-8952a2c7a4e4>2009-07-29 16:41:45 +0000
committerthevenyp <thevenyp@211d60ee-9f03-0410-a15a-8952a2c7a4e4>2009-07-29 16:41:45 +0000
commitacc9fd2dc1cff899745e08217deec27dd5bb741a (patch)
tree648c9c98689b495559ac5b0c3600fc946f5e30a3
parent310ebdd32c1d7679c3aa560c61b4a6dafd67aae0 (diff)
downloadmpc-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.c165
-rw-r--r--tests/pow.dat342
2 files changed, 310 insertions, 197 deletions
diff --git a/src/pow.c b/src/pow.c
index 70a7b9c..a4085a9 100644
--- a/src/pow.c
+++ b/src/pow.c
@@ -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