Бранимир Караџић 1 year ago
parent
commit
d588a8fb0e
4 changed files with 19 additions and 17 deletions
  1. 14 0
      include/bx/inline/math.inl
  2. 2 2
      include/bx/math.h
  3. 1 15
      src/math.cpp
  4. 2 0
      tests/math_test.cpp

+ 14 - 0
include/bx/inline/math.inl

@@ -227,6 +227,20 @@ namespace bx
 		return log(_a) * kInvLogNat2;
 	}
 
+	inline BX_CONSTEXPR_FUNC float ldexp(float _a, int32_t _b)
+	{
+		const uint32_t ftob     = floatToBits(_a);
+		const uint32_t masked   = uint32_and(ftob, kFloatSignMask | kFloatExponentMask);
+		const uint32_t expsign0 = uint32_sra(masked, kFloatExponentBitShift);
+		const uint32_t tmp      = uint32_iadd(expsign0, _b);
+		const uint32_t expsign1 = uint32_sll(tmp, kFloatExponentBitShift);
+		const uint32_t mantissa = uint32_and(ftob, kFloatMantissaMask);
+		const uint32_t bits     = uint32_or(mantissa, expsign1);
+		const float    result   = bitsToFloat(bits);
+
+		return result;
+	}
+
 	template<>
 	inline BX_CONSTEXPR_FUNC uint8_t countBits(uint32_t _val)
 	{

+ 2 - 2
include/bx/math.h

@@ -254,9 +254,9 @@ namespace bx
 	///
 	BX_CONST_FUNC float pow(float _a, float _b);
 
-	/// Returns the result of multiplying _a by 2 raised to the power of the exponent.
+	/// Returns the result of multiplying _a by 2 raised to the power of the exponent `_a * (2^_b)`.
 	///
-	BX_CONST_FUNC float ldexp(float _a, int32_t _b);
+	BX_CONSTEXPR_FUNC float ldexp(float _a, int32_t _b);
 
 	/// Returns decomposed given floating point value _a into a normalized fraction and
 	/// an integral power of two.

+ 1 - 15
src/math.cpp

@@ -130,25 +130,11 @@ namespace bx
 		return result;
 	}
 
-	BX_CONST_FUNC float ldexp(float _a, int32_t _b)
-	{
-		const uint32_t ftob     = floatToBits(_a);
-		const uint32_t masked   = uint32_and(ftob, kFloatSignMask | kFloatExponentMask);
-		const uint32_t expsign0 = uint32_sra(masked, 23);
-		const uint32_t tmp      = uint32_iadd(expsign0, _b);
-		const uint32_t expsign1 = uint32_sll(tmp, 23);
-		const uint32_t mantissa = uint32_and(ftob, kFloatMantissaMask);
-		const uint32_t bits     = uint32_or(mantissa, expsign1);
-		const float    result   = bitsToFloat(bits);
-
-		return result;
-	}
-
 	float frexp(float _a, int32_t* _outExp)
 	{
 		const uint32_t ftob     = floatToBits(_a);
 		const uint32_t masked0  = uint32_and(ftob, kFloatExponentMask);
-		const uint32_t exp0     = uint32_srl(masked0, 23);
+		const uint32_t exp0     = uint32_srl(masked0, kFloatExponentBitShift);
 		const uint32_t masked1  = uint32_and(ftob,   kFloatSignMask | kFloatMantissaMask);
 		const uint32_t bits     = uint32_or(masked1, UINT32_C(0x3f000000) );
 		const float    result   = bitsToFloat(bits);

+ 2 - 0
tests/math_test.cpp

@@ -457,6 +457,8 @@ TEST_CASE("fract", "[math][libm]")
 
 TEST_CASE("ldexp", "[math][libm]")
 {
+	STATIC_REQUIRE(1389.0f == bx::ldexp(86.8125, 4) );
+
 	bx::WriterI* writer = bx::getNullOut();
 	bx::Error err;