X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=check%2Finifcns_consist.cpp;h=c30ddefec5316266970297022066c4816b52f1cc;hp=25e3419732bc00124f32db6667443d7448616faf;hb=7a5f6e34480a04d888d2a7057a7dceac3e3a9bf7;hpb=c76a85d9ad2a9beeac6e26cb5c24a1bdbca911ed diff --git a/check/inifcns_consist.cpp b/check/inifcns_consist.cpp index 25e34197..c30ddefe 100644 --- a/check/inifcns_consist.cpp +++ b/check/inifcns_consist.cpp @@ -4,7 +4,7 @@ * functions. */ /* - * GiNaC Copyright (C) 1999 Johannes Gutenberg University Mainz, Germany + * GiNaC Copyright (C) 1999-2000 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,13 +21,13 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include +#include "ginac.h" -#ifndef NO_GINAC_NAMESPACE +#ifndef NO_NAMESPACE_GINAC using namespace GiNaC; -#endif // ndef NO_GINAC_NAMESPACE +#endif // ndef NO_NAMESPACE_GINAC -/* Simple tests on the sine trigonometric function. */ +/* Some tests on the sine trigonometric function. */ static unsigned inifcns_consist_sin(void) { unsigned result = 0; @@ -36,11 +36,12 @@ static unsigned inifcns_consist_sin(void) // sin(n*Pi) == 0? errorflag = false; for (int n=-10; n<=10; ++n) { - if ( sin(n*Pi).eval() != numeric(0) || + if (sin(n*Pi).eval() != numeric(0) || !sin(n*Pi).eval().info(info_flags::integer)) errorflag = true; } if (errorflag) { + // we don't count each of those errors clog << "sin(n*Pi) with integer n does not always return exact 0" << endl; ++result; @@ -49,7 +50,7 @@ static unsigned inifcns_consist_sin(void) // sin((n+1/2)*Pi) == {+|-}1? errorflag = false; for (int n=-10; n<=10; ++n) { - if (! sin((n+numeric(1,2))*Pi).eval().info(info_flags::integer) || + if (!sin((n+numeric(1,2))*Pi).eval().info(info_flags::integer) || !(sin((n+numeric(1,2))*Pi).eval() == numeric(1) || sin((n+numeric(1,2))*Pi).eval() == numeric(-1))) errorflag = true; @@ -60,6 +61,25 @@ static unsigned inifcns_consist_sin(void) ++result; } + // compare sin((q*Pi).evalf()) with sin(q*Pi).eval().evalf() at various + // points. E.g. if sin(Pi/10) returns something symbolic this should be + // equal to sqrt(5)/4-1/4. This routine will spot programming mistakes + // of this kind: + errorflag = false; + ex argument; + numeric epsilon(double(1e-8)); + for (int n=-240; n<=240; ++n) { + argument = n*Pi/60; + if (abs(sin(evalf(argument))-evalf(sin(argument)))>epsilon) { + clog << "sin(" << argument << ") returns " + << sin(argument) << endl; + errorflag = true; + } + } + if (errorflag) { + ++result; + } + return result; } @@ -72,7 +92,7 @@ static unsigned inifcns_consist_cos(void) // cos((n+1/2)*Pi) == 0? errorflag = false; for (int n=-10; n<=10; ++n) { - if ( cos((n+numeric(1,2))*Pi).eval() != numeric(0) || + if (cos((n+numeric(1,2))*Pi).eval() != numeric(0) || !cos((n+numeric(1,2))*Pi).eval().info(info_flags::integer)) errorflag = true; } @@ -85,7 +105,7 @@ static unsigned inifcns_consist_cos(void) // cos(n*Pi) == 0? errorflag = false; for (int n=-10; n<=10; ++n) { - if (! cos(n*Pi).eval().info(info_flags::integer) || + if (!cos(n*Pi).eval().info(info_flags::integer) || !(cos(n*Pi).eval() == numeric(1) || cos(n*Pi).eval() == numeric(-1))) errorflag = true; @@ -96,6 +116,55 @@ static unsigned inifcns_consist_cos(void) ++result; } + // compare cos((q*Pi).evalf()) with cos(q*Pi).eval().evalf() at various + // points. E.g. if cos(Pi/12) returns something symbolic this should be + // equal to 1/4*(1+1/3*sqrt(3))*sqrt(6). This routine will spot + // programming mistakes of this kind: + errorflag = false; + ex argument; + numeric epsilon(double(1e-8)); + for (int n=-240; n<=240; ++n) { + argument = n*Pi/60; + if (abs(cos(evalf(argument))-evalf(cos(argument)))>epsilon) { + clog << "cos(" << argument << ") returns " + << cos(argument) << endl; + errorflag = true; + } + } + if (errorflag) { + ++result; + } + + return result; +} + +/* Simple tests on the tangent trigonometric function. */ +static unsigned inifcns_consist_tan(void) +{ + unsigned result = 0; + bool errorflag; + + // compare tan((q*Pi).evalf()) with tan(q*Pi).eval().evalf() at various + // points. E.g. if tan(Pi/12) returns something symbolic this should be + // equal to 2-sqrt(3). This routine will spot programming mistakes of + // this kind: + errorflag = false; + ex argument; + numeric epsilon(double(1e-8)); + for (int n=-240; n<=240; ++n) { + if (!(n%30) && (n%60)) // skip poles + ++n; + argument = n*Pi/60; + if (abs(tan(evalf(argument))-evalf(tan(argument)))>epsilon) { + clog << "tan(" << argument << ") returns " + << tan(argument) << endl; + errorflag = true; + } + } + if (errorflag) { + ++result; + } + return result; } @@ -220,7 +289,7 @@ static unsigned inifcns_consist_psi(void) { unsigned result = 0; symbol x; - ex e; + ex e, f; // We check psi(1) and psi(1/2) implicitly by calculating the curious // little identity gamma(1)'/gamma(1) - gamma(1/2)'/gamma(1/2) == 2*log(2). @@ -272,12 +341,13 @@ unsigned inifcns_consist(void) result += inifcns_consist_sin(); result += inifcns_consist_cos(); + result += inifcns_consist_tan(); result += inifcns_consist_trans(); result += inifcns_consist_gamma(); result += inifcns_consist_psi(); result += inifcns_consist_zeta(); - if ( !result ) { + if (!result) { cout << " passed "; clog << "(no output)" << endl; } else {