#include <float.h>
#include <math.h>
#include "invtrig.h"
#include "math_private.h"
#ifdef EXT_IMPLICIT_NBIT
#define LDBL_NBIT 0
#else
#define LDBL_NBIT 0x80000000
#endif
static const long double
one= 1.00000000000000000000e+00;
#if defined(__amd64__) || defined(__i386__)
static volatile double
pi1 = 3.14159265358979311600e+00,
pi2 = 1.22514845490862001043e-16;
#define pi ((long double)pi1 + pi2)
#else
static const long double
pi = 3.14159265358979323846264338327950280e+00L;
#endif
long double
acosl(long double x)
{
union {
long double e;
struct ieee_ext bits;
} u;
long double z,p,q,r,w,s,c,df;
int16_t expsign, expt;
u.e = x;
expsign = (u.bits.ext_sign << 15) | u.bits.ext_exp;
expt = expsign & 0x7fff;
if(expt >= BIAS) {
if(expt==BIAS && ((u.bits.ext_frach&~LDBL_NBIT)
#ifdef EXT_FRACHMBITS
| u.bits.ext_frachm
#endif
#ifdef EXT_FRACLMBITS
| u.bits.ext_fraclm
#endif
| u.bits.ext_fracl)==0) {
if (expsign>0) return 0.0;
else return pi+2.0*pio2_lo;
}
return (x-x)/(x-x);
}
if(expt<BIAS-1) {
if(expt<ACOS_CONST) return pio2_hi+pio2_lo;
z = x*x;
p = P(z);
q = Q(z);
r = p/q;
return pio2_hi - (x - (pio2_lo-x*r));
} else if (expsign<0) {
z = (one+x)*0.5;
p = P(z);
q = Q(z);
s = sqrtl(z);
r = p/q;
w = r*s-pio2_lo;
return pi - 2.0*(s+w);
} else {
z = (one-x)*0.5;
s = sqrtl(z);
u.e = s;
u.bits.ext_fracl = 0;
#ifdef EXT_FRACLMBITS
u.bits.ext_fraclm = 0;
#endif
df = u.e;
c = (z-df*df)/(s+df);
p = P(z);
q = Q(z);
r = p/q;
w = r*s+c;
return 2.0*(df+w);
}
}