1 
/* * Mode: C; tabwidth: 8; indenttabsmode: nil; cbasicoffset: 4 * 
2 
* 
3 
* ***** BEGIN LICENSE BLOCK ***** 
4 
* Version: MPL 1.1/GPL 2.0/LGPL 2.1 
5 
* 
6 
* The contents of this file are subject to the Mozilla Public License Version 
7 
* 1.1 (the "License"); you may not use this file except in compliance with 
8 
* the License. You may obtain a copy of the License at 
9 
* http://www.mozilla.org/MPL/ 
10 
* 
11 
* Software distributed under the License is distributed on an "AS IS" basis, 
12 
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 
13 
* for the specific language governing rights and limitations under the 
14 
* License. 
15 
* 
16 
* The Original Code is Mozilla Communicator client code, released 
17 
* March 31, 1998. 
18 
* 
19 
* The Initial Developer of the Original Code is 
20 
* Sun Microsystems, Inc. 
21 
* Portions created by the Initial Developer are Copyright (C) 1998 
22 
* the Initial Developer. All Rights Reserved. 
23 
* 
24 
* Contributor(s): 
25 
* 
26 
* Alternatively, the contents of this file may be used under the terms of 
27 
* either of the GNU General Public License Version 2 or later (the "GPL"), 
28 
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), 
29 
* in which case the provisions of the GPL or the LGPL are applicable instead 
30 
* of those above. If you wish to allow use of your version of this file only 
31 
* under the terms of either the GPL or the LGPL, and not to allow others to 
32 
* use your version of this file under the terms of the MPL, indicate your 
33 
* decision by deleting the provisions above and replace them with the notice 
34 
* and other provisions required by the GPL or the LGPL. If you do not delete 
35 
* the provisions above, a recipient may use your version of this file under 
36 
* the terms of any one of the MPL, the GPL or the LGPL. 
37 
* 
38 
* ***** END LICENSE BLOCK ***** */ 
39 

40 
/* @(#)s_asinh.c 1.3 95/01/18 */ 
41 
/* 
42 
* ==================================================== 
43 
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. 
44 
* 
45 
* Developed at SunSoft, a Sun Microsystems, Inc. business. 
46 
* Permission to use, copy, modify, and distribute this 
47 
* software is freely granted, provided that this notice 
48 
* is preserved. 
49 
* ==================================================== 
50 
*/ 
51 

52 
/* asinh(x) 
53 
* Method : 
54 
* Based on 
55 
* asinh(x) = sign(x) * log [ x + sqrt(x*x+1) ] 
56 
* we have 
57 
* asinh(x) := x if 1+x*x=1, 
58 
* := sign(x)*(log(x)+ln2)) for large x, else 
59 
* := sign(x)*log(2x+1/(x+sqrt(x*x+1))) ifx>2, else 
60 
* := sign(x)*log1p(x + x^2/(1 + sqrt(1+x^2))) 
61 
*/ 
62 

63 
#include "fdlibm.h" 
64 

65 
#ifdef __STDC__ 
66 
static const double 
67 
#else 
68 
static double 
69 
#endif 
70 
one = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */ 
71 
ln2 = 6.93147180559945286227e01, /* 0x3FE62E42, 0xFEFA39EF */ 
72 
really_big= 1.00000000000000000000e+300; 
73 

74 
#ifdef __STDC__ 
75 
double fd_asinh(double x) 
76 
#else 
77 
double fd_asinh(x) 
78 
double x; 
79 
#endif 
80 
{ 
81 
fd_twoints u; 
82 
double t,w; 
83 
int hx,ix; 
84 
u.d = x; 
85 
hx = __HI(u); 
86 
ix = hx&0x7fffffff; 
87 
if(ix>=0x7ff00000) return x+x; /* x is inf or NaN */ 
88 
if(ix< 0x3e300000) { /* x<2**28 */ 
89 
if(really_big+x>one) return x; /* return x inexact except 0 */ 
90 
} 
91 
if(ix>0x41b00000) { /* x > 2**28 */ 
92 
w = __ieee754_log(fd_fabs(x))+ln2; 
93 
} else if (ix>0x40000000) { /* 2**28 > x > 2.0 */ 
94 
t = fd_fabs(x); 
95 
w = __ieee754_log(2.0*t+one/(fd_sqrt(x*x+one)+t)); 
96 
} else { /* 2.0 > x > 2**28 */ 
97 
t = x*x; 
98 
w =fd_log1p(fd_fabs(x)+t/(one+fd_sqrt(one+t))); 
99 
} 
100 
if(hx>0) return w; else return w; 
101 
} 