From c79dfbc925353ceadda814dbc0d3f5f6e54f691c Mon Sep 17 00:00:00 2001 From: Kai Dietrich Date: Thu, 26 Oct 2017 09:43:47 +0200 Subject: [PATCH] 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. --- glm/detail/func_exponential.inl | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/glm/detail/func_exponential.inl b/glm/detail/func_exponential.inl index 5267ea3e..907989f4 100644 --- a/glm/detail/func_exponential.inl +++ b/glm/detail/func_exponential.inl @@ -90,6 +90,9 @@ namespace detail return detail::functor1::call(log, x); } +# if GLM_HAS_CXX11_STL + using std::exp2; +# else //exp2, ln2 = 0.69314718055994530941723212145818f template GLM_FUNC_QUALIFIER genType exp2(genType x) @@ -98,6 +101,7 @@ namespace detail return std::exp(static_cast(0.69314718055994530941723212145818) * x); } +# endif template GLM_FUNC_QUALIFIER vec exp2(vec const& x)