void _CDTOD(d_complex_t *ret_val, d_complex_t x, _f_real16 *r) { _f_real16 __atan2l(_f_real16 ax, _f_real16 bx); _f_real16 __cosl(_f_real16 ax); _f_real16 __expl(_f_real16 ax); _f_real16 __logl(_f_real16 ax); _f_real16 __sinl(_f_real16 ax); _f_real16 _CDABS(d_complex_t z); _f_real16 y = *r; _f_real16 one; _f_real16 two; if (x.real == (_f_real16) 0.0 && x.imag == (_f_real16) 0.0) { if (y == (_f_real16) 0.0) { ret_val->real = _DBL_NaN; ret_val->imag = _DBL_NaN; } else { ret_val->real = (_f_real16) 0.0; ret_val->imag = (_f_real16) 0.0; } return; } one = y * __atan2l(x.imag, x.real); two = y * __logl(_CDABS(x)); ret_val->real = __expl(two) * __cosl(one); ret_val->imag = __expl(two) * __sinl(one); }
void _CDTOCD(d_complex_t *ret_val, d_complex_t x, d_complex_t y) { _f_real16 __atan2l(_f_real16 ax, _f_real16 bx); _f_real16 __cosl(_f_real16 ax); _f_real16 __expl(_f_real16 ax); _f_real16 __logl(_f_real16 ax); _f_real16 __sinl(_f_real16 ax); _f_real16 __sqrtl(_f_real16 ax); _f_real16 a; _f_real16 b; _f_real16 c; _f_real16 d; _f_real16 one; _f_real16 two; REGISTER_16 realx; REGISTER_16 imagx; _f_real16 loglabsx, atn2l, expltwo; if (x.real == 0.0 && x.imag == 0.0) { if (y.real == 0.0 && y.imag == 0.0) { ret_val->real = _DBL_NaN; ret_val->imag = _DBL_NaN; } else { ret_val->real = (_f_real16) 0.0; ret_val->imag = (_f_real16) 0.0; } return; } realx.f = x.real; imagx.f = x.imag; a = x.real; b = x.imag; c = y.real; d = y.imag; /* clear sign bit */ realx.ui[0] &= ~IEEE_128_64_SIGN_BIT; imagx.ui[0] &= ~IEEE_128_64_SIGN_BIT; atn2l = __atan2l(b,a); if (realx.f > imagx.f) loglabsx = __logl(realx.f * __sqrtl(1.0 + (imagx.f/realx.f) * (imagx.f/realx.f))); else loglabsx = __logl(imagx.f * __sqrtl(1.0 + (realx.f/imagx.f) * (realx.f/imagx.f))); one = d * loglabsx + c * atn2l; two = c * loglabsx - d * atn2l; expltwo = __expl(two); ret_val->real = expltwo * __cosl(one); ret_val->imag = expltwo * __sinl(one); }
void _CDEXP(d_complex_t *ret_val, d_complex_t z ) { _f_real16 __expl(_f_real16 x); _f_real16 __cosl(_f_real16 x); _f_real16 __sinl(_f_real16 x); ret_val->real = __expl(z.real) * __cosl(z.imag); ret_val->imag = __expl(z.real) * __sinl(z.imag); }
/* * DEXP: real(kind=16) - pass by value * 128-bit float exponential */ _f_real16 _DEXP( _f_real16 x ) { _f_real16 __expl(_f_real16 x); return ((_f_real16) __expl((_f_real16) x)); }
_f_real16 _DEXP_( _f_real16 *x ) { _f_real16 __expl(_f_real16 x); return ((_f_real16) __expl((_f_real16) *x)); }
long double __expm1l (long double x) { long double px, qx, xx; int32_t ix, sign; ieee854_long_double_shape_type u; int k; /* Detect infinity and NaN. */ u.value = x; ix = u.parts32.w0; sign = ix & 0x80000000; ix &= 0x7fffffff; if (!sign && ix >= 0x40060000) { /* If num is positive and exp >= 6 use plain exp. */ return __expl (x); } if (ix >= 0x7fff0000) { /* Infinity (which must be negative infinity). */ if (((ix & 0xffff) | u.parts32.w1 | u.parts32.w2 | u.parts32.w3) == 0) return -1.0L; /* NaN. No invalid exception. */ return x; } /* expm1(+- 0) = +- 0. */ if ((ix == 0) && (u.parts32.w1 | u.parts32.w2 | u.parts32.w3) == 0) return x; /* Minimum value. */ if (x < minarg) return (4.0/big - 1.0L); /* Avoid internal underflow when result does not underflow, while ensuring underflow (without returning a zero of the wrong sign) when the result does underflow. */ if (fabsl (x) < 0x1p-113L) { math_check_force_underflow (x); return x; } /* Express x = ln 2 (k + remainder), remainder not exceeding 1/2. */ xx = C1 + C2; /* ln 2. */ px = __floorl (0.5 + x / xx); k = px; /* remainder times ln 2 */ x -= px * C1; x -= px * C2; /* Approximate exp(remainder ln 2). */ px = (((((((P7 * x + P6) * x + P5) * x + P4) * x + P3) * x + P2) * x + P1) * x + P0) * x; qx = (((((((x + Q7) * x + Q6) * x + Q5) * x + Q4) * x + Q3) * x + Q2) * x + Q1) * x + Q0; xx = x * x; qx = x + (0.5 * xx + xx * px / qx); /* exp(x) = exp(k ln 2) exp(remainder ln 2) = 2^k exp(remainder ln 2). We have qx = exp(remainder ln 2) - 1, so exp(x) - 1 = 2^k (qx + 1) - 1 = 2^k qx + 2^k - 1. */ px = __ldexpl (1.0L, k); x = px * qx + (px - 1.0); return x; }