Browse Source

Fixed log2 in GCC

Christophe Riccio 14 years ago
parent
commit
1ed0e3865b
3 changed files with 18 additions and 10 deletions
  1. 3 1
      glm/gtx/integer.inl
  2. 3 3
      test/core/core_func_common.cpp
  3. 12 6
      test/gtx/gtx_integer.cpp

+ 3 - 1
glm/gtx/integer.inl

@@ -60,8 +60,10 @@ namespace _detail
 		template <typename T>
 		template <typename T>
 		T operator() (T const & Value) const
 		T operator() (T const & Value) const
 		{
 		{
-#if(GLM_COMPILER & (GLM_COMPILER_VC | GLM_COMPILER_GCC))
+#if(GLM_COMPILER & GLM_COMPILER_VC)
 			return Value <= T(1) ? T(0) : T(32) - nlz(Value - T(1));
 			return Value <= T(1) ? T(0) : T(32) - nlz(Value - T(1));
+#elif(GLM_COMPILER & GLM_COMPILER_GCC)
+			return Value <= T(1) ? T(0) : nlz(Value - T(1)) + 1;
 #else
 #else
 			return T(32) - nlz(Value - T(1));
 			return T(32) - nlz(Value - T(1));
 #endif
 #endif

+ 3 - 3
test/core/core_func_common.cpp

@@ -7,9 +7,9 @@
 // File    : test/core/func_common.cpp
 // File    : test/core/func_common.cpp
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 
-#include <boost/array.hpp>
-#include <boost/date_time/posix_time/posix_time.hpp>
-#include <boost/thread/thread.hpp>
+//#include <boost/array.hpp>
+//#include <boost/date_time/posix_time/posix_time.hpp>
+//#include <boost/thread/thread.hpp>
 #include <glm/glm.hpp>
 #include <glm/glm.hpp>
 #include <glm/ext.hpp>
 #include <glm/ext.hpp>
 #include <glm/gtx/epsilon.hpp>
 #include <glm/gtx/epsilon.hpp>

+ 12 - 6
test/gtx/gtx_integer.cpp

@@ -32,15 +32,20 @@ int test_log2()
 {
 {
 	int Error = 0;
 	int Error = 0;
 
 
-	for(std::size_t i = 1; i < 1000000; ++i)
+	for(std::size_t i = 1; i < 24; ++i)
 	{
 	{
-		glm::uint A = glm::log2(glm::uint(i));
-		double B = glm::log2(double(i));
+		glm::uint A = glm::log2(glm::uint(1 << i));
+		glm::uint B = glm::uint(glm::log2(double(1 << i)));
+
+		//Error += glm::equalEpsilon(double(A), B, 1.0) ? 0 : 1;
+		Error += glm::abs(double(A) - B) <= 24 ? 0 : 1;
+		assert(!Error);
 
 
-		Error += glm::equalEpsilon(double(A), B, 1.0) ? 0 : 1;
-		//assert(!Error);
+		printf("Log2(%d) Error: %d, %d\n", 1 << i, A, B);
 	}
 	}
 
 
+	printf("log2 error: %d\n", Error);
+
 	return Error;
 	return Error;
 }
 }
 
 
@@ -49,7 +54,8 @@ int test_nlz()
 	int Error = 0;
 	int Error = 0;
 
 
 	for(std::size_t i = 1; i < 33; ++i)
 	for(std::size_t i = 1; i < 33; ++i)
-		printf("%d, %d\n", glm::nlz(i), 31u - glm::findMSB(i));
+		Error += glm::nlz(i) == 31u - glm::findMSB(i) ? 0 : 1;
+		//printf("%d, %d\n", glm::nlz(i), 31u - glm::findMSB(i));
 
 
 	return Error;
 	return Error;
 }
 }