15 #ifdef __INTEL_COMPILER
17 #define FPU_CONTROLWORD_WRITEMASK 0xFFFFF // if you look at defn of _CW_DEFAULT, all settings fall within 0xFFFFF
18 #define FPU_CONTROLWORD_NEW_SETTING _CW_DEFAULT
52 INLINE
float ctan(
float v) {
61 csincos(
float v,
float *sin_result,
float *cos_result) {
63 #if defined(_M_IX86) || defined(_X86_)
74 *sin_result = sinf(v);
75 *cos_result = cosf(v);
84 csin_over_x(
float v) {
85 if (1.0f + v * v == 1.0f) {
115 catan2(
float y,
float x) {
144 cmod(
float x,
float y) {
145 return x - floor(x / y) * y;
153 cpow(
float x,
float y) {
164 #ifdef __INTEL_COMPILER
166 unsigned int saved_fpu_control_word=_controlfp(0x0,0x0);
167 _controlfp(FPU_CONTROLWORD_NEW_SETTING,FPU_CONTROLWORD_WRITEMASK);
168 double retval=floor(f);
169 _controlfp(saved_fpu_control_word,FPU_CONTROLWORD_WRITEMASK);
182 #ifdef __INTEL_COMPILER
184 unsigned int saved_fpu_control_word=_controlfp(0x0,0x0);
185 _controlfp(FPU_CONTROLWORD_NEW_SETTING,FPU_CONTROLWORD_WRITEMASK);
186 double retval=ceil(f);
187 _controlfp(saved_fpu_control_word,FPU_CONTROLWORD_WRITEMASK);
200 return f - cfloor(f);
244 csincos(
double v,
double *sin_result,
double *cos_result) {
245 #if defined(_M_IX86) || defined(_X86_)
256 *sin_result = sin(v);
257 *cos_result = cos(v);
266 csin_over_x(
double v) {
267 if (1.0 + v * v == 1.0) {
297 catan2(
double y,
double x) {
326 cmod(
double x,
double y) {
327 return x - cfloor(x / y) * y;
335 cpow(
double x,
double y) {
367 #if __FINITE_MATH_ONLY__
369 union {
float f; uint32_t x; } u = { v };
370 return ((u.x << 1) > 0xff000000u);
371 #elif !defined(_WIN32)
372 return std::isnan(v);
374 return (_isnan(v) != 0);
384 #if __FINITE_MATH_ONLY__
386 union {
double d; uint64_t x; } u = { v };
387 return ((u.x << 1) > 0xff70000000000000ull);
388 #elif !defined(_WIN32)
389 return std::isnan(v);
391 return (_isnan(v) != 0);
401 #if __FINITE_MATH_ONLY__
403 union {
float f; uint32_t x; } u = { v };
404 return ((u.x << 1) == 0xff000000u);
405 #elif !defined(_WIN32)
406 return std::isinf(v);
408 return (_isnan(v) == 0 && _finite(v) == 0);
418 #if __FINITE_MATH_ONLY__
420 union {
double d; uint64_t x; } u = { v };
421 return ((u.x << 1) == 0xff70000000000000ull);
422 #elif !defined(_WIN32)
423 return std::isinf(v);
425 return (_isnan(v) == 0 && _finite(v) == 0);
435 return std::numeric_limits<float>::quiet_NaN();
444 return std::numeric_limits<double>::quiet_NaN();
453 return std::numeric_limits<float>::infinity();
462 return std::numeric_limits<double>::infinity();
478 return y - 1 - ((-x - 1) % y);