]> www.ginac.de Git - ginac.git/blobdiff - check/exam_paranoia.cpp
- added check for normal((b*a-c*a)/(4-a)) bug
[ginac.git] / check / exam_paranoia.cpp
index 7ad2cad9262dc9fbc7a55b3f8eea95a4160cfb21..6fe0f0972924872b7508482748c551e2787e5520 100644 (file)
@@ -220,8 +220,8 @@ static unsigned exam_paranoia8(void)
             clog << "normal(-x/(x+1)) returns " << f << " instead of -x/(x+1)\n";
             ++result;
         }
-    } catch (const exception &e) {
-        clog << "normal(-x/(x+1) throws " << e.what() << endl;
+    } catch (const exception &err) {
+        clog << "normal(-x/(x+1) throws " << err.what() << endl;
         ++result;
     }
     return result;
@@ -265,8 +265,8 @@ static unsigned exam_paranoia10(void)
             clog << "2^(3/2) erroneously returned " << r << " instead of 2*sqrt(2)" << endl;
             ++result;
         }
-    } catch (const exception &e) {
-        clog << "2^(3/2) throws " << e.what() << endl;
+    } catch (const exception &err) {
+        clog << "2^(3/2) throws " << err.what() << endl;
         ++result;
     }
     return result;
@@ -292,6 +292,44 @@ static unsigned exam_paranoia11(void)
     return result;
 }
 
+// This one returned 0 because add::normal() incorrectly assumed that if the
+// common denominator is 1, all the denominators would be 1 (they can in fact
+// be +/-1). Fixed on Aug 2nd 2000.
+static unsigned exam_paranoia12(void)
+{
+    unsigned result = 0;
+       symbol x("x");
+
+       ex e = 2-2*(1+x)/(-1-x);
+       ex f = e.normal();
+       ex d = 4;
+
+       if (!(f - d).expand().is_zero()) {
+               clog << "normal(" << e << ") returns " << f
+             << " instead of " << d << endl;
+               ++result;
+       }
+       return result;
+}
+
+// This one caused a division by 0 because heur_gcd() didn't check its
+// input polynomials against 0. Fixed on Aug 4th 2000.
+static unsigned exam_paranoia13(void)
+{
+    unsigned result = 0;
+       symbol a("a"), b("b"), c("c");
+
+       ex e = (b*a-c*a)/(4-a);
+       ex f = e.normal();
+       ex d = (c*a-b*a)/(a-4);
+
+       if (!(f - d).expand().is_zero()) {
+               clog << "normal(" << e << ") returns " << f << " instead of " << d << endl;
+               ++result;
+       }
+       return result;
+}
+
 unsigned exam_paranoia(void)
 {
     unsigned result = 0;
@@ -310,6 +348,8 @@ unsigned exam_paranoia(void)
     result += exam_paranoia9();  cout << '.' << flush;
     result += exam_paranoia10();  cout << '.' << flush;
     result += exam_paranoia11();  cout << '.' << flush;
+    result += exam_paranoia12();  cout << '.' << flush;
+    result += exam_paranoia13();  cout << '.' << flush;
     
     if (!result) {
         cout << " passed " << endl;