* functions. */
/*
- * GiNaC Copyright (C) 1999-2004 Johannes Gutenberg University Mainz, Germany
+ * GiNaC Copyright (C) 1999-2005 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
if (x.info(info_flags::numeric)) {
if (x.is_zero()) // log(0) -> infinity
throw(pole_error("log_eval(): log(0)",0));
- if (x.info(info_flags::real) && x.info(info_flags::negative))
+ if (x.info(info_flags::rational) && x.info(info_flags::negative))
return (log(-x)+I*Pi);
if (x.is_equal(_ex1)) // log(1) -> 0
return _ex0;
if (!argser.is_terminating() || argser.nops()!=1) {
// in this case n more (or less) terms are needed
// (sadly, to generate them, we have to start from the beginning)
- const ex newarg = ex_to<pseries>((arg/coeff).series(rel, order+n, options)).shift_exponents(-n).convert_to_poly(true);
if (n == 0 && coeff == 1) {
epvector epv;
ex acc = (new pseries(rel, epv))->setflag(status_flags::dynallocated);
}
return acc;
}
+ const ex newarg = ex_to<pseries>((arg/coeff).series(rel, order+n, options)).shift_exponents(-n).convert_to_poly(true);
return pseries(rel, seq).add_series(ex_to<pseries>(log(newarg).series(rel, order, options)));
} else // it was a monomial
return pseries(rel, seq);