1*c9945492SAndroid Build Coastguard Worker #include "libm.h" 2*c9945492SAndroid Build Coastguard Worker 3*c9945492SAndroid Build Coastguard Worker #if FLT_EVAL_METHOD==2 4*c9945492SAndroid Build Coastguard Worker #undef sqrtf 5*c9945492SAndroid Build Coastguard Worker #define sqrtf sqrtl 6*c9945492SAndroid Build Coastguard Worker #elif FLT_EVAL_METHOD==1 7*c9945492SAndroid Build Coastguard Worker #undef sqrtf 8*c9945492SAndroid Build Coastguard Worker #define sqrtf sqrt 9*c9945492SAndroid Build Coastguard Worker #endif 10*c9945492SAndroid Build Coastguard Worker 11*c9945492SAndroid Build Coastguard Worker /* acosh(x) = log(x + sqrt(x*x-1)) */ acoshf(float x)12*c9945492SAndroid Build Coastguard Workerfloat acoshf(float x) 13*c9945492SAndroid Build Coastguard Worker { 14*c9945492SAndroid Build Coastguard Worker union {float f; uint32_t i;} u = {x}; 15*c9945492SAndroid Build Coastguard Worker uint32_t a = u.i & 0x7fffffff; 16*c9945492SAndroid Build Coastguard Worker 17*c9945492SAndroid Build Coastguard Worker if (a < 0x3f800000+(1<<23)) 18*c9945492SAndroid Build Coastguard Worker /* |x| < 2, invalid if x < 1 */ 19*c9945492SAndroid Build Coastguard Worker /* up to 2ulp error in [1,1.125] */ 20*c9945492SAndroid Build Coastguard Worker return log1pf(x-1 + sqrtf((x-1)*(x-1)+2*(x-1))); 21*c9945492SAndroid Build Coastguard Worker if (u.i < 0x3f800000+(12<<23)) 22*c9945492SAndroid Build Coastguard Worker /* 2 <= x < 0x1p12 */ 23*c9945492SAndroid Build Coastguard Worker return logf(2*x - 1/(x+sqrtf(x*x-1))); 24*c9945492SAndroid Build Coastguard Worker /* x >= 0x1p12 or x <= -2 or nan */ 25*c9945492SAndroid Build Coastguard Worker return logf(x) + 0.693147180559945309417232121458176568f; 26*c9945492SAndroid Build Coastguard Worker } 27