Bläddra i källkod

Fixed bx::sign function to return tri-state result.

Бранимир Караџић 3 år sedan
förälder
incheckning
7929f098f5
3 ändrade filer med 13 tillägg och 2 borttagningar
  1. 1 1
      include/bx/inline/math.inl
  2. 5 1
      include/bx/math.h
  3. 7 0
      tests/math_test.cpp

+ 1 - 1
include/bx/inline/math.inl

@@ -135,7 +135,7 @@ namespace bx
 
 	inline BX_CONSTEXPR_FUNC float sign(float _a)
 	{
-		return _a < 0.0f ? -1.0f : 1.0f;
+		return (0.0f < _a) - (0.0f > _a);
 	}
 
 	inline BX_CONSTEXPR_FUNC float abs(float _a)

+ 5 - 1
include/bx/math.h

@@ -205,7 +205,11 @@ namespace bx
 	///
 	BX_CONSTEXPR_FUNC float invLerp(float _a, float _b, float _value);
 
-	/// Returns the sign of _a.
+	/// Extracts the sign of value `_a`.
+	///
+	/// @param[in] _a Value.
+	///
+	/// @returns -1 if `_a` less than zero, 0 if `_a` is equal to 0, or +1 if `_a` is greater than zero.
 	///
 	BX_CONSTEXPR_FUNC float sign(float _a);
 

+ 7 - 0
tests/math_test.cpp

@@ -210,6 +210,13 @@ TEST_CASE("libm", "")
 	REQUIRE(bx::isEqual(bx::atan2(0.0f, 0.0f), ::atan2f(0.0f, 0.0f), 0.00001f) );
 }
 
+TEST_CASE("sign", "")
+{
+	REQUIRE(-1 == bx::sign(-0.1389f) );
+	REQUIRE( 0 == bx::sign( 0.0000f) );
+	REQUIRE( 1 == bx::sign( 0.1389f) );
+}
+
 TEST_CASE("ToBits", "")
 {
 	REQUIRE(UINT32_C(0x12345678)         == bx::floatToBits( bx::bitsToFloat( UINT32_C(0x12345678) ) ) );