From d81d2bf15161af6f5b670762c2c852f746a9ac7b Mon Sep 17 00:00:00 2001 From: Tyge Løvset Date: Fri, 19 Aug 2022 12:26:17 +0200 Subject: Some more fix to float comparison in stctest. --- include/stc/stctest.h | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) (limited to 'include') diff --git a/include/stc/stctest.h b/include/stc/stctest.h index 0b5ae4e2..b47080b6 100644 --- a/include/stc/stctest.h +++ b/include/stc/stctest.h @@ -65,7 +65,8 @@ #include #include -#define STCTEST_EPSILON 0.0000001 +#define STC_FLOAT_EPSILON 1e-7 +#define STC_DOUBLE_EPSILON 1e-13 #define EXPECT_TRUE(expr) \ @@ -80,15 +81,16 @@ #define EXPECT_FALSE(expr) EXPECT_TRUE(!(expr)) #define EXPECT_FALSE1(expr, v) EXPECT_TRUE1(!(expr), v) - /* NB! (char*) are compared as strings. Cast to (void*) to compare pointers only */ -#define EXPECT_EQ(a, b) _stctest_CHECK(a, ==, b, 0) -#define EXPECT_NE(a, b) _stctest_CHECK(a, !=, b, 0) -#define EXPECT_GT(a, b) _stctest_CHECK(a, >, b, 0) -#define EXPECT_LT(a, b) _stctest_CHECK(a, <, b, 0) -#define EXPECT_LE(a, b) _stctest_CHECK(a, <=, b, 0) -#define EXPECT_GE(a, b) _stctest_CHECK(a, >=, b, 0) -#define EXPECT_NEAR(a, b, epsilon) _stctest_CHECK(a, ==, b, epsilon) +#define EXPECT_EQ(a, b) _stctest_CHECK(a, ==, b, -STC_DOUBLE_EPSILON) +#define EXPECT_NE(a, b) _stctest_CHECK(a, !=, b, -STC_DOUBLE_EPSILON) +#define EXPECT_GT(a, b) _stctest_CHECK(a, >, b, -STC_DOUBLE_EPSILON) +#define EXPECT_LT(a, b) _stctest_CHECK(a, <, b, -STC_DOUBLE_EPSILON) +#define EXPECT_LE(a, b) _stctest_CHECK(a, <=, b, -STC_DOUBLE_EPSILON) +#define EXPECT_GE(a, b) _stctest_CHECK(a, >=, b, -STC_DOUBLE_EPSILON) +#define EXPECT_FLOAT_EQ(a, b) _stctest_CHECK((double)(a), ==, (double)(b), -STC_FLOAT_EPSILON) +#define EXPECT_DOUBLE_EQ(a, b) _stctest_CHECK((double)(a), ==, (double)(b), -STC_DOUBLE_EPSILON) +#define EXPECT_NEAR(a, b, abs_error) _stctest_CHECK((double)(a), ==, (double)(b), abs_error) /* Run a test() function */ #define RUN_TEST(test, ...) do { \ @@ -116,7 +118,7 @@ const char*: _stctest_strcmp, char*: _stctest_strcmp, \ double: _Generic((b), double: _stctest_dblcmp, float: _stctest_dblcmp, default: _stctest_valcmp), \ float: _Generic((b), double: _stctest_dblcmp, float: _stctest_dblcmp, default: _stctest_valcmp), \ - default: _stctest_valcmp)((a) OP (b), #OP, a, b, (double)e) + default: _stctest_valcmp)((a) OP (b), #OP, a, b, (double)(e)) #define _stctest_FMT(a) _Generic((a), \ float: "%.7gf", double: "%.14g", \ @@ -154,8 +156,7 @@ static int _stctest_dblcmp(int res, const char* OP, ...) { va_end(ap); if (OP[0] == '<') return OP[1] == '=' ? c <= 0 : c < 0; if (OP[0] == '>') return OP[1] == '=' ? c >= 0 : c > 0; - return (OP[0] == '!') ^ (e > 0 ? (c < 0 ? -c : c) < e - : approximately_equal(a, b, STCTEST_EPSILON)); + return (OP[0] == '!') ^ (e < 0 ? approximately_equal(a, b, -e) : (c < 0 ? -c : c) < e); } static int _stctest_valcmp(int res, const char* OP, ...) -- cgit v1.2.3