- Fixed integer pow from GTX_integer with null exponent #658

This commit is contained in:
Christophe Riccio 2017-07-24 11:39:16 +02:00
parent ad744735f6
commit 50a527c97d
4 changed files with 51 additions and 3 deletions

View File

@ -31,7 +31,7 @@ namespace glm
//! Returns x raised to the y power. //! Returns x raised to the y power.
//! From GLM_GTX_integer extension. //! From GLM_GTX_integer extension.
GLM_FUNC_DECL int pow(int x, int y); GLM_FUNC_DECL int pow(int x, uint y);
//! Returns the positive square root of x. //! Returns the positive square root of x.
//! From GLM_GTX_integer extension. //! From GLM_GTX_integer extension.

View File

@ -4,10 +4,11 @@
namespace glm namespace glm
{ {
// pow // pow
GLM_FUNC_QUALIFIER int pow(int x, int y) GLM_FUNC_QUALIFIER int pow(int x, uint y)
{ {
if(y == 0) if(y == 0)
return 1; return x >= 0 ? 1 : -1;
int result = x; int result = x;
for(int i = 1; i < y; ++i) for(int i = 1; i < y; ++i)
result *= x; result *= x;
@ -111,6 +112,9 @@ namespace detail
GLM_FUNC_QUALIFIER uint pow(uint x, uint y) GLM_FUNC_QUALIFIER uint pow(uint x, uint y)
{ {
if (y == 0)
return 1u;
uint result = x; uint result = x;
for(uint i = 1; i < y; ++i) for(uint i = 1; i < y; ++i)
result *= x; result *= x;

View File

@ -85,6 +85,7 @@ glm::mat4 camera(float Translate, glm::vec2 const & Rotate)
- Fixed references to GLM_FORCE_RADIANS which was removed #642 - Fixed references to GLM_FORCE_RADIANS which was removed #642
- Fixed glm::fastInverseSqrt to use fast inverse square #640 - Fixed glm::fastInverseSqrt to use fast inverse square #640
- Fixed axisAngle NaN #638 - Fixed axisAngle NaN #638
- Fixed integer pow from GTX_integer with null exponent #658
#### Deprecation: #### Deprecation:
- Requires Visual Studio 2013, GCC 4.7, Clang 3.4, Cuda 7, ICC 2013 or a C++11 compiler - Requires Visual Studio 2013, GCC 4.7, Clang 3.4, Cuda 7, ICC 2013 or a C++11 compiler

View File

@ -52,6 +52,47 @@ int test_nlz()
return Error; return Error;
} }
int test_pow_uint()
{
int Error = 0;
glm::uint const p0 = glm::pow(2u, 0u);
Error += p0 == 1u ? 0 : 1;
glm::uint const p1 = glm::pow(2u, 1u);
Error += p1 == 2u ? 0 : 1;
glm::uint const p2 = glm::pow(2u, 2u);
Error += p2 == 4u ? 0 : 1;
return Error;
}
int test_pow_int()
{
int Error = 0;
int const p0 = glm::pow(2, 0u);
Error += p0 == 1 ? 0 : 1;
int const p1 = glm::pow(2, 1u);
Error += p1 == 2 ? 0 : 1;
int const p2 = glm::pow(2, 2u);
Error += p2 == 4 ? 0 : 1;
int const p0n = glm::pow(-2, 0u);
Error += p0n == -1 ? 0 : 1;
int const p1n = glm::pow(-2, 1u);
Error += p1n == -2 ? 0 : 1;
int const p2n = glm::pow(-2, 2u);
Error += p2n == 4 ? 0 : 1;
return Error;
}
int main() int main()
{ {
int Error = 0; int Error = 0;
@ -59,6 +100,8 @@ int main()
Error += test_nlz(); Error += test_nlz();
// Error += test_floor_log2(); // Error += test_floor_log2();
Error += test_log2(); Error += test_log2();
Error += test_pow_uint();
Error += test_pow_int();
return Error; return Error;
} }