]> www.ginac.de Git - ginac.git/blobdiff - ginac/inifcns_trans.cpp
Fixed a bug in atan2. It gave a division by zero error for calls like
[ginac.git] / ginac / inifcns_trans.cpp
index f0d785904176bd4519b6d35f127228d980e93d2e..3f161d218c068e2a4d016fce5d5cfcb2d32f789e 100644 (file)
@@ -4,7 +4,7 @@
  *  functions. */
 
 /*
- *  GiNaC Copyright (C) 1999-2007 Johannes Gutenberg University Mainz, Germany
+ *  GiNaC Copyright (C) 1999-2010 Johannes Gutenberg University Mainz, Germany
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -21,9 +21,6 @@
  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#include <vector>
-#include <stdexcept>
-
 #include "inifcns.h"
 #include "ex.h"
 #include "constant.h"
@@ -35,6 +32,9 @@
 #include "pseries.h"
 #include "utils.h"
 
+#include <stdexcept>
+#include <vector>
+
 namespace GiNaC {
 
 //////////
@@ -830,9 +830,9 @@ static ex atan2_eval(const ex & y, const ex & x)
                if (x.info(info_flags::positive))
                        return _ex0;
 
-               // atan(0, x), x real and negative -> -Pi
+               // atan(0, x), x real and negative -> Pi
                if (x.info(info_flags::negative))
-                       return _ex_1*Pi;
+                       return Pi;
        }
 
        if (x.is_zero()) {
@@ -842,7 +842,7 @@ static ex atan2_eval(const ex & y, const ex & x)
                        return _ex1_2*Pi;
 
                // atan(y, 0), y real and negative -> -Pi/2
-               if (y.info(info_flags::negative))
+               if (y.info(info_flags::real) && !y.is_zero())
                        return _ex_1_2*Pi;
        }
 
@@ -869,15 +869,15 @@ static ex atan2_eval(const ex & y, const ex & x)
        }
 
        // atan(float, float) -> float
-       if (is_a<numeric>(y) && is_a<numeric>(x) && !y.info(info_flags::crational)
-                       && !x.info(info_flags::crational))
+       if (is_a<numeric>(y) && !y.info(info_flags::crational) &&
+           is_a<numeric>(x) && !x.info(info_flags::crational))
                return atan(ex_to<numeric>(y), ex_to<numeric>(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))
+               else if (y.info(info_flags::positive))
                        return atan(y/x)+Pi;
                else
                        return atan(y/x)-Pi;