double tan(double x) { double y[2]; uint32_t ix; unsigned n; GET_HIGH_WORD(ix, x); ix &= 0x7fffffff; /* |x| ~< pi/4 */ if (ix <= 0x3fe921fb) { if (ix < 0x3e400000) { /* |x| < 2**-27 */ /* raise inexact if x!=0 and underflow if subnormal */ FORCE_EVAL(ix < 0x00100000 ? x / 0x1p120f : x + 0x1p120f); return x; } return __tan(x, 0.0, 0); } /* tan(Inf or NaN) is NaN */ if (ix >= 0x7ff00000) return x - x; /* argument reduction */ n = __rem_pio2(x, y); return __tan(y[0], y[1], n & 1); }
/* * TAN: TAN of real(kind=8) - pass by address */ _f_real8 _TAN_( _f_real8 *x ) { _f_real8 __tan(_f_real8 x); return ( (_f_real8) __tan((_f_real8) *x)); }
Err mathlib_tan(UInt16 refnum, double x, double *result) { #pragma unused(refnum) *result = __tan(x); return mlErrNone; }
/* * HTAN: TAN of real(kind=4) - pass by value */ _f_real4 _HTAN( _f_real4 x ) { _f_real8 __tan(_f_real8 x); return ( (_f_real4) __tan((_f_real8) x) ); }
double tan( double x ) { return __tan( x ); }