Этот код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
Что я делаю неправильно?
Этот код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
Что я делаю неправильно?
Решение простое, свернуть свой собственный 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);
}
Работает ли он в два раза? Я имею в виду SQRT_MAGIC_F. – user1085593
Через преобразование да, но в противном случае вам нужна другая константа. Проверьте википедию. – user1095108
Как вы выводя этот номер? – rhughes
Кажется, что fastSqrt не работает с двойным ... – user1085593
rhughes, cerr << temp << endl; – user1085593