From 7014882dcdb05df5645ff2912de1c2f7518e0510 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D1=80=D0=B0=D0=BD=D0=B8=D0=BC=D0=B8=D1=80=20=D0=9A?= =?UTF-8?q?=D0=B0=D1=80=D0=B0=D1=9F=D0=B8=D1=9B?= Date: Sat, 23 Nov 2024 20:45:08 -0800 Subject: [PATCH] Cleanup. --- include/bx/inline/math.inl | 16 +++++++++--- src/math.cpp | 1 + tests/math_test.cpp | 50 +++++++++++++++++++++++++++++++++++++- 3 files changed, 63 insertions(+), 4 deletions(-) diff --git a/include/bx/inline/math.inl b/include/bx/inline/math.inl index bd2f57a..cc6436b 100644 --- a/include/bx/inline/math.inl +++ b/include/bx/inline/math.inl @@ -110,9 +110,9 @@ namespace bx return -floor(-_a); } - inline BX_CONSTEXPR_FUNC float round(float _f) + inline BX_CONSTEXPR_FUNC float round(float _a) { - return floor(_f + 0.5f); + return floor(_a + 0.5f); } inline BX_CONSTEXPR_FUNC float lerp(float _a, float _b, float _t) @@ -214,7 +214,17 @@ namespace bx inline BX_CONST_FUNC float pow(float _a, float _b) { - return exp(_b * log(_a) ); + if (abs(_b) < kFloatSmallest) + { + return 1.0f; + } + + if (abs(_a) < kFloatSmallest) + { + return 0.0f; + } + + return copySign(exp(_b * log(abs(_a) ) ), _a); } inline BX_CONST_FUNC float exp2(float _a) diff --git a/src/math.cpp b/src/math.cpp index 0216fa8..f0ed246 100644 --- a/src/math.cpp +++ b/src/math.cpp @@ -194,6 +194,7 @@ namespace bx { int32_t exp; float ff = frexp(_a, &exp); + if (ff < kSqrt2*0.5f) { ff *= 2.0f; diff --git a/tests/math_test.cpp b/tests/math_test.cpp index 2ad207d..278bddb 100644 --- a/tests/math_test.cpp +++ b/tests/math_test.cpp @@ -431,22 +431,48 @@ TEST_CASE("mod", "[math][libm]") STATIC_REQUIRE( 1.0f == bx::mod(1389.0f, 2.0f) ); } +typedef float (*MathFloatFn)(float); + +template +void testMathFunc1Float(float _value) +{ + REQUIRE(CrtT(_value) == BxT(_value) ); +} + TEST_CASE("floor", "[math][libm]") { STATIC_REQUIRE( 13.0f == bx::floor( 13.89f) ); STATIC_REQUIRE(-14.0f == bx::floor(-13.89f) ); + + testMathFunc1Float( 13.89f); + testMathFunc1Float(-13.89f); } TEST_CASE("ceil", "[math][libm]") { STATIC_REQUIRE( 14.0f == bx::ceil( 13.89f) ); STATIC_REQUIRE(-13.0f == bx::ceil( -13.89f) ); + + testMathFunc1Float( 13.89f); + testMathFunc1Float(-13.89f); +} + +TEST_CASE("round", "[math][libm]") +{ + STATIC_REQUIRE( 14.0f == bx::round( 13.89f) ); + STATIC_REQUIRE(-14.0f == bx::round( -13.89f) ); + + testMathFunc1Float( 13.89f); + testMathFunc1Float(-13.89f); } TEST_CASE("trunc", "[math][libm]") { STATIC_REQUIRE( 13.0f == bx::trunc( 13.89f) ); STATIC_REQUIRE(-13.0f == bx::trunc(-13.89f) ); + + testMathFunc1Float( 13.89f); + testMathFunc1Float(-13.89f); } TEST_CASE("fract", "[math][libm]") @@ -457,7 +483,13 @@ TEST_CASE("fract", "[math][libm]") TEST_CASE("ldexp", "[math][libm]") { - STATIC_REQUIRE(1389.0f == bx::ldexp(86.8125, 4) ); + STATIC_REQUIRE( 1389.0f == bx::ldexp(86.8125, 4) ); + STATIC_REQUIRE(0.437500f == bx::ldexp(7.0f, -4.0f) ); + STATIC_REQUIRE(bx::isEqual(-0.0f, bx::ldexp(-0.0f, 10.0f), 0.000000001f) ); + + STATIC_REQUIRE(0x1p127f == bx::ldexp(1.0f, 127.0f) ); + STATIC_REQUIRE(0x1p-126f == bx::ldexp(1.0f, -126.0f) ); + STATIC_REQUIRE(0x1p24f == bx::ldexp(1.0f, 24.0f) ); bx::WriterI* writer = bx::getNullOut(); bx::Error err; @@ -487,6 +519,22 @@ TEST_CASE("exp", "[math][libm]") TEST_CASE("pow", "[math][libm]") { + REQUIRE(1.0f == bx::pow(0.0f, 0.0f) ); + REQUIRE(1.0f == bx::pow(1.0f, 0.0f) ); + REQUIRE(1.0f == bx::pow(3.0f, 0.0f) ); + REQUIRE(1.0f == bx::pow(8.0f, 0.0f) ); + REQUIRE(1.0f == bx::pow(9.0f, 0.0f) ); + REQUIRE(0.0f == bx::pow(0.0f, 2.0f) ); + + REQUIRE( 4.0f == bx::pow( 2.0f, 2.0f) ); + REQUIRE( -4.0f == bx::pow(-2.0f, 2.0f) ); + REQUIRE( 0.25f == bx::pow( 2.0f, -2.0f) ); + REQUIRE( -0.25f == bx::pow(-2.0f, -2.0f) ); + REQUIRE( 8.0f == bx::pow( 2.0f, 3.0f) ); + REQUIRE( -8.0f == bx::pow(-2.0f, 3.0f) ); + REQUIRE( 0.125f == bx::pow( 2.0f, -3.0f) ); + REQUIRE(-0.125f == bx::pow(-2.0f, -3.0f) ); + bx::WriterI* writer = bx::getNullOut(); bx::Error err;