X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?a=blobdiff_plain;f=check%2Fexam_inifcns.cpp;h=994aa3444d6cf6e16ed2fd321897a433d3de4f17;hb=d916416984a857e80962239a0ee93e7216f803bb;hp=47cc10404c43f45217890a0a0f694a8e91826440;hpb=383d5eb3b0f0506810d9105a268f939125bfc347;p=ginac.git diff --git a/check/exam_inifcns.cpp b/check/exam_inifcns.cpp index 47cc1040..994aa344 100644 --- a/check/exam_inifcns.cpp +++ b/check/exam_inifcns.cpp @@ -4,7 +4,7 @@ * functions. */ /* - * GiNaC Copyright (C) 1999-2001 Johannes Gutenberg University Mainz, Germany + * GiNaC Copyright (C) 1999-2011 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 @@ -18,14 +18,21 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "exams.h" +#include "ginac.h" +using namespace GiNaC; + +#include +using namespace std; /* Assorted tests on other transcendental functions. */ -static unsigned inifcns_consist_trans(void) +static unsigned inifcns_consist_trans() { + using GiNaC::asin; using GiNaC::acos; + using GiNaC::asinh; using GiNaC::acosh; using GiNaC::atanh; + unsigned result = 0; symbol x("x"); ex chk; @@ -90,17 +97,39 @@ static unsigned inifcns_consist_trans(void) ++result; } + // check consistency of log and eta phases: + for (int r1=-1; r1<=1; ++r1) { + for (int i1=-1; i1<=1; ++i1) { + ex x1 = r1+I*i1; + if (x1.is_zero()) + continue; + for (int r2=-1; r2<=1; ++r2) { + for (int i2=-1; i2<=1; ++i2) { + ex x2 = r2+I*i2; + if (x2.is_zero()) + continue; + if (abs(evalf(eta(x1,x2)-log(x1*x2)+log(x1)+log(x2)))>.1e-12) { + clog << "either eta(x,y), log(x), log(y) or log(x*y) is wrong" + << " at x==" << x1 << ", y==" << x2 << endl; + ++result; + } + } + } + } + } + return result; } /* Simple tests on the tgamma function. We stuff in arguments where the results * exists in closed form and check if it's ok. */ -static unsigned inifcns_consist_gamma(void) +static unsigned inifcns_consist_gamma() { + using GiNaC::tgamma; unsigned result = 0; ex e; - e = tgamma(ex(1)); + e = tgamma(1); for (int i=2; i<8; ++i) e += tgamma(ex(i)); if (e != numeric(874)) { @@ -109,7 +138,7 @@ static unsigned inifcns_consist_gamma(void) ++result; } - e = tgamma(ex(1)); + e = tgamma(1); for (int i=2; i<8; ++i) e *= tgamma(ex(i)); if (e != numeric(24883200)) { @@ -140,8 +169,11 @@ static unsigned inifcns_consist_gamma(void) /* Simple tests on the Psi-function (aka polygamma-function). We stuff in arguments where the result exists in closed form and check if it's ok. */ -static unsigned inifcns_consist_psi(void) +static unsigned inifcns_consist_psi() { + using GiNaC::log; + using GiNaC::tgamma; + unsigned result = 0; symbol x; ex e, f; @@ -162,7 +194,7 @@ static unsigned inifcns_consist_psi(void) /* Simple tests on the Riemann Zeta function. We stuff in arguments where the * result exists in closed form and check if it's ok. Of course, this checks * the Bernoulli numbers as a side effect. */ -static unsigned inifcns_consist_zeta(void) +static unsigned inifcns_consist_zeta() { unsigned result = 0; ex e; @@ -187,24 +219,61 @@ static unsigned inifcns_consist_zeta(void) return result; } -unsigned exam_inifcns(void) +static unsigned inifcns_consist_abs() +{ + unsigned result = 0; + realsymbol a("a"), b("b"), x("x"), y("y"); + possymbol p("p"); + + if (!abs(exp(x+I*y)).eval().is_equal(exp(x))) + ++result; + + if (!abs(pow(p,a+I*b)).eval().is_equal(pow(p,a))) + ++result; + + // also checks that abs(p)=p + if (!abs(pow(p,a+I*b)).eval().is_equal(pow(p,a))) + ++result; + + if (!abs(pow(x+I*y,a)).eval().is_equal(pow(abs(x+I*y),a))) + ++result; + + // it is not necessary a simplification if the following is really evaluated + if (!abs(pow(x+I*y,a+I*b)).eval().is_equal(abs(pow(x+I*y,a+I*b)))) + ++result; + +} + +static unsigned inifcns_consist_various() +{ + unsigned result = 0; + symbol n; + + if ( binomial(n, 0) != 1 ) { + clog << "ERROR: binomial(n,0) != 1" << endl; + ++result; + } + + return result; +} + +unsigned exam_inifcns() { unsigned result = 0; cout << "examining consistency of symbolic functions" << flush; - clog << "----------consistency of symbolic functions:" << endl; result += inifcns_consist_trans(); cout << '.' << flush; result += inifcns_consist_gamma(); cout << '.' << flush; result += inifcns_consist_psi(); cout << '.' << flush; result += inifcns_consist_zeta(); cout << '.' << flush; - - if (!result) { - cout << " passed " << endl; - clog << "(no output)" << endl; - } else { - cout << " failed " << endl; - } + result += inifcns_consist_abs(); cout << '.' << flush; + result += inifcns_consist_various(); cout << '.' << flush; return result; } + +int main(int argc, char** argv) +{ + return exam_inifcns(); +}