diff --git a/src/lib/matrix/matrix/helper_functions.hpp b/src/lib/matrix/matrix/helper_functions.hpp index fa4e5c84ca9a..7426fdcf5754 100644 --- a/src/lib/matrix/matrix/helper_functions.hpp +++ b/src/lib/matrix/matrix/helper_functions.hpp @@ -152,10 +152,16 @@ Type unwrap_pi(const Type last_angle, const Type new_angle) return unwrap(last_angle, new_angle, Type(-M_PI), Type(M_PI)); } +/** + * Type-safe sign/signum function + * + * @param[in] val Number to take the sign from + * @return -1 if val < 0, 0 if val == 0, 1 if val > 0 + */ template int sign(T val) { - return (T(FLT_EPSILON) < val) - (val < T(FLT_EPSILON)); + return (T(0) < val) - (val < T(0)); } } // namespace matrix diff --git a/src/lib/matrix/test/MatrixHelperTest.cpp b/src/lib/matrix/test/MatrixHelperTest.cpp index 15da124aa17a..ec3062ff2f5a 100644 --- a/src/lib/matrix/test/MatrixHelperTest.cpp +++ b/src/lib/matrix/test/MatrixHelperTest.cpp @@ -36,6 +36,24 @@ using namespace matrix; +TEST(MatrixHelperTest, SignFloat) +{ + EXPECT_FLOAT_EQ(sign(-100.f), -1.f); + EXPECT_FLOAT_EQ(sign(-FLT_EPSILON), -1.f); + EXPECT_FLOAT_EQ(sign(0.f), 0.f); + EXPECT_FLOAT_EQ(sign(FLT_EPSILON), 1.f); + EXPECT_FLOAT_EQ(sign(100.f), 1.f); +} + +TEST(MatrixHelperTest, SignInt) +{ + EXPECT_FLOAT_EQ(sign(-100), -1); + EXPECT_FLOAT_EQ(sign(-1), -1); + EXPECT_FLOAT_EQ(sign(0), 0); + EXPECT_FLOAT_EQ(sign(1), 1); + EXPECT_FLOAT_EQ(sign(100), 1); +} + TEST(MatrixHelperTest, Helper) { // general wraps