X-Git-Url: https://git.ucc.asn.au/?p=ipdf%2Fcode.git;a=blobdiff_plain;f=src%2Ftests%2Frealops.cpp;h=4669f599591d684eb80ccd6cc205dc9273d5c98c;hp=61d747cb13e29e672c6d366203e325b2964d3c7f;hb=2d12d37f1657d6aef9bb80d735b6c7022aecba6e;hpb=ac518ad085eb5bc84647e4aebe0c5ff06640cd0d diff --git a/src/tests/realops.cpp b/src/tests/realops.cpp index 61d747c..4669f59 100644 --- a/src/tests/realops.cpp +++ b/src/tests/realops.cpp @@ -4,6 +4,7 @@ #include "main.h" #include "real.h" +#include "progressbar.h" using namespace std; using namespace IPDF; @@ -12,7 +13,7 @@ using namespace IPDF; static double g_totalerror = 0; -bool NotEqual(double a, double b, double threshold=1e-1) +bool NotEqual(double a, double b, double threshold=1e-4) { double error = fabs(a-b); g_totalerror += error; @@ -22,10 +23,15 @@ bool NotEqual(double a, double b, double threshold=1e-1) int main(int argc, char ** argv) { srand(time(NULL)); + DebugRealInfo(); unsigned failures = 0; + Real acumulate(0); + double dacumulate = 0; + for (unsigned i = 0; i < TEST_CASES; ++i) { + ProgressBar(i, TEST_CASES, 50); //Debug("Test %u of %u", i, TEST_CASES); double da = (double)(rand() + 1) / (double)(rand() + 1); double db = (double)(rand() + 1) / (double)(rand() + 1); @@ -115,7 +121,61 @@ int main(int argc, char ** argv) { failures++; Warn("a /= b = %f should be %f, a before op was %f", Double(a), da, Double(abeforeop)); + } + if (NotEqual(Double(a*0.0 + 1.0), da*0.0 + 1.0)) + { + failures++; + Warn("a * 0 = %f should be %f, a before op was %f", Double(a), da, Double(abeforeop)); } + + if (NotEqual(Double(a=b), da=db)) + { + failures++; + Warn("a = b = %f should be %f, a before op was %f", Double(a), da, Double(abeforeop)); + } + + if (NotEqual(Double(-a), -da)) + { + failures++; + Warn("-a = %f should be %f, a before op was %f", Double(-a), -da, Double(abeforeop)); + } + + if (NotEqual(Double(Sqrt(a)), Sqrt(da))) + { + failures++; + Warn("Sqrt(a) = %f should be %f, a before op was %f", Double(Sqrt(a)), Sqrt(da), Double(abeforeop)); + } + + if (NotEqual(Double(a), da)) + { + failures++; + Warn("a = %f, should be %f, a before ops was %f", Double(a), da, Double(abeforeop)); + } + + switch (rand() % 4) + { + case 0: + acumulate += a; + dacumulate += da; + break; + case 1: + acumulate -= a; + dacumulate -= da; + break; + case 2: + acumulate *= a; + dacumulate *= da; + break; + case 3: + acumulate /= a; + dacumulate /= da; + break; + } + if (NotEqual(Double(acumulate), dacumulate)) + { + Warn("Accumulated result %.30lf vs %.30lf is wrong", Double(acumulate), dacumulate); + failures++; + } if (failures > old_failures) { @@ -125,7 +185,10 @@ int main(int argc, char ** argv) #endif } } - Debug("Completed %u test cases with total of %u operations, %u failures", TEST_CASES, 12*TEST_CASES, failures); + Debug("Completed %u test cases with total of %u operations, %u failures", TEST_CASES, 18*TEST_CASES, failures); Debug("Total accumulated difference between Real and Double operations was %f", g_totalerror); + Debug("Real: %.40lf", Double(acumulate)); + Debug("Doub: %.40lf", dacumulate); + Debug("Diff: %.40lf", Double(acumulate) - dacumulate); }