2013-11-07 2 views
1

Этот кодGLM OPENGL Математика fastSqrt

#include "glm/glm.hpp" 
#include "glm/gtx/fast_square_root.hpp" 

double temp = 4.0; 
temp = glm::fastSqrt(temp); 

производит следующий результат

-2.16802e-058 

Что я делаю неправильно?

+0

Как вы выводя этот номер? – rhughes

+0

Кажется, что fastSqrt не работает с двойным ... – user1085593

+0

rhughes, cerr << temp << endl; – user1085593

ответ

1

Решение простое, свернуть свой собственный fastSqrt, который работает:

#if defined(__SSE__) 
template <typename T> 
inline T fastSqrt(T const x) 
{ 
    float r; 

    _mm_store_ss(&r, _mm_rsqrt_ss(_mm_set_ss(x))); 

    return x * r * (T(1.5) - T(.5) * x * r * r); 
} 
#elif defined(__ARM_NEON__) 
template <typename T> 
inline T fastSqrt(T const x) 
{ 
    auto const r(vrsqrte_f32(float32x2_t{float32_t(x)})); 

    return x * r[0] * (T(1.5) - T(.5) * x * r[0] * r[0]); 
} 
#else 
template <typename T> 
inline T fastSqrt(T const x) 
{ 
    constexpr ::std::int32_t const SQRT_MAGIC_F(0x5f3759df); 

    float r(x); 

    reinterpret_cast<::std::int32_t&>(r) = SQRT_MAGIC_F - 
    (reinterpret_cast<::std::int32_t const&>(r) >> 1); 

    return x * r * (1.5f - .5f * x * r * r); 
} 
+0

Работает ли он в два раза? Я имею в виду SQRT_MAGIC_F. – user1085593

+0

Через преобразование да, но в противном случае вам нужна другая константа. Проверьте википедию. – user1095108