e_acoshf.c revision 2117
1176434Skaiw/* e_acoshf.c -- float version of e_acosh.c.
2176434Skaiw * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
3176434Skaiw */
4176434Skaiw
5176434Skaiw/*
6176434Skaiw * ====================================================
7176434Skaiw * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
8176434Skaiw *
9176434Skaiw * Developed at SunPro, a Sun Microsystems, Inc. business.
10176434Skaiw * Permission to use, copy, modify, and distribute this
11176434Skaiw * software is freely granted, provided that this notice
12176434Skaiw * is preserved.
13176434Skaiw * ====================================================
14176434Skaiw */
15176434Skaiw
16176434Skaiw#ifndef lint
17176434Skaiwstatic char rcsid[] = "$Id: e_acoshf.c,v 1.2 1994/08/18 23:04:57 jtc Exp $";
18176434Skaiw#endif
19176434Skaiw
20176434Skaiw#include "math.h"
21176434Skaiw#include "math_private.h"
22176434Skaiw
23176434Skaiw#ifdef __STDC__
24176434Skaiwstatic const float
25176434Skaiw#else
26176434Skaiwstatic float
27176434Skaiw#endif
28176434Skaiwone	= 1.0,
29176434Skaiwln2	= 6.9314718246e-01;  /* 0x3f317218 */
30176434Skaiw
31176434Skaiw#ifdef __STDC__
32176434Skaiw	float __ieee754_acoshf(float x)
33176434Skaiw#else
34176434Skaiw	float __ieee754_acoshf(x)
35176434Skaiw	float x;
36176434Skaiw#endif
37176434Skaiw{
38176434Skaiw	float t;
39176434Skaiw	int32_t hx;
40176434Skaiw	GET_FLOAT_WORD(hx,x);
41176434Skaiw	if(hx<0x3f800000) {		/* x < 1 */
42176434Skaiw	    return (x-x)/(x-x);
43176434Skaiw	} else if(hx >=0x4d800000) {	/* x > 2**28 */
44285224Semaste	    if(hx >=0x7f800000) {	/* x is inf of NaN */
45176434Skaiw	        return x+x;
46176434Skaiw	    } else
47176434Skaiw		return __ieee754_logf(x)+ln2;	/* acosh(huge)=log(2x) */
48176434Skaiw	} else if (hx==0x3f800000) {
49176434Skaiw	    return 0.0;			/* acosh(1) = 0 */
50176434Skaiw	} else if (hx > 0x40000000) {	/* 2**28 > x > 2 */
51176434Skaiw	    t=x*x;
52176434Skaiw	    return __ieee754_logf((float)2.0*x-one/(x+sqrtf(t-one)));
53176434Skaiw	} else {			/* 1<x<2 */
54176434Skaiw	    t = x-one;
55176434Skaiw	    return log1pf(t+sqrtf((float)2.0*t+t*t));
56176434Skaiw	}
57176434Skaiw}
58176434Skaiw