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);