| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- package math32
- // The original C code, the long comment, and the constants
- // below are from FreeBSD's /usr/src/lib/msun/src/e_acosh.c
- // and came with this notice. The go code is a simplified
- // version of the original C.
- //
- // ====================================================
- // Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- //
- // Developed at SunPro, a Sun Microsystems, Inc. business.
- // Permission to use, copy, modify, and distribute this
- // software is freely granted, provided that this notice
- // is preserved.
- // ====================================================
- //
- //
- // __ieee754_acosh(x)
- // Method :
- // Based on
- // acosh(x) = log [ x + sqrt(x*x-1) ]
- // we have
- // acosh(x) := log(x)+ln2, if x is large; else
- // acosh(x) := log(2x-1/(sqrt(x*x-1)+x)) if x>2; else
- // acosh(x) := log1p(t+sqrt(2.0*t+t*t)); where t=x-1.
- //
- // Special cases:
- // acosh(x) is NaN with signal if x<1.
- // acosh(NaN) is NaN without signal.
- //
- // Acosh returns the inverse hyperbolic cosine of x.
- //
- // Special cases are:
- // Acosh(+Inf) = +Inf
- // Acosh(x) = NaN if x < 1
- // Acosh(NaN) = NaN
- func Acosh(x float32) float32 {
- const Large = 1 << 28 // 2**28
- // first case is special case
- switch {
- case x < 1 || IsNaN(x):
- return NaN()
- case x == 1:
- return 0
- case x >= Large:
- return Log(x) + Ln2 // x > 2**28
- case x > 2:
- return Log(2*x - 1/(x+Sqrt(x*x-1))) // 2**28 > x > 2
- }
- t := x - 1
- return Log1p(t + Sqrt(2*t+t*t)) // 2 >= x > 1
- }
|