double fmod(double x, double y) /* wrapper fmod */ { #ifdef CYGSEM_LIBM_COMPAT_IEEE_ONLY return __ieee754_fmod(x,y); #else double z; z = __ieee754_fmod(x,y); if(cyg_libm_get_compat_mode() == CYGNUM_LIBM_COMPAT_IEEE ||isnan(y)||isnan(x)) return z; if(y==0.0) { return __kernel_standard(x,y,27); /* fmod(x,0) */ } else return z; #endif }
double fmod(double x, double y) /* wrapper fmod */ { #ifdef _IEEE_LIBM return __ieee754_fmod(x,y); #else double z; z = __ieee754_fmod(x,y); if(_LIB_VERSION == _IEEE_ ||isnan(y)||isnan(x)) return z; if(y==0.0) { return __kernel_standard(x,y,27); /* fmod(x,0) */ } else return z; #endif }
void Math_fmod(void *fp) { F_Math_fmod *f; f = fp; *f->ret = __ieee754_fmod(f->x, f->y); }
/* wrapper fmod */ double __fmod (double x, double y) { if (__builtin_expect (isinf (x) || y == 0.0, 0) && _LIB_VERSION != _IEEE_ && !isnan (y) && !isnan (x)) /* fmod(+-Inf,y) or fmod(x,0) */ return __kernel_standard (x, y, 27); return __ieee754_fmod (x, y); }
/* wrapper fmodf */ float fmodf (float x, float y) { #if defined(__UCLIBC_HAS_FENV__) if (__builtin_expect (isinf (x) || y == 0.0f, 0) && _LIB_VERSION != _IEEE_ && !isnan (y) && !isnan (x)) /* fmod(+-Inf,y) or fmod(x,0) */ return __kernel_standard_f (x, y, 127); #endif return (float) __ieee754_fmod ((double) x,(double) y); }
EXPORT(sqInt) primitiveFMod(void) { double rcvr; double result; double arg; arg = interpreterProxy->stackFloatValue(0); rcvr = interpreterProxy->stackFloatValue(1); if (interpreterProxy->failed()) { return null; } result = __ieee754_fmod(rcvr, arg); if (isnan(result)) { return interpreterProxy->primitiveFail(); } interpreterProxy->pop((interpreterProxy->methodArgumentCount()) + 1); interpreterProxy->pushFloat(result); }
primitiveFMod(void) { // FloatMathPlugin>>#primitiveFMod double arg; double rcvr; double result; arg = stackFloatValue(0); rcvr = stackFloatValue(1); if (failed()) { return null; } result = __ieee754_fmod(rcvr, arg); if (isnan(result)) { return primitiveFail(); } pop((methodArgumentCount()) + 1); pushFloat(result); }
OLM_DLLEXPORT double __ieee754_remainder(double x, double p) { int32_t hx,hp; u_int32_t sx,lx,lp; double p_half; EXTRACT_WORDS(hx,lx,x); EXTRACT_WORDS(hp,lp,p); sx = hx&0x80000000; hp &= 0x7fffffff; hx &= 0x7fffffff; /* purge off exception values */ if((hp|lp)==0) return (x*p)/(x*p); /* p = 0 */ if((hx>=0x7ff00000)|| /* x not finite */ ((hp>=0x7ff00000)&& /* p is NaN */ (((hp-0x7ff00000)|lp)!=0))) return ((long double)x*p)/((long double)x*p); if (hp<=0x7fdfffff) x = __ieee754_fmod(x,p+p); /* now x < 2p */ if (((hx-hp)|(lx-lp))==0) return zero*x; x = fabs(x); p = fabs(p); if (hp<0x00200000) { if(x+x>p) { x-=p; if(x+x>=p) x -= p; } } else { p_half = 0.5*p; if(x>p_half) { x-=p; if(x>=p_half) x -= p; } } GET_HIGH_WORD(hx,x); if ((hx&0x7fffffff)==0) hx = 0; SET_HIGH_WORD(x,hx^sx); return x; }
Err mathlib_fmod(UInt16 refnum, double x, double y, double *result) { #pragma unused(refnum) *result = __ieee754_fmod(x, y); return mlErrNone; }
double __remquo (double x, double y, int *quo) { int64_t hx, hy; uint64_t sx, qs; int cquo; EXTRACT_WORDS64 (hx, x); EXTRACT_WORDS64 (hy, y); sx = hx & UINT64_C(0x8000000000000000); qs = sx ^ (hy & UINT64_C(0x8000000000000000)); hy &= UINT64_C(0x7fffffffffffffff); hx &= UINT64_C(0x7fffffffffffffff); /* Purge off exception values. */ if (__glibc_unlikely (hy == 0)) return (x * y) / (x * y); /* y = 0 */ if (__builtin_expect (hx >= UINT64_C(0x7ff0000000000000) /* x not finite */ || hy > UINT64_C(0x7ff0000000000000), 0))/* y is NaN */ return (x * y) / (x * y); if (hy <= UINT64_C(0x7fbfffffffffffff)) x = __ieee754_fmod (x, 8 * y); /* now x < 8y */ if (__glibc_unlikely (hx == hy)) { *quo = qs ? -1 : 1; return zero * x; } x = fabs (x); INSERT_WORDS64 (y, hy); cquo = 0; if (hy <= UINT64_C(0x7fcfffffffffffff) && x >= 4 * y) { x -= 4 * y; cquo += 4; } if (hy <= UINT64_C(0x7fdfffffffffffff) && x >= 2 * y) { x -= 2 * y; cquo += 2; } if (hy < UINT64_C(0x0020000000000000)) { if (x + x > y) { x -= y; ++cquo; if (x + x >= y) { x -= y; ++cquo; } } } else { double y_half = 0.5 * y; if (x > y_half) { x -= y; ++cquo; if (x >= y_half) { x -= y; ++cquo; } } } *quo = qs ? -cquo : cquo; /* Ensure correct sign of zero result in round-downward mode. */ if (x == 0.0) x = 0.0; if (sx) x = -x; return x; }
double __remquo (double x, double y, int *quo) { int32_t hx, hy; u_int32_t sx, lx, ly; int cquo, qs; EXTRACT_WORDS (hx, lx, x); EXTRACT_WORDS (hy, ly, y); sx = hx & 0x80000000; qs = sx ^ (hy & 0x80000000); hy &= 0x7fffffff; hx &= 0x7fffffff; /* Purge off exception values. */ if ((hy | ly) == 0) return (x * y) / (x * y); /* y = 0 */ if ((hx >= 0x7ff00000) /* x not finite */ || ((hy >= 0x7ff00000) /* p is NaN */ && (((hy - 0x7ff00000) | ly) != 0))) return (x * y) / (x * y); if (hy <= 0x7fbfffff) x = __ieee754_fmod (x, 8 * y); /* now x < 8y */ if (((hx - hy) | (lx - ly)) == 0) { *quo = qs ? -1 : 1; return zero * x; } x = fabs (x); y = fabs (y); cquo = 0; if (hy <= 0x7fcfffff && x >= 4 * y) { x -= 4 * y; cquo += 4; } if (hy <= 0x7fdfffff && x >= 2 * y) { x -= 2 * y; cquo += 2; } if (hy < 0x00200000) { if (x + x > y) { x -= y; ++cquo; if (x + x >= y) { x -= y; ++cquo; } } } else { double y_half = 0.5 * y; if (x > y_half) { x -= y; ++cquo; if (x >= y_half) { x -= y; ++cquo; } } } *quo = qs ? -cquo : cquo; /* Ensure correct sign of zero result in round-downward mode. */ if (x == 0.0) x = 0.0; if (sx) x = -x; return x; }
double fmod(double x, double y) { return __ieee754_fmod(x, y); }