if(huge+x>one) return x;
if(really_big+x>one) return x;
	double fd_atan(double x)#else	double fd_atan(x)	double x;#endif{	double w,s1,s2,z;	int ix,hx,id;	hx = __HI(x);	ix = hx&0x7fffffff;	if(ix>=0x44100000) {	/* if |x| >= 2^66 */	    if(ix>0x7ff00000||		(ix==0x7ff00000&&(__LO(x)!=0)))		return x+x;		/* NaN */	    if(hx>0) return  atanhi[3]+atanlo[3];	    else     return -atanhi[3]-atanlo[3];	} if (ix < 0x3fdc0000) {	/* |x| < 0.4375 */	    if (ix < 0x3e200000) {	/* |x| < 2^-29 */		if(huge+x>one) return x;	/* raise inexact */	    }	    id = -1;	} else {	x = fd_fabs(x);	if (ix < 0x3ff30000) {		/* |x| < 1.1875 */	    if (ix < 0x3fe60000) {	/* 7/16 <=|x|<11/16 */		id = 0; x = (2.0*x-one)/(2.0+x); 	    } else {			/* 11/16<=|x|< 19/16 */		id = 1; x  = (x-one)/(x+one); 	    }	} else {	    if (ix < 0x40038000) {	/* |x| < 2.4375 */		id = 2; x  = (x-1.5)/(one+1.5*x);	    } else {			/* 2.4375 <= |x| < 2^66 */		id = 3; x  = -1.0/x;	    }	}}    /* end of argument reduction */	z = x*x;	w = z*z;    /* break sum from i=0 to 10 aT[i]z**(i+1) into odd and even poly */	s1 = z*(aT[0]+w*(aT[2]+w*(aT[4]+w*(aT[6]+w*(aT[8]+w*aT[10])))));	s2 = w*(aT[1]+w*(aT[3]+w*(aT[5]+w*(aT[7]+w*aT[9]))));	if (id<0) return x - x*(s1+s2);	else {	    z = atanhi[id] - ((x*(s1+s2) - atanlo[id]) - x);	    return (hx<0)? -z:z;	}}