From 6335b2cfb6f3f9ec339ff683bed415a5879d7909 Mon Sep 17 00:00:00 2001 From: Alexei Sheplyakov Date: Wed, 19 Mar 2008 12:25:55 +0300 Subject: [PATCH] inifcns_nstdsums.cpp: Lin_numeric takes cl_N as an argument instead of numeric. Implicit conversion from cl_N to numeric considered harmful, part 2. --- ginac/inifcns_nstdsums.cpp | 39 ++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/ginac/inifcns_nstdsums.cpp b/ginac/inifcns_nstdsums.cpp index bd61fd30..01a57569 100644 --- a/ginac/inifcns_nstdsums.cpp +++ b/ginac/inifcns_nstdsums.cpp @@ -379,15 +379,14 @@ cln::cl_N Li_projection(int n, const cln::cl_N& x, const cln::float_format_t& pr } } - // helper function for classical polylog Li -numeric Lin_numeric(int n, const numeric& x) +const cln::cl_N Lin_numeric(const int n, const cln::cl_N& x) { if (n == 1) { // just a log - return -cln::log(1-x.to_cl_N()); + return -cln::log(1-x); } - if (x.is_zero()) { + if (zerop(x)) { return 0; } if (x == 1) { @@ -398,12 +397,11 @@ numeric Lin_numeric(int n, const numeric& x) // [Kol] (2.22) return -(1-cln::expt(cln::cl_I(2),1-n)) * cln::zeta(n); } - if (abs(x.real()) < 0.4 && abs(abs(x)-1) < 0.01) { - cln::cl_N x_ = ex_to(x).to_cl_N(); - cln::cl_N result = -cln::expt(cln::log(x_), n-1) * cln::log(1-x_) / cln::factorial(n-1); + if (cln::abs(realpart(x)) < 0.4 && cln::abs(cln::abs(x)-1) < 0.01) { + cln::cl_N result = -cln::expt(cln::log(x), n-1) * cln::log(1-x) / cln::factorial(n-1); for (int j=0; j(cln::realpart(value))); - else if (!x.imag().is_rational()) + else if (!instanceof(imagpart(x), cln::cl_RA_ring)) prec = cln::float_format(cln::the(cln::imagpart(value))); // [Kol] (5.15) @@ -441,7 +439,7 @@ numeric Lin_numeric(int n, const numeric& x) cln::cl_N add; for (int j=0; j(m_).to_int(), ex_to(x_)); + int m__ = ex_to(m_).to_int(); + const cln::cl_N x__ = ex_to(x_).to_cl_N(); + const cln::cl_N result = Lin_numeric(m__, x__); + return numeric(result); } else { // try to numerically evaluate second argument ex x_val = x_.evalf(); if (x_val.info(info_flags::numeric)) { - return Lin_numeric(ex_to(m_).to_int(), ex_to(x_val)); + int m__ = ex_to(m_).to_int(); + const cln::cl_N x__ = ex_to(x_val).to_cl_N(); + const cln::cl_N result = Lin_numeric(m__, x__); + return numeric(result); } } } @@ -1499,7 +1503,10 @@ static ex Li_eval(const ex& m_, const ex& x_) } } if (m_.info(info_flags::posint) && x_.info(info_flags::numeric) && !x_.info(info_flags::crational)) { - return Lin_numeric(ex_to(m_).to_int(), ex_to(x_)); + int m__ = ex_to(m_).to_int(); + const cln::cl_N x__ = ex_to(x_).to_cl_N(); + const cln::cl_N result = Lin_numeric(m__, x__); + return numeric(result); } return Li(m_, x_).hold(); -- 2.44.0