X-Git-Url: https://git.ucc.asn.au/?p=ipdf%2Fcode.git;a=blobdiff_plain;f=src%2Ftests%2Frealops.cpp;fp=src%2Ftests%2Frealops.cpp;h=0aeeeb6189fca90a9d3e65a0f8f9d5534d3b5db0;hp=2ccba67c758627eb3903a38e453d395306cf1593;hb=a182cbba4fe9e6a36c5063735dbec1c5340da04c;hpb=04e65d814fe15a17040a701d46ae669cc9dcd3d8 diff --git a/src/tests/realops.cpp b/src/tests/realops.cpp index 2ccba67..0aeeeb6 100644 --- a/src/tests/realops.cpp +++ b/src/tests/realops.cpp @@ -4,23 +4,91 @@ using namespace std; using namespace IPDF; +#define TEST_CASES 100 + +bool NotEqual(double a, double b, double threshold=1e-4) +{ + return (fabs(a-b) > threshold); +} int main(int argc, char ** argv) { srand(time(NULL)); - Real a = Random(100); - Real b = Random(100); - Debug("a = %f", Float(a)); - Debug("b = %f", Float(b)); - Debug("a + b = %f", Float(a + b)); - Debug("a - b = %f", Float(a - b)); - Debug("a * b = %f", Float(a * b)); - Debug("a / b = %f", Float(a / b)); - Debug("a += b => %f", Float(a += b)); - Debug("a -= b => %f", Float(a -= b)); - Debug("a *= b => %f", Float(a *= b)); - Debug("a /= b => %f", Float(a /= b)); - Debug("a = %f", Float(a)); - Debug("b = %f", Float(b)); + + unsigned failures = 0; + for (unsigned i = 0; i < TEST_CASES; ++i) + { + double da = (double)(rand()) / (double)(rand()); + double db = (double)(rand()) / (double)(rand()); + + Real a(da); + Real b(db); + + + + if (NotEqual(Double(a), da)) + { + failures++; + Warn("a != da; %f vs %f", Double(a), da); + } + if (NotEqual(Double(b), db)) + { + failures++; + Warn("b != db; %f vs %f", Double(b), db); + } + if (NotEqual(Double(a+b), da+db)) + { + failures++; + Warn("a + b = %f should be %f", Double(a+b), da+db); + } + if (NotEqual(Double(a-b), da-db)) + { + failures++; + Warn("a - b = %f should be %f", Double(a-b), da-db); + } + if (NotEqual(Double(a*b), da*db)) + { + failures++; + Warn("a * b = %f should be %f", Double(a*b), da*db); + } + if (NotEqual(Double(a/b), da/db)) + { + failures++; + Warn("a / b = %f should be %f", Double(a/b), da/db); + } + + if (NotEqual(Double(a), da)) + { + failures++; + Warn("a has changed after +-*/ from %f to %f", da, Double(a)); + } + if (NotEqual(Double(b), db)) + { + failures++; + Warn("b has changed after +-*/ from %f to %f", db, Double(b)); + } + + if (NotEqual(Double(a+=b), da+=db)) + { + failures++; + Warn("a += b = %f should be %f", Double(a), da); + } + if (NotEqual(Double(a-=b), da-=db)) + { + failures++; + Warn("a -= b = %f should be %f", Double(a), da); + } + if (NotEqual(Double(a*=b), da*=db)) + { + failures++; + Warn("a *= b = %f should be %f", Double(a), da); + } + if (NotEqual(Double(a/=b), da/=db)) + { + failures++; + Warn("a /= b = %f should be %f", Double(a), da); + } + } + Debug("Completed %u test cases with total of %u operations, %u failures", TEST_CASES, 12*TEST_CASES, failures); }