From 3c72ae21ae10f3f3f379cc45ef145bc7d90feed7 Mon Sep 17 00:00:00 2001 From: Cyril SIX Date: Wed, 27 Feb 2019 12:06:09 +0100 Subject: Changing the way floats are compared (script using reltol and abstol comparison) --- test/mppa/instr/Makefile | 5 ++- test/mppa/instr/floatcmp.py | 93 +++++++++++++++++++++++++++++++++++++++++++++ test/mppa/instr/fmulw.c | 2 +- test/mppa/instr/framework.h | 4 +- 4 files changed, 99 insertions(+), 5 deletions(-) create mode 100755 test/mppa/instr/floatcmp.py (limited to 'test/mppa') diff --git a/test/mppa/instr/Makefile b/test/mppa/instr/Makefile index b4abb6a4..ea86114c 100644 --- a/test/mppa/instr/Makefile +++ b/test/mppa/instr/Makefile @@ -5,6 +5,7 @@ OPTIM ?= -O2 CFLAGS ?= $(OPTIM) SIMU ?= k1-mppa TIMEOUT ?= --signal=SIGTERM 120s +DIFF ?= python2.7 floatcmp.py -reltol .00001 DIR=./ SRCDIR=$(DIR) @@ -50,7 +51,7 @@ test: $(X86_GCC_OUT) $(GCC_OUT) @for test in $(TESTNAMES); do\ x86out=$(OUTDIR)/$$test.x86-gcc.out;\ gccout=$(OUTDIR)/$$test.gcc.out;\ - if diff -q $$x86out $$gccout > /dev/null; test $${PIPESTATUS[0]} -ne 0; then\ + if $(DIFF) $$x86out $$gccout > /dev/null; test $${PIPESTATUS[0]} -ne 0; then\ >&2 printf "$(RED)ERROR: $$x86out and $$gccout differ$(NC)\n";\ else\ printf "$(GREEN)GOOD: $$x86out and $$gccout concur$(NC)\n";\ @@ -63,7 +64,7 @@ check: $(GCC_OUT) $(CCOMP_OUT) @for test in $(TESTNAMES); do\ gccout=$(OUTDIR)/$$test.gcc.out;\ ccompout=$(OUTDIR)/$$test.ccomp.out;\ - if diff -q $$ccompout $$gccout > /dev/null; test $${PIPESTATUS[0]} -ne 0; then\ + if $(DIFF) $$ccompout $$gccout > /dev/null; test $${PIPESTATUS[0]} -ne 0; then\ >&2 printf "$(RED)ERROR: $$ccompout and $$gccout differ$(NC)\n";\ else\ printf "$(GREEN)GOOD: $$ccompout and $$gccout concur$(NC)\n";\ diff --git a/test/mppa/instr/floatcmp.py b/test/mppa/instr/floatcmp.py new file mode 100755 index 00000000..49f1bc13 --- /dev/null +++ b/test/mppa/instr/floatcmp.py @@ -0,0 +1,93 @@ +#!/usr/bin/python2.7 + +import argparse as ap +import sys + +parser = ap.ArgumentParser() +parser.add_argument("file1", help="First file to compare") +parser.add_argument("file2", help="Second file to compare") +parser.add_argument("-reltol", help="Relative error") +parser.add_argument("-abstol", help="Absolute error") +parser.add_argument("-s", help="Silent output", action="store_true") +args = parser.parse_args() + +reltol = float(args.reltol) if args.reltol else None +abstol = float(args.abstol) if args.abstol else None +silent = args.s + +if silent: + sys.stdout = open("/dev/null", "w") + +import re +from math import fabs + +def floatcmp(f1, f2): + if abstol: + if fabs(f1 - f2) > abstol: + return False + if reltol: + if f2 != 0. and fabs((f1 - f2) / f2) > reltol: + return False + return True + +class Parsed(list): + def __eq__(self, other): + if len(self) != len(other): + return False + comps = zip(self, other) + for comp in comps: + if all(isinstance(compElt, str) for compElt in comp): + if comp[0] != comp[1]: + return False + elif all (isinstance(compElt, float) for compElt in comp): + if not floatcmp(comp[0], comp[1]): + return False + else: + return False + return True + + def __ne__(self, other): + return not self.__eq__(other) + +parseLine = re.compile(r"\s*(\S+)") +def readline(line): + words = parseLine.findall(line) + parsed = Parsed([]) + for word in words: + try: + parse = float(word) + parsed.append(parse) + except ValueError: + parsed.append(word) + return parsed + +def readfile(filename): + L = [] + try: + with open(filename) as f: + for line in f: + L.append(readline(line)) + except IOError: + print "Unable to read {}".format(filename) + sys.exit(2) + return L + +L1 = readfile(args.file1) +L2 = readfile(args.file2) + +if len(L1) != len(L2): + print "The files have different amount of lines" + print "\t{}: {} lines".format(args.file1, len(L1)) + print "\t{}: {} lines".format(args.file2, len(L2)) + sys.exit(1) + +cmpL = zip(L1, L2) +for i, cmpElt in enumerate(cmpL): + if cmpElt[0] != cmpElt[1]: + print "The files differ at line {}".format(i) + print "\t{}: {}".format(args.file1, cmpElt[0]) + print "\t{}: {}".format(args.file2, cmpElt[1]) + sys.exit(1) + +print "Comparison succeeded" +sys.exit(0) diff --git a/test/mppa/instr/fmulw.c b/test/mppa/instr/fmulw.c index 030a6d9c..67d645c3 100644 --- a/test/mppa/instr/fmulw.c +++ b/test/mppa/instr/fmulw.c @@ -4,4 +4,4 @@ BEGIN_TEST(double) { c = ((float)a * (float)b); } -END_TESTF64() +END_TESTF32() diff --git a/test/mppa/instr/framework.h b/test/mppa/instr/framework.h index d4f36f6b..3bbfa271 100644 --- a/test/mppa/instr/framework.h +++ b/test/mppa/instr/framework.h @@ -46,7 +46,7 @@ /* END END_TEST32 */ #define END_TESTF32()\ - printf("%f\t%f\t%f\n", a, b, c);\ + printf("%e\t%e\t%e\n", a, b, c);\ S += c;\ }\ return 0;\ @@ -54,7 +54,7 @@ /* END END_TESTF32 */ #define END_TESTF64()\ - printf("%lf\t%lf\t%lf\n", a, b, c);\ + printf("%e\t%e\t%e\n", a, b, c);\ S += c;\ }\ return 0;\ -- cgit