From de9e62f0a4defbd3d57074381ee5e10490fba87e Mon Sep 17 00:00:00 2001 From: Sebastian Rettenberger Date: Wed, 23 Sep 2015 12:03:15 +0200 Subject: [PATCH 1/2] Fix floorMultiple/ceilMultiple for float --- glm/gtc/round.inl | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/glm/gtc/round.inl b/glm/gtc/round.inl index 255dec66..94fdd54b 100644 --- a/glm/gtc/round.inl +++ b/glm/gtc/round.inl @@ -104,10 +104,7 @@ namespace detail GLM_FUNC_QUALIFIER static genType call(genType Source, genType Multiple) { if(Source > genType(0)) - { - genType Tmp = Source - genType(1); - return Tmp + (Multiple - std::fmod(Tmp, Multiple)); - } + return Source + (Multiple - std::fmod(Source, Multiple)); else return Source + std::fmod(-Source, Multiple); } @@ -152,10 +149,7 @@ namespace detail if(Source >= genType(0)) return Source - std::fmod(Source, Multiple); else - { - genType Tmp = Source + genType(1); - return Tmp - std::fmod(Tmp, Multiple) - Multiple; - } + return Source - std::fmod(Source, Multiple) - Multiple; } }; From fa6fd748c06a4513a911db53da61f976281b1207 Mon Sep 17 00:00:00 2001 From: Sebastian Rettenberger Date: Wed, 23 Sep 2015 12:03:44 +0200 Subject: [PATCH 2/2] Add test for floorMultiple/ceilMultiple (float only) --- test/gtc/gtc_round.cpp | 84 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/test/gtc/gtc_round.cpp b/test/gtc/gtc_round.cpp index 1162d00f..aa6cf1a1 100644 --- a/test/gtc/gtc_round.cpp +++ b/test/gtc/gtc_round.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -293,6 +294,86 @@ namespace ceilPowerOfTwo } }//namespace ceilPowerOfTwo +namespace floorMultiple +{ + template + struct type + { + genType Source; + genType Multiple; + genType Return; + genType Epsilon; + }; + + int test_float() + { + type const Data[] = + { + {3.4, 0.3, 3.3, 0.0001}, + {-1.4, 0.3, -1.5, 0.0001}, + }; + + int Error(0); + + for(std::size_t i = 0, n = sizeof(Data) / sizeof(type); i < n; ++i) + { + glm::float64 Result = glm::floorMultiple(Data[i].Source, Data[i].Multiple); + Error += glm::epsilonEqual(Data[i].Return, Result, Data[i].Epsilon) ? 0 : 1; + } + + return Error; + } + + int test() + { + int Error(0); + + Error += test_float(); + + return Error; + } +}//namespace floorMultiple + +namespace ceilMultiple +{ + template + struct type + { + genType Source; + genType Multiple; + genType Return; + genType Epsilon; + }; + + int test_float() + { + type const Data[] = + { + {3.4, 0.3, 3.6, 0.0001}, + {-1.4, 0.3, -1.2, 0.0001}, + }; + + int Error(0); + + for(std::size_t i = 0, n = sizeof(Data) / sizeof(type); i < n; ++i) + { + glm::float64 Result = glm::ceilMultiple(Data[i].Source, Data[i].Multiple); + Error += glm::epsilonEqual(Data[i].Return, Result, Data[i].Epsilon) ? 0 : 1; + } + + return Error; + } + + int test() + { + int Error(0); + + Error += test_float(); + + return Error; + } +}//namespace ceilMultiple + int main() { int Error(0); @@ -304,5 +385,8 @@ int main() Error += ceilPowerOfTwo::perf(); # endif//NDEBUG + Error += floorMultiple::test(); + Error += ceilMultiple::test(); + return Error; }