__complex__ float __cprojf (__complex__ float x) { if (__isinf_nsf (__real__ x) || __isinf_nsf (__imag__ x)) { __complex__ float res; __real__ res = INFINITY; __imag__ res = __copysignf (0.0, __imag__ x); return res; } return x; }
/* wrapper remainderf */ float __remainderf (float x, float y) { if (((__builtin_expect (y == 0.0f, 0) && ! __isnanf (x)) || (__builtin_expect (__isinf_nsf (x), 0) && ! __isnanf (y))) && _LIB_VERSION != _IEEE_) return __kernel_standard_f (x, y, 128); /* remainder domain */ return __ieee754_remainderf (x, y); }
/* wrapper fmodf */ float __fmodf (float x, float y) { if (__builtin_expect (__isinf_nsf (x) || y == 0.0f, 0) && _LIB_VERSION != _IEEE_ && !__isnanf (y) && !__isnanf (x)) /* fmod(+-Inf,y) or fmod(x,0) */ return __kernel_standard_f (x, y, 127); return __ieee754_fmodf (x, y); }
__complex__ float __ctanhf (__complex__ float x) { __complex__ float res; if (__builtin_expect (!isfinite (__real__ x) || !isfinite (__imag__ x), 0)) { if (__isinf_nsf (__real__ x)) { __real__ res = __copysignf (1.0, __real__ x); __imag__ res = __copysignf (0.0, __imag__ x); } else if (__imag__ x == 0.0) { res = x; } else { __real__ res = __nanf (""); __imag__ res = __nanf (""); if (__isinf_nsf (__imag__ x)) feraiseexcept (FE_INVALID); } } else { float sinix, cosix; float den; const int t = (int) ((FLT_MAX_EXP - 1) * M_LN2 / 2); /* tanh(x+iy) = (sinh(2x) + i*sin(2y))/(cosh(2x) + cos(2y)) = (sinh(x)*cosh(x) + i*sin(y)*cos(y))/(sinh(x)^2 + cos(y)^2). */ if (__builtin_expect (fpclassify(__imag__ x) != FP_SUBNORMAL, 1)) { __sincosf (__imag__ x, &sinix, &cosix); } else { sinix = __imag__ x; cosix = 1.0f; } if (fabsf (__real__ x) > t) { /* Avoid intermediate overflow when the imaginary part of the result may be subnormal. Ignoring negligible terms, the real part is +/- 1, the imaginary part is sin(y)*cos(y)/sinh(x)^2 = 4*sin(y)*cos(y)/exp(2x). */ float exp_2t = __ieee754_expf (2 * t); __real__ res = __copysignf (1.0, __real__ x); __imag__ res = 4 * sinix * cosix; __real__ x = fabsf (__real__ x); __real__ x -= t; __imag__ res /= exp_2t; if (__real__ x > t) { /* Underflow (original real part of x has absolute value > 2t). */ __imag__ res /= exp_2t; } else __imag__ res /= __ieee754_expf (2 * __real__ x); } else { float sinhrx, coshrx; if (fabsf (__real__ x) > FLT_MIN) { sinhrx = __ieee754_sinhf (__real__ x); coshrx = __ieee754_coshf (__real__ x); } else { sinhrx = __real__ x; coshrx = 1.0f; } if (fabsf (sinhrx) > fabsf (cosix) * FLT_EPSILON) den = sinhrx * sinhrx + cosix * cosix; else den = cosix * cosix; __real__ res = sinhrx * coshrx / den; __imag__ res = sinix * cosix / den; } } return res; }