diff --git a/src/math.hpp b/src/math.hpp index 08d60ffdfe34fa420c4aecdb65c028acb41a7f59..de2665105c097ef10ca973969b5863930d1b43e6 100644 --- a/src/math.hpp +++ b/src/math.hpp @@ -78,7 +78,7 @@ T constexpr lerp(T a, T b, U u) { // Return -1, 0 or 1 according to sign of parameter. template <typename T> int signum(T x) { - return (x<T(0)) - (x>T(0)); + return (x>T(0)) - (x<T(0)); } // Quaternion implementation. diff --git a/tests/unit/test_math.cpp b/tests/unit/test_math.cpp index d281487fb97d3391d7bf2b94fc57e6aa3540bf6b..f4f12d91ccf4b1a8dcf5726768a2ac321df18ee9 100644 --- a/tests/unit/test_math.cpp +++ b/tests/unit/test_math.cpp @@ -112,6 +112,35 @@ TEST(math, infinity) { EXPECT_EQ(std::numeric_limits<long double>::infinity(), check.ld); } +TEST(math, signum) { + EXPECT_EQ(1, signum(1)); + EXPECT_EQ(1, signum(2)); + EXPECT_EQ(1, signum(3.f)); + EXPECT_EQ(1, signum(4.)); + + EXPECT_EQ(0, signum(0)); + EXPECT_EQ(0, signum(0.f)); + EXPECT_EQ(0, signum(0.)); + + EXPECT_EQ(-1, signum(-1)); + EXPECT_EQ(-1, signum(-2)); + EXPECT_EQ(-1, signum(-3.f)); + EXPECT_EQ(-1, signum(-4.)); + + double denorm = 1e-308; + EXPECT_EQ(1, signum(denorm)); + EXPECT_EQ(-1, signum(-denorm)); + + double negzero = std::copysign(0., -1.); + EXPECT_EQ(0, signum(negzero)); + + EXPECT_EQ(1, signum(infinity<double>())); + EXPECT_EQ(1, signum(infinity<float>())); + EXPECT_EQ(-1, signum(-infinity<double>())); + EXPECT_EQ(-1, signum(-infinity<float>())); +} + + TEST(quaternion, ctor) { // scalar quaternion q1(3.5);