diff --git a/RTCP/Cobalt/GPUProc/test/cmpfloat.cc b/RTCP/Cobalt/GPUProc/test/cmpfloat.cc index b1710838ff9323fcdd3e3cc69294835aa4d82f17..136d2a8e03604ad20810ffdcba2c7b4f3979512c 100644 --- a/RTCP/Cobalt/GPUProc/test/cmpfloat.cc +++ b/RTCP/Cobalt/GPUProc/test/cmpfloat.cc @@ -26,8 +26,8 @@ #include <vector> #include <iostream> #include <fstream> -#include <sstream> #include <limits> +#include <boost/lexical_cast.hpp> #include "fpequals.h" @@ -36,7 +36,7 @@ namespace { using namespace std; using LOFAR::Cobalt::fpEquals; -struct args { +struct Args { string filename1; string filename2; enum type {FLOAT, DOUBLE, CFLOAT, CDOUBLE} type; @@ -58,7 +58,7 @@ void pr_usage(const char* progname) { cerr << " --verbose print some info to stdout, regardless of exit status" << endl; } -bool parseArgs(int argc, char *argv[], struct args &args) { +bool parseArgs(int argc, char *argv[], Args &args) { // defaults args.type = args.DOUBLE; args.skip = 0; @@ -105,30 +105,33 @@ bool parseArgs(int argc, char *argv[], struct args &args) { } } else if (opt.compare(0, skipPrefix.size(), skipPrefix) == 0) { val = opt.erase(0, skipPrefix.size()); - istringstream iss(val); - iss >> args.skip; - if (!iss.eof() || (ssize_t)args.skip < 0) { + try { + args.skip = boost::lexical_cast<size_t>(val); + if ((ssize_t)args.skip < 0) + throw boost::bad_lexical_cast(); + } catch (boost::bad_lexical_cast& exc) { cerr << "Error: invalid value in --skip argument: " << val << endl; ok = false; } } else if (opt.compare(0, sizePrefix.size(), sizePrefix) == 0) { val = opt.erase(0, sizePrefix.size()); - istringstream iss(val); - iss >> args.nvals; - if (!iss.eof() || (ssize_t)args.nvals < 0) { + try { + args.nvals = boost::lexical_cast<size_t>(val); + if ((ssize_t)args.nvals < 0) + throw boost::bad_lexical_cast(); + } catch (boost::bad_lexical_cast& exc) { cerr << "Error: invalid value in --size argument: " << val << endl; ok = false; } } else if (opt.compare(0, epsilonPrefix.size(), epsilonPrefix) == 0) { val = opt.erase(0, epsilonPrefix.size()); - istringstream iss(val); - iss >> args.epsilon; - if (!iss.eof()) { + try { + args.epsilon = boost::lexical_cast<double>(val); + args.epsilon = std::abs(args.epsilon); + epsSet = true; + } catch (boost::bad_lexical_cast& exc) { cerr << "Error: invalid value in --epsilon argument: " << val << endl; ok = false; - } else { - std::abs(args.epsilon); - epsSet = true; } } else if (opt == verbosePrefix) { args.verbose = true; @@ -159,7 +162,7 @@ bool compareValues(T v1, T v2, double epsilon, size_t pos, T factor = v2 / v1; // inf is fine, NaN if eps was set to 0 or odd data if (maxFactor == T(1.0)) { - // first unequal val + // first unequal val, so 1.0 must be as initialized (not a factor) maxFactor = minFactor = factor; } else if (factor > maxFactor) { maxFactor = factor; @@ -184,7 +187,7 @@ bool compareValues(complex<T> v1, complex<T> v2, double epsilon, size_t pos, T realFactor = v2.real() / v1.real(); // idem as above T imagFactor = v2.imag() / v1.imag(); // idem if (maxFactors == T(1.0)) { - // first unequal val + // first unequal val, so 1.0 must be as initialized (not a factor) maxFactors.real() = minFactors.real() = realFactor; maxFactors.imag() = minFactors.imag() = imagFactor; } else { @@ -209,7 +212,7 @@ bool compareValues(complex<T> v1, complex<T> v2, double epsilon, size_t pos, template <typename T> void printCommonFactorMessage(const T& maxFactor, const T& minFactor) { // If maxFactor and minFactor are near, then the diff is probably scale only. - const T facEps = (T)1e-1; // very loose as values can be of any magnitude + const T facEps = (T)1e-1; // very loose as values can be of any magnitude (but too loose if no scale, yet min and max < 1e-1. The program then still exits non-zero, but possibly with the wrong message.) bool eq = fpEquals(maxFactor, minFactor, facEps); T avgFac; if (eq) { @@ -258,8 +261,8 @@ bool compareStreams(ifstream& ifs1, ifstream& ifs2, size_t skipped, bool ok = true; cerr.precision(17); // print full double precision on errors - T maxFactor = T(1.0); - T minFactor = T(1.0); + T maxFactor = T(1.0); // cmp needs init; 1.0 is not a valid unequality factor + T minFactor = T(1.0); // symmetry / good practice, but not used size_t i; for (i = 0; i < nvals; i++) { @@ -304,7 +307,7 @@ bool compareStreams(ifstream& ifs1, ifstream& ifs2, size_t skipped, } // anon namespace int main(int argc, char *argv[]) { - struct args args; + Args args; if (!parseArgs(argc, argv, args)) { cerr << endl; pr_usage(argv[0]); diff --git a/RTCP/Cobalt/GPUProc/test/tcmpfloat.sh b/RTCP/Cobalt/GPUProc/test/tcmpfloat.sh index 7d994def23a4dd319b8161d6f527c0b6482d04a7..19430dd8d984f696462e002db7f2995bfa172935 100755 --- a/RTCP/Cobalt/GPUProc/test/tcmpfloat.sh +++ b/RTCP/Cobalt/GPUProc/test/tcmpfloat.sh @@ -66,6 +66,6 @@ echo "Test 9" ./cmpfloat --skip=8 --size=4 tcmpfloat-9.1.bin tcmpfloat-9.2.bin if [ $? -ne 1 ]; then echo "TEST ERROR: Test 9 (file too short after skip) failed"; status=1; fi -if [ $status -eq 0 ]; then echo "\nAll tcmpfloat tests PASSED"; fi +if [ $status -eq 0 ]; then echo -e "\nAll tcmpfloat tests PASSED"; fi exit $status