]>
Commit | Line | Data |
---|---|---|
7a938933 ILT |
1 | // Copyright 2010 The Go Authors. All rights reserved. |
2 | // Use of this source code is governed by a BSD-style | |
3 | // license that can be found in the LICENSE file. | |
4 | ||
5 | package math | |
6 | ||
7a938933 ILT |
7 | // The original C code, the long comment, and the constants |
8 | // below are from FreeBSD's /usr/src/lib/msun/src/e_acosh.c | |
9 | // and came with this notice. The go code is a simplified | |
10 | // version of the original C. | |
11 | // | |
12 | // ==================================================== | |
13 | // Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. | |
14 | // | |
15 | // Developed at SunPro, a Sun Microsystems, Inc. business. | |
16 | // Permission to use, copy, modify, and distribute this | |
17 | // software is freely granted, provided that this notice | |
18 | // is preserved. | |
19 | // ==================================================== | |
20 | // | |
21 | // | |
22 | // __ieee754_acosh(x) | |
23 | // Method : | |
24 | // Based on | |
25 | // acosh(x) = log [ x + sqrt(x*x-1) ] | |
26 | // we have | |
27 | // acosh(x) := log(x)+ln2, if x is large; else | |
28 | // acosh(x) := log(2x-1/(sqrt(x*x-1)+x)) if x>2; else | |
29 | // acosh(x) := log1p(t+sqrt(2.0*t+t*t)); where t=x-1. | |
30 | // | |
31 | // Special cases: | |
32 | // acosh(x) is NaN with signal if x<1. | |
33 | // acosh(NaN) is NaN without signal. | |
34 | // | |
35 | ||
4ccad563 | 36 | // Acosh returns the inverse hyperbolic cosine of x. |
7a938933 ILT |
37 | // |
38 | // Special cases are: | |
9a0e3259 | 39 | // Acosh(+Inf) = +Inf |
7a938933 ILT |
40 | // Acosh(x) = NaN if x < 1 |
41 | // Acosh(NaN) = NaN | |
42 | func Acosh(x float64) float64 { | |
43 | const ( | |
44 | Ln2 = 6.93147180559945286227e-01 // 0x3FE62E42FEFA39EF | |
45 | Large = 1 << 28 // 2**28 | |
46 | ) | |
7a938933 ILT |
47 | // first case is special case |
48 | switch { | |
94252f4b | 49 | case x < 1 || IsNaN(x): |
7a938933 ILT |
50 | return NaN() |
51 | case x == 1: | |
52 | return 0 | |
53 | case x >= Large: | |
54 | return Log(x) + Ln2 // x > 2**28 | |
55 | case x > 2: | |
56 | return Log(2*x - 1/(x+Sqrt(x*x-1))) // 2**28 > x > 2 | |
57 | } | |
58 | t := x - 1 | |
59 | return Log1p(t + Sqrt(2*t+t*t)) // 2 >= x > 1 | |
60 | } |