8#include "../detail/type_float.hpp"
13#if(GLM_COMPILER & GLM_COMPILER_VC)
15# pragma warning(disable : 4127)
35#define GLM_EXTRACT_WORDS(ix0,ix1,d) \
37 ieee_double_shape_type ew_u; \
39 (ix0) = ew_u.parts.msw; \
40 (ix1) = ew_u.parts.lsw; \
43#define GLM_GET_FLOAT_WORD(i,d) \
45 ieee_float_shape_type gf_u; \
50#define GLM_SET_FLOAT_WORD(d,i) \
52 ieee_float_shape_type sf_u; \
57#define GLM_INSERT_WORDS(d,ix0,ix1) \
59 ieee_double_shape_type iw_u; \
60 iw_u.parts.msw = (ix0); \
61 iw_u.parts.lsw = (ix1); \
68 GLM_FUNC_QUALIFIER
float nextafterf(
float x,
float y)
73 GLM_GET_FLOAT_WORD(hx, x);
74 GLM_GET_FLOAT_WORD(hy, y);
78 if((ix > 0x7f800000) ||
85 GLM_SET_FLOAT_WORD(x, (hy & 0x80000000) | 1);
101 if(hy >= 0 || hx > hy)
106 hy = hx & 0x7f800000;
114 GLM_SET_FLOAT_WORD(y, hx);
118 GLM_SET_FLOAT_WORD(x, hx);
122 GLM_FUNC_QUALIFIER
double nextafter(
double x,
double y)
128 GLM_EXTRACT_WORDS(hx, lx, x);
129 GLM_EXTRACT_WORDS(hy, ly, y);
130 ix = hx & 0x7fffffff;
131 iy = hy & 0x7fffffff;
133 if(((ix >= 0x7ff00000) && ((ix - 0x7ff00000) | lx) != 0) ||
134 ((iy >= 0x7ff00000) && ((iy - 0x7ff00000) | ly) != 0))
140 GLM_INSERT_WORDS(x, hy & 0x80000000, 1);
148 if(hx > hy || ((hx == hy) && (lx > ly))) {
158 if(hy >= 0 || hx > hy || ((hx == hy) && (lx > ly))){
167 hy = hx & 0x7ff00000;
175 GLM_INSERT_WORDS(y, hx, lx);
179 GLM_INSERT_WORDS(x, hx, lx);
185#if(GLM_COMPILER & GLM_COMPILER_VC)
192 GLM_FUNC_QUALIFIER
float nextFloat(
float x)
194# if GLM_HAS_CXX11_STL
195 return std::nextafter(x, std::numeric_limits<float>::max());
196# elif((GLM_COMPILER & GLM_COMPILER_VC) || ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_PLATFORM & GLM_PLATFORM_WINDOWS)))
197 return detail::nextafterf(x, FLT_MAX);
198# elif(GLM_PLATFORM & GLM_PLATFORM_ANDROID)
199 return __builtin_nextafterf(x, FLT_MAX);
201 return nextafterf(x, FLT_MAX);
206 GLM_FUNC_QUALIFIER
double nextFloat(
double x)
208# if GLM_HAS_CXX11_STL
209 return std::nextafter(x, std::numeric_limits<double>::max());
210# elif((GLM_COMPILER & GLM_COMPILER_VC) || ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_PLATFORM & GLM_PLATFORM_WINDOWS)))
211 return detail::nextafter(x, std::numeric_limits<double>::max());
212# elif(GLM_PLATFORM & GLM_PLATFORM_ANDROID)
213 return __builtin_nextafter(x, DBL_MAX);
215 return nextafter(x, DBL_MAX);
220 GLM_FUNC_QUALIFIER T
nextFloat(T x,
int ULPs)
222 GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,
"'next_float' only accept floating-point input");
226 for(
int i = 0; i < ULPs; ++i)
231 GLM_FUNC_QUALIFIER
float prevFloat(
float x)
233# if GLM_HAS_CXX11_STL
234 return std::nextafter(x, std::numeric_limits<float>::min());
235# elif((GLM_COMPILER & GLM_COMPILER_VC) || ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_PLATFORM & GLM_PLATFORM_WINDOWS)))
236 return detail::nextafterf(x, FLT_MIN);
237# elif(GLM_PLATFORM & GLM_PLATFORM_ANDROID)
238 return __builtin_nextafterf(x, FLT_MIN);
240 return nextafterf(x, FLT_MIN);
244 GLM_FUNC_QUALIFIER
double prevFloat(
double x)
246# if GLM_HAS_CXX11_STL
247 return std::nextafter(x, std::numeric_limits<double>::min());
248# elif((GLM_COMPILER & GLM_COMPILER_VC) || ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_PLATFORM & GLM_PLATFORM_WINDOWS)))
249 return _nextafter(x, DBL_MIN);
250# elif(GLM_PLATFORM & GLM_PLATFORM_ANDROID)
251 return __builtin_nextafter(x, DBL_MIN);
253 return nextafter(x, DBL_MIN);
258 GLM_FUNC_QUALIFIER T
prevFloat(T x,
int ULPs)
260 GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559,
"'prev_float' only accept floating-point input");
264 for(
int i = 0; i < ULPs; ++i)
274 return abs(a.i - b.i);
282 return abs(a.i - b.i);
GLM_FUNC_DECL GLM_CONSTEXPR genType abs(genType x)
GLM_FUNC_DECL GLM_CONSTEXPR genType epsilon()
Return the epsilon constant for floating point types.
Definition scalar_constants.inl:6
detail::int64 int64
64 bit signed integer type.
Definition scalar_int_sized.hpp:67
detail namespace with internal helper functions
Definition json.h:249
Core features
Definition common.hpp:21
GLM_FUNC_DECL genType prevFloat(genType x)
GLM_FUNC_DECL genType nextFloat(genType x)
GLM_FUNC_DECL int floatDistance(float x, float y)
Definition scalar_ulp.inl:269
Definition type_float.hpp:15
Definition scalar_ulp.inl:26
Definition scalar_ulp.inl:19