11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* e_acoshf.c -- float version of e_acosh.c.
21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ====================================================
71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Developed at SunPro, a Sun Microsystems, Inc. business.
101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Permission to use, copy, modify, and distribute this
111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * software is freely granted, provided that this notice
121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * is preserved.
131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ====================================================
141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
16a0ee07829a9ba7e99ef68e8c12551301cc797f0fElliott Hughes#include <sys/cdefs.h>
17a0ee07829a9ba7e99ef68e8c12551301cc797f0fElliott Hughes__FBSDID("$FreeBSD$");
181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "math.h"
201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "math_private.h"
211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const float
231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectone	= 1.0,
241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectln2	= 6.9314718246e-01;  /* 0x3f317218 */
251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectfloat
271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__ieee754_acoshf(float x)
281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{
291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	float t;
301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	int32_t hx;
311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	GET_FLOAT_WORD(hx,x);
321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	if(hx<0x3f800000) {		/* x < 1 */
331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    return (x-x)/(x-x);
341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	} else if(hx >=0x4d800000) {	/* x > 2**28 */
351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    if(hx >=0x7f800000) {	/* x is inf of NaN */
361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	        return x+x;
371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    } else
381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project		return __ieee754_logf(x)+ln2;	/* acosh(huge)=log(2x) */
391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	} else if (hx==0x3f800000) {
401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    return 0.0;			/* acosh(1) = 0 */
411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	} else if (hx > 0x40000000) {	/* 2**28 > x > 2 */
421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    t=x*x;
431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    return __ieee754_logf((float)2.0*x-one/(x+__ieee754_sqrtf(t-one)));
441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	} else {			/* 1<x<2 */
451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    t = x-one;
461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	    return log1pf(t+__ieee754_sqrtf((float)2.0*t+t*t));
471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	}
481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}
49