Explorar o código

Removing reliance on floorf and ceilf CRT functions.

Branimir Karadžić %!s(int64=8) %!d(string=hai) anos
pai
achega
fd8cc08fdb
Modificáronse 4 ficheiros con 40 adicións e 13 borrados
  1. 11 1
      include/bx/inline/math.inl
  2. 3 0
      include/bx/math.h
  3. 12 6
      src/math.cpp
  4. 14 6
      tests/math_test.cpp

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

@@ -97,6 +97,11 @@ namespace bx
 		return ffloor(_f + 0.5f);
 	}
 
+	inline float fceil(float _a)
+	{
+		return -ffloor(-_a);
+	}
+
 	inline float flerp(float _a, float _b, float _t)
 	{
 		return _a + (_b - _a) * _t;
@@ -132,9 +137,14 @@ namespace bx
 		return 1.0f/fsqrt(_a);
 	}
 
+	inline float ftrunc(float _a)
+	{
+		return float(int(_a) );
+	}
+
 	inline float ffract(float _a)
 	{
-		return _a - ffloor(_a);
+		return _a - ftrunc(_a);
 	}
 
 	inline float fmod(float _a, float _b)

+ 3 - 0
include/bx/math.h

@@ -140,6 +140,9 @@ namespace bx
 	///
 	float frsqrt(float _a);
 
+	///
+	float ftrunc(float _a);
+
 	///
 	float ffract(float _a);
 

+ 12 - 6
src/math.cpp

@@ -67,14 +67,20 @@ namespace bx
 		return ::sqrtf(_a);
 	}
 
-	float ffloor(float _f)
+	float ffloor(float _a)
 	{
-		return ::floorf(_f);
-	}
+		if (_a < 0.0f)
+		{
+			const float fr = ffract(-_a);
+			float result = -_a - fr;
 
-	float fceil(float _f)
-	{
-		return ::ceilf(_f);
+			return -(0.0f != fr
+				? result + 1.0f
+				: result)
+				;
+		}
+
+		return _a - ffract(_a);
 	}
 
 	void mtxLookAtImpl(float* _result, const float* _eye, const float* _view, const float* _up)

+ 14 - 6
tests/math_test.cpp

@@ -32,18 +32,26 @@ TEST_CASE("flog2", "")
 	flog2_test(256.0f);
 }
 
-TEST_CASE("fmod", "")
-{
-	REQUIRE(389.0f == bx::fmod(1389.0f, 1000.0f) );
-	REQUIRE(bx::isNan(bx::fmod(0.0f, 0.0f) ) );
-}
 
-TEST_CASE("fabs", "")
+TEST_CASE("libm", "")
 {
 	REQUIRE(1389.0f == bx::fabs(-1389.0f) );
 	REQUIRE(1389.0f == bx::fabs( 1389.0f) );
 	REQUIRE(   0.0f == bx::fabs(-0.0f) );
 	REQUIRE(   0.0f == bx::fabs( 0.0f) );
+
+	REQUIRE(389.0f == bx::fmod(1389.0f, 1000.0f) );
+	REQUIRE(bx::isNan(bx::fmod(0.0f, 0.0f) ) );
+
+	REQUIRE( 13.0f == bx::ffloor( 13.89f) );
+	REQUIRE(-14.0f == bx::ffloor(-13.89f) );
+	REQUIRE( 14.0f == bx::fceil(  13.89f) );
+	REQUIRE(-13.0f == bx::fceil( -13.89f) );
+
+	REQUIRE( 13.0f == bx::ftrunc( 13.89f) );
+	REQUIRE(-13.0f == bx::ftrunc(-13.89f) );
+	REQUIRE(bx::fequal( 0.89f, bx::ffract( 13.89f), 0.000001f) );
+	REQUIRE(bx::fequal(-0.89f, bx::ffract(-13.89f), 0.000001f) );
 }
 
 TEST_CASE("ToBits", "")