X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Finifcns_zeta.cpp;h=287059835180a06dea6a2763b5d77ae11074cda3;hp=9cd0961af432694e0aed9a1c40ab26a50ead2918;hb=abc868b70eea6e434130c4d8d9916ae8f55db370;hpb=591b85b0697370f2f5f25a29a1e94ff831a02c12 diff --git a/ginac/inifcns_zeta.cpp b/ginac/inifcns_zeta.cpp index 9cd0961a..28705983 100644 --- a/ginac/inifcns_zeta.cpp +++ b/ginac/inifcns_zeta.cpp @@ -38,11 +38,13 @@ namespace GiNaC { static ex zeta1_evalf(const ex & x) { - BEGIN_TYPECHECK - TYPECHECK(x,numeric) - END_TYPECHECK(zeta(x)) - - return zeta(ex_to(x)); + if (is_exactly_a(x)) { + try { + return zeta(ex_to(x)); + } catch (const dunno &e) { } + } + + return zeta(x).hold(); } static ex zeta1_eval(const ex & x) @@ -52,21 +54,24 @@ static ex zeta1_eval(const ex & x) // trap integer arguments: if (y.is_integer()) { if (y.is_zero()) - return -_ex1_2(); - if (x.is_equal(_ex1())) + return _ex_1_2; + if (x.is_equal(_ex1)) throw(std::domain_error("zeta(1): infinity")); if (x.info(info_flags::posint)) { if (x.info(info_flags::odd)) return zeta(x).hold(); else - return abs(bernoulli(y))*pow(Pi,x)*pow(_num2(),y-_num1())/factorial(y); + return abs(bernoulli(y))*pow(Pi,x)*pow(_num2,y-_num1)/factorial(y); } else { if (x.info(info_flags::odd)) - return -bernoulli(_num1()-y)/(_num1()-y); + return -bernoulli(_num1-y)/(_num1-y); else - return _num0(); + return _num0; } } + // zeta(float) + if (x.info(info_flags::numeric) && !x.info(info_flags::crational)) + return zeta1_evalf(x); } return zeta(x).hold(); } @@ -75,7 +80,7 @@ static ex zeta1_deriv(const ex & x, unsigned deriv_param) { GINAC_ASSERT(deriv_param==0); - return zeta(_ex1(), x); + return zeta(_ex1, x); } const unsigned function_index_zeta1 =