Arbint now does sign in division correctly
authorSam Moore <matches@ucc.asn.au>
Sun, 6 Jul 2014 12:30:40 +0000 (20:30 +0800)
committerSam Moore <matches@ucc.asn.au>
Sun, 6 Jul 2014 12:30:40 +0000 (20:30 +0800)
The tester still sometimes picks up a fith Rational<Arbint> /= operation though.

src/arbint.cpp
src/rational.h
src/tests/realops.cpp

index 59e2252..4bde578 100644 (file)
@@ -127,6 +127,7 @@ void Arbint::Division(const Arbint & div, Arbint & result, Arbint & remainder) c
                        result.BitSet(i);
                }
        }
+       result.m_sign = !(m_sign == div.m_sign);
 }
 
 Arbint & Arbint::operator+=(const Arbint & add)
@@ -265,7 +266,7 @@ Arbint & Arbint::operator>>=(unsigned amount)
        
        if (whole >= old_size)
        {
-               m_digits.resize(1);
+               m_digits.resize(1,0L);
                m_digits[0] = 0L;
                return *this;
        }
index e74567d..53f7d02 100644 (file)
@@ -73,10 +73,6 @@ struct Rational
        Rational(double d=0) : P(d*1e6), Q(1e6) // Possibly the worst thing ever...
        {
                Simplify();
-               //if (!CheckAccuracy(d, "Construct from double"))
-               {
-                       //Fatal("Bwah bwah :(");
-               }
        }
 
        Rational(const T & _P, const T & _Q) : P(_P), Q(_Q)
index 8076a14..400ce86 100644 (file)
@@ -6,9 +6,13 @@ using namespace IPDF;
 
 #define TEST_CASES 100
 
-bool NotEqual(double a, double b, double threshold=1e-2)
+static double g_totalerror = 0;
+
+bool NotEqual(double a, double b, double threshold=1e-1)
 {
-       return (fabs(a-b) > threshold);
+       double error = (fabs(a-b) > threshold);
+       g_totalerror += error;
+       return (error > threshold);
 }
 
 int main(int argc, char ** argv)
@@ -117,5 +121,6 @@ int main(int argc, char ** argv)
                }
        }
        Debug("Completed %u test cases with total of %u operations, %u failures", TEST_CASES, 12*TEST_CASES, failures);
+       Debug("Total accumulated difference between Real and Double operations was %f", g_totalerror);
 
 }

UCC git Repository :: git.ucc.asn.au