#include "main.h"
#include "real.h"
+#include "progressbar.h"
using namespace std;
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;
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);
{
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)
{
#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);
}