From 224d543d799f3e26a530b94d5ebf020add8e7e63 Mon Sep 17 00:00:00 2001 From: Matt Mascarenhas Date: Wed, 31 Aug 2016 00:44:14 +0100 Subject: [PATCH 1/7] Introduce HMM_PowerF() --- HandmadeMath.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/HandmadeMath.h b/HandmadeMath.h index 7981a46..da1c71c 100644 --- a/HandmadeMath.h +++ b/HandmadeMath.h @@ -644,6 +644,18 @@ HMM_Power(float Base, int Exponent) return (Result); } +HINLINE float +HMM_PowerF(float Base, float Exponent) +{ + if (Base > 0) + { + return expf(Exponent * logf(Base)); + } + else + { + return -expf(Exponent * logf(-Base)); + } +} HINLINE float HMM_Lerp(float A, float Time, float B) From 24caf7e8ddbdc03fbf1de4484b02f6df996818be Mon Sep 17 00:00:00 2001 From: Matt Mascarenhas Date: Wed, 31 Aug 2016 01:35:24 +0100 Subject: [PATCH 2/7] Add header for HMM_PowerF() --- HandmadeMath.h | 1 + 1 file changed, 1 insertion(+) diff --git a/HandmadeMath.h b/HandmadeMath.h index da1c71c..08e3a3e 100644 --- a/HandmadeMath.h +++ b/HandmadeMath.h @@ -345,6 +345,7 @@ HMMDEF float HMM_RSquareRootF(float Float); HMMDEF float HMM_LengthSquared(hmm_vec3 A); HMMDEF float HMM_Length(hmm_vec3 A); HMMDEF float HMM_Power(float Base, int Exponent); +HMMDEF float HMM_PowerF(float Base, float Exponent); HMMDEF float HMM_Clamp(float Min, float Value, float Max); HMMDEF hmm_vec3 HMM_Normalize(hmm_vec3 A); From 5b0e0969c20a7b0f2ec3e0a6458a3687116e3e0a Mon Sep 17 00:00:00 2001 From: Matt Mascarenhas Date: Wed, 31 Aug 2016 01:57:20 +0100 Subject: [PATCH 3/7] Add tests for PowerF() --- test/hmm_test.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/test/hmm_test.cpp b/test/hmm_test.cpp index 8ee6e14..87d2ef6 100644 --- a/test/hmm_test.cpp +++ b/test/hmm_test.cpp @@ -57,6 +57,15 @@ TEST(ScalarMath, Power) EXPECT_FLOAT_EQ(HMM_Power(2.0f, -2), 0.25f); } +TEST(ScalarMath, PowerF) +{ + EXPECT_FLOAT_EQ(HMM_PowerF(2.0f, 0), 1.0f); + EXPECT_FLOAT_EQ(HMM_PowerF(2.0f, 4.1), 17.148376f); + EXPECT_FLOAT_EQ(HMM_PowerF(-2.0f, 4.1), -17.148376f); + EXPECT_FLOAT_EQ(HMM_PowerF(2.0f, -2.5), 0.176777f); + EXPECT_FLOAT_EQ(HMM_PowerF(-2.0f, -2.5), -0.176777f); +} + TEST(ScalarMath, Clamp) { EXPECT_FLOAT_EQ(HMM_Clamp(-2.0f, 0.0f, 2.0f), 0.0f); From 774630b7cf932ec2db56ba18a4658f71ff86a00d Mon Sep 17 00:00:00 2001 From: Matt Mascarenhas Date: Wed, 31 Aug 2016 02:10:39 +0100 Subject: [PATCH 4/7] Add wrappers for expf and logf --- HandmadeMath.h | 47 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/HandmadeMath.h b/HandmadeMath.h index 08e3a3e..04fee29 100644 --- a/HandmadeMath.h +++ b/HandmadeMath.h @@ -77,19 +77,23 @@ #define HMM_SINF MySinF #define HMM_COSF MyCosF #define HMM_TANF MyTanF + #define HMM_EXPF MyExpF + #define HMM_LOGF MyLogF - Provide your own implementations of SinF, CosF, and TanF + Provide your own implementations of SinF, CosF, TanF, ExpF and LogF in EXACTLY one C or C++ file that includes this header, BEFORE the include, like this: #define HMM_SINF MySinF #define HMM_COSF MyCosF #define HMM_TANF MyTanF + #define HMM_EXPF MyExpF + #define HMM_LOGF MyLogF #define HANDMADE_MATH_IMPLEMENTATION #define HANDMADE_MATH_CPP_MODE #include "HandmadeMath.h" - If you do not define all three of these, HandmadeMath.h will use the + If you do not define all five of these, HandmadeMath.h will use the versions of these functions that are provided by the CRT. ========================================================================== @@ -183,7 +187,8 @@ extern "C" #define HINLINE inline #endif -#if !defined(HMM_SINF) || !defined(HMM_COSF) || !defined(HMM_TANF) +#if !defined(HMM_SINF) || !defined(HMM_COSF) || !defined(HMM_TANF) || \ + !defined(HMM_EXPF) || !defined(HMM_LOGF) #include #endif @@ -199,6 +204,14 @@ extern "C" #define HMM_TANF tanf #endif +#ifndef HMM_EXPF +#define HMM_EXPF expf +#endif + +#ifndef HMM_LOGF +#define HMM_LOGF logf +#endif + #define HMM_PI32 3.14159265359f #define HMM_PI 3.14159265358979323846 @@ -338,6 +351,8 @@ typedef hmm_mat4 hmm_m4; HMMDEF float HMM_SinF(float Angle); HMMDEF float HMM_TanF(float Angle); HMMDEF float HMM_CosF(float Angle); +HMMDEF float HMM_ExpF(float Float); +HMMDEF float HMM_LogF(float Float); HMMDEF float HMM_ToRadians(float Degrees); HMMDEF float HMM_SquareRootF(float Float); @@ -511,7 +526,7 @@ HMMDEF hmm_mat4 & operator/=(hmm_mat4 &Left, float Right); #ifdef HANDMADE_MATH_IMPLEMENTATION -HINLINE float +HINLINE float HMM_SinF(float Angle) { float Result = 0; @@ -520,7 +535,7 @@ HMM_SinF(float Angle) return (Result); } -HINLINE float +HINLINE float HMM_CosF(float Angle) { float Result = 0; @@ -529,7 +544,7 @@ HMM_CosF(float Angle) return (Result); } -HINLINE float +HINLINE float HMM_TanF(float Radians) { float Result = 0; @@ -538,7 +553,25 @@ HMM_TanF(float Radians) return (Result); } -HINLINE float +HINLINE float +HMM_ExpF(float Float) +{ + float Result = 0; + + Result = HMM_EXPF(Float); + return (Result); +} + +HINLINE float +HMM_LogF(float Float) +{ + float Result = 0; + + Result = HMM_LOGF(Float); + return (Result); +} + +HINLINE float HMM_SquareRootF(float Value) { float Result = 0; From 5e15bfb6b7ca8f9fc668073857c84c381ebe459e Mon Sep 17 00:00:00 2001 From: Matt Mascarenhas Date: Wed, 31 Aug 2016 02:28:10 +0100 Subject: [PATCH 5/7] Insert the missing closing brace --- test/hmm_test.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/test/hmm_test.cpp b/test/hmm_test.cpp index df8d290..1c1533c 100644 --- a/test/hmm_test.cpp +++ b/test/hmm_test.cpp @@ -64,6 +64,7 @@ TEST(ScalarMath, PowerF) EXPECT_FLOAT_EQ(HMM_PowerF(-2.0f, 4.1), -17.148376f); EXPECT_FLOAT_EQ(HMM_PowerF(2.0f, -2.5), 0.176777f); EXPECT_FLOAT_EQ(HMM_PowerF(-2.0f, -2.5), -0.176777f); +} TEST(ScalarMath, Lerp) { From fcc3052ed4370c56b7e7e0222a22fb00a2d4d5f3 Mon Sep 17 00:00:00 2001 From: Matt Mascarenhas Date: Wed, 31 Aug 2016 02:37:37 +0100 Subject: [PATCH 6/7] Make the PowerF() tests more forgiving --- test/hmm_test.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/hmm_test.cpp b/test/hmm_test.cpp index 1c1533c..e94f624 100644 --- a/test/hmm_test.cpp +++ b/test/hmm_test.cpp @@ -60,10 +60,10 @@ TEST(ScalarMath, Power) TEST(ScalarMath, PowerF) { EXPECT_FLOAT_EQ(HMM_PowerF(2.0f, 0), 1.0f); - EXPECT_FLOAT_EQ(HMM_PowerF(2.0f, 4.1), 17.148376f); - EXPECT_FLOAT_EQ(HMM_PowerF(-2.0f, 4.1), -17.148376f); - EXPECT_FLOAT_EQ(HMM_PowerF(2.0f, -2.5), 0.176777f); - EXPECT_FLOAT_EQ(HMM_PowerF(-2.0f, -2.5), -0.176777f); + EXPECT_NEAR(HMM_PowerF(2.0f, 4.1), 17.148376f, 0.0001f); + EXPECT_NEAR(HMM_PowerF(-2.0f, 4.1), -17.148376f, 0.0001f); + EXPECT_NEAR(HMM_PowerF(2.0f, -2.5), 0.176777f, 0.0001f); + EXPECT_NEAR(HMM_PowerF(-2.0f, -2.5), -0.176777f, 0.0001f); } TEST(ScalarMath, Lerp) From 7e42f3d7c84ed4e4ee1d0fa85394dafa42d5c9e4 Mon Sep 17 00:00:00 2001 From: Matt Mascarenhas Date: Wed, 31 Aug 2016 03:16:13 +0100 Subject: [PATCH 7/7] Allow HMM_PowerF to try and compute negative bases --- HandmadeMath.h | 9 +-------- test/hmm_test.cpp | 2 -- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/HandmadeMath.h b/HandmadeMath.h index 9a5ec40..ad54aa8 100644 --- a/HandmadeMath.h +++ b/HandmadeMath.h @@ -680,14 +680,7 @@ HMM_Power(float Base, int Exponent) HINLINE float HMM_PowerF(float Base, float Exponent) { - if (Base > 0) - { - return expf(Exponent * logf(Base)); - } - else - { - return -expf(Exponent * logf(-Base)); - } + return expf(Exponent * logf(Base)); } HINLINE float diff --git a/test/hmm_test.cpp b/test/hmm_test.cpp index e94f624..a14fb2b 100644 --- a/test/hmm_test.cpp +++ b/test/hmm_test.cpp @@ -61,9 +61,7 @@ TEST(ScalarMath, PowerF) { EXPECT_FLOAT_EQ(HMM_PowerF(2.0f, 0), 1.0f); EXPECT_NEAR(HMM_PowerF(2.0f, 4.1), 17.148376f, 0.0001f); - EXPECT_NEAR(HMM_PowerF(-2.0f, 4.1), -17.148376f, 0.0001f); EXPECT_NEAR(HMM_PowerF(2.0f, -2.5), 0.176777f, 0.0001f); - EXPECT_NEAR(HMM_PowerF(-2.0f, -2.5), -0.176777f, 0.0001f); } TEST(ScalarMath, Lerp)