From: Chris Dams Date: Wed, 22 Nov 2006 21:50:11 +0000 (+0000) Subject: make atan2 handle positive arguments better. We have pos. symbols nowadays. X-Git-Tag: release_1-4-0~52 X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=commitdiff_plain;h=62a1dbf52d01b7f50cce2ed16219466ff7174c09 make atan2 handle positive arguments better. We have pos. symbols nowadays. --- diff --git a/ginac/inifcns_trans.cpp b/ginac/inifcns_trans.cpp index 657cdfab..40402bb6 100644 --- a/ginac/inifcns_trans.cpp +++ b/ginac/inifcns_trans.cpp @@ -820,69 +820,67 @@ static ex atan2_evalf(const ex &y, const ex &x) static ex atan2_eval(const ex & y, const ex & x) { - if (y.info(info_flags::numeric) && x.info(info_flags::numeric)) { + if (y.is_zero()) { - if (y.is_zero()) { + // atan(0, 0) -> 0 + if (x.is_zero()) + return _ex0; - // atan(0, 0) -> 0 - if (x.is_zero()) - return _ex0; + // atan(0, x), x real and positive -> 0 + if (x.info(info_flags::positive)) + return _ex0; - // atan(0, x), x real and positive -> 0 - if (x.info(info_flags::positive)) - return _ex0; + // atan(0, x), x real and negative -> -Pi + if (x.info(info_flags::negative)) + return _ex_1*Pi; + } - // atan(0, x), x real and negative -> -Pi - if (x.info(info_flags::negative)) - return _ex_1*Pi; - } + if (x.is_zero()) { - if (x.is_zero()) { + // atan(y, 0), y real and positive -> Pi/2 + if (y.info(info_flags::positive)) + return _ex1_2*Pi; - // atan(y, 0), y real and positive -> Pi/2 - if (y.info(info_flags::positive)) - return _ex1_2*Pi; + // atan(y, 0), y real and negative -> -Pi/2 + if (y.info(info_flags::negative)) + return _ex_1_2*Pi; + } - // atan(y, 0), y real and negative -> -Pi/2 - if (y.info(info_flags::negative)) - return _ex_1_2*Pi; - } + if (y.is_equal(x)) { - if (y.is_equal(x)) { + // atan(y, y), y real and positive -> Pi/4 + if (y.info(info_flags::positive)) + return _ex1_4*Pi; - // atan(y, y), y real and positive -> Pi/4 - if (y.info(info_flags::positive)) - return _ex1_4*Pi; + // atan(y, y), y real and negative -> -3/4*Pi + if (y.info(info_flags::negative)) + return numeric(-3, 4)*Pi; + } - // atan(y, y), y real and negative -> -3/4*Pi - if (y.info(info_flags::negative)) - return numeric(-3, 4)*Pi; - } + if (y.is_equal(-x)) { - if (y.is_equal(-x)) { + // atan(y, -y), y real and positive -> 3*Pi/4 + if (y.info(info_flags::positive)) + return numeric(3, 4)*Pi; - // atan(y, -y), y real and positive -> 3*Pi/4 - if (y.info(info_flags::positive)) - return numeric(3, 4)*Pi; + // atan(y, -y), y real and negative -> -Pi/4 + if (y.info(info_flags::negative)) + return _ex_1_4*Pi; + } - // atan(y, -y), y real and negative -> -Pi/4 - if (y.info(info_flags::negative)) - return _ex_1_4*Pi; - } + // atan(float, float) -> float + if (is_a(y) && is_a(x) && !y.info(info_flags::crational) + && !x.info(info_flags::crational)) + return atan(ex_to(y), ex_to(x)); - // atan(float, float) -> float - if (!y.info(info_flags::crational) && !x.info(info_flags::crational)) - return atan(ex_to(y), ex_to(x)); - - // atan(real, real) -> atan(y/x) +/- Pi - if (y.info(info_flags::real) && x.info(info_flags::real)) { - if (x.info(info_flags::positive)) - return atan(y/x); - else if(y.info(info_flags::positive)) - return atan(y/x)+Pi; - else - return atan(y/x)-Pi; - } + // atan(real, real) -> atan(y/x) +/- Pi + if (y.info(info_flags::real) && x.info(info_flags::real)) { + if (x.info(info_flags::positive)) + return atan(y/x); + else if(y.info(info_flags::positive)) + return atan(y/x)+Pi; + else + return atan(y/x)-Pi; } return atan2(y, x).hold();