* tests on these numbers like is_integer() etc... */
/*
- * GiNaC Copyright (C) 1999-2001 Johannes Gutenberg University Mainz, Germany
+ * GiNaC Copyright (C) 1999-2007 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
*
* 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 "checks.h"
-
-#ifndef NO_NAMESPACE_GINAC
+#include <iostream>
+#include <cstdlib> // rand()
+#include "ginac.h"
+using namespace std;
using namespace GiNaC;
-#endif // ndef NO_NAMESPACE_GINAC
/* Simple and maybe somewhat pointless consistency tests of assorted tests and
* conversions. */
-static unsigned check_numeric1(void)
+static unsigned check_numeric1()
{
unsigned result = 0;
bool errorflag = false;
return result;
}
-static unsigned check_numeric2(void)
+static unsigned check_numeric2()
{
unsigned result = 0;
bool errorflag = false;
int i_num, i_den;
// Check non-nested radicals (n/d)^(m/n) in ex wrapper class:
- for (int i=0; i<200; ++i) { // FIXME: run to ~200
+ for (int i=0; i<200; ++i) {
for (int j=2; j<13; ++j) {
// construct an exponent 1/j...
numeric nm(1,j);
nm += numeric(int(20.0*rand()/(RAND_MAX+1.0))-10);
// ...a numerator...
- do { i_num = rand(); } while (i_num == 0);
+ do {
+ i_num = rand();
+ } while (i_num<=0);
numeric num(i_num);
// ...and a denominator.
- do { i_den = (rand())/100; } while (i_den == 0);
+ do {
+ i_den = (rand())/100;
+ } while (i_den<=0);
numeric den(i_den);
// construct the radicals:
ex radical = pow(ex(num)/ex(den),ex(nm));
numeric floating = pow(num/den,nm);
// test the result:
- if (is_ex_of_type(radical,numeric)) {
- clog << "(" << num << "/" << den << ")^(" << nm
- << ") should have been a product, instead it's "
- << radical << endl;
- errorflag = true;
+ if (is_a<numeric>(radical)) {
+ // This is very improbable with decent random numbers but it
+ // still can happen, so we better check if it is correct:
+ if (pow(radical,inverse(nm))==num/den) {
+ // Aha! We drew some lucky numbers. Nothing to see here...
+ } else {
+ clog << "(" << num << "/" << den << ")^(" << nm
+ << ") should have been a product, instead it's "
+ << radical << endl;
+ errorflag = true;
+ }
}
- numeric ratio = ex_to_numeric(evalf(radical))/floating;
+ numeric ratio = abs(ex_to<numeric>(evalf(radical))/floating);
if (ratio>1.0001 && ratio<0.9999) {
clog << "(" << num << "/" << den << ")^(" << nm
<< ") erroneously evaluated to " << radical;
return result;
}
-unsigned check_numeric(void)
+unsigned check_numeric()
{
unsigned result = 0;
result += check_numeric1(); cout << '.' << flush;
result += check_numeric2(); cout << '.' << flush;
- if (!result) {
- cout << " passed " << endl;
- clog << "(no output)" << endl;
- } else {
- cout << " failed " << endl;
- }
-
return result;
}
+
+int main(int argc, char** argv)
+{
+ return check_numeric();
+}