diff options
author | zimmerma <zimmerma@211d60ee-9f03-0410-a15a-8952a2c7a4e4> | 2012-01-09 22:11:50 +0000 |
---|---|---|
committer | zimmerma <zimmerma@211d60ee-9f03-0410-a15a-8952a2c7a4e4> | 2012-01-09 22:11:50 +0000 |
commit | 1999bbf7bc17a8b9eb61a65ed3287f96992f2a51 (patch) | |
tree | 53323677bc6b3a9d2a9ed952be045bfbb1adecb6 /src | |
parent | 64d486ad2684c632c5e62af973d3b783563d88ee (diff) | |
download | mpc-1999bbf7bc17a8b9eb61a65ed3287f96992f2a51.tar.gz |
changed result for 0^0, according to the discussion on
http://lists.gforge.inria.fr/pipermail/mpc-discuss/2011-December/001049.html
git-svn-id: svn://scm.gforge.inria.fr/svn/mpc/trunk@1118 211d60ee-9f03-0410-a15a-8952a2c7a4e4
Diffstat (limited to 'src')
-rw-r--r-- | src/pow.c | 32 |
1 files changed, 29 insertions, 3 deletions
@@ -489,10 +489,36 @@ mpc_pow (mpc_ptr z, mpc_srcptr x, mpc_srcptr y, mpc_rnd_t rnd) if (y_real && mpfr_zero_p (mpc_realref(y))) /* case y zero */ { - if (x_real && mpfr_zero_p (mpc_realref(x))) /* 0^0 = NaN +i*NaN */ + if (x_real && mpfr_zero_p (mpc_realref(x))) { - mpfr_set_nan (mpc_realref(z)); - mpfr_set_nan (mpc_imagref(z)); + /* we define 0^0 to be (1, -sign(Im(y))*0) since the real part is + coherent with MPFR where 0^0 gives 1, and the sign of the + imaginary part is the most frequent one obtained for random + tiny x and y, for example with the following Sage program: + D = dict() + for sa in [-1,1]: + for sb in [-1,1]: + for sc in [-1,1]: + for sd in [-1,1]: + D[(sa,sb,sc,sd)] = [0,0] + def tiny(): + return (random() - 0.5) * 1e-3 + for n in range(10^4): + a = tiny() + b = tiny() + c = tiny() + d = tiny() + x = a+I*b + y = c+I*d + z = x^y + t = sign(a),sign(b),sign(c),sign(d) + if sign(z.imag()) == 1: + D[t] = [D[t][0],D[t][1]+1] + else: + D[t] = [D[t][0]+1,D[t][1]] */ + mpfr_set_ui (mpc_realref(z), 1, GMP_RNDZ); + mpfr_set_zero (mpc_imagref(z), + mpfr_signbit (mpc_imagref(y)) ? 1 : -1); return 0; } else /* x^0 = 1 +/- i*0 even for x=NaN see algorithms.tex for the |