1 | /* e_acoshf.c -- float version of e_acosh.c. |
2 | */ |
3 | |
4 | /* |
5 | * ==================================================== |
6 | * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. |
7 | * |
8 | * Developed at SunPro, a Sun Microsystems, Inc. business. |
9 | * Permission to use, copy, modify, and distribute this |
10 | * software is freely granted, provided that this notice |
11 | * is preserved. |
12 | * ==================================================== |
13 | */ |
14 | |
15 | #if defined(LIBM_SCCS) && !defined(lint) |
16 | static char rcsid[] = "$NetBSD: e_acoshf.c,v 1.5 1995/05/12 04:57:20 jtc Exp $" ; |
17 | #endif |
18 | |
19 | #include <math.h> |
20 | #include <math_private.h> |
21 | #include <libm-alias-finite.h> |
22 | |
23 | static const float |
24 | one = 1.0, |
25 | ln2 = 6.9314718246e-01; /* 0x3f317218 */ |
26 | |
27 | float __ieee754_acoshf(float x) |
28 | { |
29 | float t; |
30 | int32_t hx; |
31 | GET_FLOAT_WORD(hx,x); |
32 | if(hx<0x3f800000) { /* x < 1 */ |
33 | return (x-x)/(x-x); |
34 | } else if(hx >=0x4d800000) { /* x > 2**28 */ |
35 | if(hx >=0x7f800000) { /* x is inf of NaN */ |
36 | return x+x; |
37 | } else |
38 | return __ieee754_logf(x)+ln2; /* acosh(huge)=log(2x) */ |
39 | } else if (hx==0x3f800000) { |
40 | return 0.0; /* acosh(1) = 0 */ |
41 | } else if (hx > 0x40000000) { /* 2**28 > x > 2 */ |
42 | t=x*x; |
43 | return __ieee754_logf((float)2.0*x-one/(x+sqrtf(t-one))); |
44 | } else { /* 1<x<2 */ |
45 | t = x-one; |
46 | return __log1pf(t+sqrtf((float)2.0*t+t*t)); |
47 | } |
48 | } |
49 | libm_alias_finite (__ieee754_acoshf, __acoshf) |
50 | |