浏览代码

Use std::exp2 to implement glm::exp2 when available

Using std::exp and then a multiplication looses a lot of precision which
can cause hard to find bugs (who would expect exp2 to fail?) because all
powers of two with integer exponents can be expressed precisely
with ieee754 floating point.

This also should be good for performance, since exp2 with
integer exponent is just shifting some bits in ieee754 and
good implementers will probably leverage that to implement exp2
efficiently.
Kai Dietrich 8 年之前
父节点
当前提交
c79dfbc925
共有 1 个文件被更改,包括 4 次插入0 次删除
  1. 4 0
      glm/detail/func_exponential.inl

+ 4 - 0
glm/detail/func_exponential.inl

@@ -90,6 +90,9 @@ namespace detail
 		return detail::functor1<L, T, T, Q>::call(log, x);
 	}
 
+#   if GLM_HAS_CXX11_STL
+    using std::exp2;
+#   else
 	//exp2, ln2 = 0.69314718055994530941723212145818f
 	template<typename genType>
 	GLM_FUNC_QUALIFIER genType exp2(genType x)
@@ -98,6 +101,7 @@ namespace detail
 
 		return std::exp(static_cast<genType>(0.69314718055994530941723212145818) * x);
 	}
+#   endif
 
 	template<length_t L, typename T, qualifier Q>
 	GLM_FUNC_QUALIFIER vec<L, T, Q> exp2(vec<L, T, Q> const& x)