From 788d9a3def54b89012d4e01ca0aafab300196c40 Mon Sep 17 00:00:00 2001 From: Sam Yates <yates@cscs.ch> Date: Fri, 10 Mar 2017 08:43:53 +0100 Subject: [PATCH] Bugfix for issue #166: backwards `math::signum`. (#180) Fixes #166 Debackwardsate math::signum(). Unit tests in test_math.cpp for same. --- src/math.hpp | 2 +- tests/unit/test_math.cpp | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/math.hpp b/src/math.hpp index 08d60ffd..de266510 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 d281487f..f4f12d91 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); -- GitLab