From 362bda722f173383837276cecedfc8f7ef5618c7 Mon Sep 17 00:00:00 2001 From: Martin Krulis Date: Fri, 5 Apr 2019 17:01:27 +0200 Subject: [PATCH] Fixing bug in numeric comparator of recodex token judge. --- judges/recodex_token_judge/comparator.hpp | 6 +++++- judges/recodex_token_judge/recodex-token-judge.cpp | 2 +- judges/recodex_token_judge/tests/05-numeric.bats | 2 +- judges/recodex_token_judge/tests/05.correct.in | 1 + judges/recodex_token_judge/tests/05.error.out | 12 +++++++----- judges/recodex_token_judge/tests/05.result.in | 1 + 6 files changed, 16 insertions(+), 8 deletions(-) diff --git a/judges/recodex_token_judge/comparator.hpp b/judges/recodex_token_judge/comparator.hpp index 8e951524..67fdd8ba 100644 --- a/judges/recodex_token_judge/comparator.hpp +++ b/judges/recodex_token_judge/comparator.hpp @@ -185,7 +185,11 @@ template class TokenComp double d1, d2; if (tokenPair.tryGetFloats(d1, d2)) { - double err = std::abs(d1 - d2) / std::abs(d1 + d2); + // Divisor (normalizer) must not be zero, so we apply lower bound on it. + double divisorLimit = std::max(mFloatTolerance, 0.0001); + double divisor = std::max(std::abs(d1) + std::abs(d2), divisorLimit); + + double err = std::abs(d1 - d2) / divisor; return err <= mFloatTolerance; } } diff --git a/judges/recodex_token_judge/recodex-token-judge.cpp b/judges/recodex_token_judge/recodex-token-judge.cpp index 6ca136ce..5435437a 100644 --- a/judges/recodex_token_judge/recodex-token-judge.cpp +++ b/judges/recodex_token_judge/recodex-token-judge.cpp @@ -39,7 +39,7 @@ int main(int argc, char *argv[]) args.registerArg(bpp::make_unique( "numeric", "Tokens which appear to be integers or floats in decimal notation are compared as numbers.")); args.registerArg(bpp::make_unique("float-tolerance", - "Allowed maximal error for float number comparisons. The error of two numbers is |a-b|/|a+b|.", + "Allowed maximal error for float number comparisons. The error of two numbers is |a-b|/(|a|+|b|).", false, 0.0001, 0.0, diff --git a/judges/recodex_token_judge/tests/05-numeric.bats b/judges/recodex_token_judge/tests/05-numeric.bats index 149880b3..f6c3a744 100644 --- a/judges/recodex_token_judge/tests/05-numeric.bats +++ b/judges/recodex_token_judge/tests/05-numeric.bats @@ -15,6 +15,6 @@ load bats-shared } @test "numeric float tolerance" { - run $EXE_FILE --numeric --float-tolerance 0.01 $CORRECT_FILE $RESULT_FILE + run $EXE_FILE --numeric --float-tolerance 0.001 $CORRECT_FILE $RESULT_FILE [ "$status" -eq 1 ] } diff --git a/judges/recodex_token_judge/tests/05.correct.in b/judges/recodex_token_judge/tests/05.correct.in index f9d8c7f6..2587aaf1 100644 --- a/judges/recodex_token_judge/tests/05.correct.in +++ b/judges/recodex_token_judge/tests/05.correct.in @@ -1,3 +1,4 @@ some string tokens followed by numeric tokens 42 1000000000 +54 -19 0012 and some float tokens 1.0 1.1 0.001 -0.0002 0.00003 +0 diff --git a/judges/recodex_token_judge/tests/05.error.out b/judges/recodex_token_judge/tests/05.error.out index dfc9adb3..2d61712d 100644 --- a/judges/recodex_token_judge/tests/05.error.out +++ b/judges/recodex_token_judge/tests/05.error.out @@ -1,5 +1,7 @@ -0 --2: followed by numeric tokens 42 1000000000 +54 -19 0012 -+2: followed by numeric tokens 42 +1000000000 0054 -19.0 12 --3: and some float tokens 1.0 1.1 0.001 -0.0002 0.00003 -+3: and some float tokens +1.0 1.100 1e-03 -0.0002 0.000031 +0 +-2: followed by numeric tokens 42 1000000000 +54 -19 0012 ++2: followed by numeric tokens 42 +1000000000 0054 -19.0 12 +-3: and some float tokens 1.0 1.1 0.001 -0.0002 0.00003 ++3: and some float tokens +1.0 1.100 1e-03 -0.0002 0.000031 +-4: 0 ++4: 0.00 diff --git a/judges/recodex_token_judge/tests/05.result.in b/judges/recodex_token_judge/tests/05.result.in index efe3af2a..4584325c 100644 --- a/judges/recodex_token_judge/tests/05.result.in +++ b/judges/recodex_token_judge/tests/05.result.in @@ -1,3 +1,4 @@ some string tokens followed by numeric tokens 42 +1000000000 0054 -19.0 12 and some float tokens +1.0 1.100 1e-03 -0.0002 0.000031 +0.00