]>
Commit | Line | Data |
---|---|---|
6e953631 UD |
1 | /* s_asinhl.c -- long double version of s_asinh.c. |
2 | * Conversion to long double by Ulrich Drepper, | |
3 | * Cygnus Support, drepper@cygnus.com. | |
4 | */ | |
5 | ||
6 | /* | |
7 | * ==================================================== | |
8 | * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. | |
9 | * | |
10 | * Developed at SunPro, a Sun Microsystems, Inc. business. | |
11 | * Permission to use, copy, modify, and distribute this | |
12 | * software is freely granted, provided that this notice | |
13 | * is preserved. | |
14 | * ==================================================== | |
15 | */ | |
16 | ||
17 | #if defined(LIBM_SCCS) && !defined(lint) | |
18 | static char rcsid[] = "$NetBSD: $"; | |
19 | #endif | |
20 | ||
21 | /* asinhl(x) | |
22 | * Method : | |
23 | * Based on | |
24 | * asinhl(x) = signl(x) * logl [ |x| + sqrtl(x*x+1) ] | |
25 | * we have | |
26 | * asinhl(x) := x if 1+x*x=1, | |
27 | * := signl(x)*(logl(x)+ln2)) for large |x|, else | |
28 | * := signl(x)*logl(2|x|+1/(|x|+sqrtl(x*x+1))) if|x|>2, else | |
29 | * := signl(x)*log1pl(|x| + x^2/(1 + sqrtl(1+x^2))) | |
30 | */ | |
31 | ||
32 | #include "math.h" | |
33 | #include "math_private.h" | |
34 | ||
35 | #ifdef __STDC__ | |
36 | static const long double | |
37 | #else | |
38 | static long double | |
39 | #endif | |
40 | one = 1.000000000000000000000e+00L, /* 0x3FFF, 0x00000000, 0x00000000 */ | |
41 | ln2 = 6.931471805599453094287e-01L, /* 0x3FFE, 0xB17217F7, 0xD1CF79AC */ | |
cccda09f | 42 | huge= 1.000000000000000000e+4900L; |
6e953631 UD |
43 | |
44 | #ifdef __STDC__ | |
45 | long double __asinhl(long double x) | |
46 | #else | |
47 | long double __asinhl(x) | |
48 | long double x; | |
49 | #endif | |
50 | { | |
51 | long double t,w; | |
52 | int32_t hx,ix; | |
53 | GET_LDOUBLE_EXP(hx,x); | |
54 | ix = hx&0x7fff; | |
0ac5ae23 | 55 | if(__builtin_expect(ix< 0x3fde, 0)) { /* |x|<2**-34 */ |
6e953631 UD |
56 | if(huge+x>one) return x; /* return x inexact except 0 */ |
57 | } | |
0ac5ae23 UD |
58 | if(__builtin_expect(ix>0x4020,0)) { /* |x| > 2**34 */ |
59 | if(ix==0x7fff) return x+x; /* x is inf or NaN */ | |
6e953631 | 60 | w = __ieee754_logl(fabsl(x))+ln2; |
0ac5ae23 UD |
61 | } else { |
62 | long double xa = fabsl(x); | |
63 | if (ix>0x4000) { /* 2**34 > |x| > 2.0 */ | |
64 | w = __ieee754_logl(2.0*xa+one/(__ieee754_sqrtl(xa*xa+one)+xa)); | |
65 | } else { /* 2.0 > |x| > 2**-28 */ | |
66 | t = xa*xa; | |
67 | w =__log1pl(xa+t/(one+__ieee754_sqrtl(one+t))); | |
68 | } | |
6e953631 | 69 | } |
0ac5ae23 | 70 | return __copysignl(w, x); |
6e953631 UD |
71 | } |
72 | weak_alias (__asinhl, asinhl) |