14#ifdef __INTEL_COMPILER
16#define FPU_CONTROLWORD_WRITEMASK 0xFFFFF
17#define FPU_CONTROLWORD_NEW_SETTING _CW_DEFAULT
47INLINE
float ctan(
float v) {
55csincos(
float v,
float *sin_result,
float *cos_result) {
57#if defined(_M_IX86) || defined(_X86_)
68 *sin_result = sinf(v);
69 *cos_result = cosf(v);
78 if (1.0f + v * v == 1.0f) {
105catan2(
float y,
float x) {
131 return x - floor(x / y) * y;
138cpow(
float x,
float y) {
148 #ifdef __INTEL_COMPILER
151 unsigned int saved_fpu_control_word=_controlfp(0x0,0x0);
152 _controlfp(FPU_CONTROLWORD_NEW_SETTING,FPU_CONTROLWORD_WRITEMASK);
153 double retval=floor(f);
154 _controlfp(saved_fpu_control_word,FPU_CONTROLWORD_WRITEMASK);
166 #ifdef __INTEL_COMPILER
169 unsigned int saved_fpu_control_word=_controlfp(0x0,0x0);
170 _controlfp(FPU_CONTROLWORD_NEW_SETTING,FPU_CONTROLWORD_WRITEMASK);
171 double retval=ceil(f);
172 _controlfp(saved_fpu_control_word,FPU_CONTROLWORD_WRITEMASK);
184 return f - cfloor(f);
223csincos(
double v,
double *sin_result,
double *cos_result) {
224#if defined(_M_IX86) || defined(_X86_)
235 *sin_result = sin(v);
236 *cos_result = cos(v);
245 if (1.0 + v * v == 1.0) {
272catan2(
double y,
double x) {
298 return x - cfloor(x / y) * y;
305cpow(
double x,
double y) {
335#if __FINITE_MATH_ONLY__
337 union {
float f; uint32_t x; } u = { v };
338 return ((u.x << 1) > 0xff000000u);
339#elif !defined(_WIN32)
340 return std::isnan(v);
342 return (_isnan(v) != 0);
351#if __FINITE_MATH_ONLY__
353 union {
double d; uint64_t x; } u = { v };
354 return ((u.x << 1) > 0xffe0000000000000ull);
355#elif !defined(_WIN32)
356 return std::isnan(v);
358 return (_isnan(v) != 0);
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::isinf(v);
374 return (_isnan(v) == 0 && _finite(v) == 0);
383#if __FINITE_MATH_ONLY__
385 union {
double d; uint64_t x; } u = { v };
386 return ((u.x << 1) == 0xffe0000000000000ull);
387#elif !defined(_WIN32)
388 return std::isinf(v);
390 return (_isnan(v) == 0 && _finite(v) == 0);
399 return std::numeric_limits<float>::quiet_NaN();
407 return std::numeric_limits<double>::quiet_NaN();
415 return std::numeric_limits<float>::infinity();
423 return std::numeric_limits<double>::infinity();
436 return y - 1 - ((-x - 1) % y);
float csin_over_x(float v)
Computes sin(x) / x, well-behaved as x approaches 0.
float cmod(float x, float y)
This is similar to fmod(), but it behaves properly when x is negative: that is, it always returns a v...
double cfrac(double f)
Returns the fractional component of f: f - cfloor(f).