summaryrefslogtreecommitdiff
path: root/src/pkg/math/acosh.go
diff options
context:
space:
mode:
authorCharles L. Dorian <cldorian@gmail.com>2010-02-01 22:21:40 -0800
committerCharles L. Dorian <cldorian@gmail.com>2010-02-01 22:21:40 -0800
commitf1ad43664b0aaa6451fc18aa45dbfb46a2f15668 (patch)
treea7151568ff17feef7ac097f334664920b10bfe37 /src/pkg/math/acosh.go
parent10fe284717110a092428c7889831de187737b933 (diff)
downloadgolang-f1ad43664b0aaa6451fc18aa45dbfb46a2f15668.tar.gz
math: add functions; update tests and special cases
Added special cases to comments for asin.go and fabs.go. Added Trunc() to floor.go and floor_386.s. Fixed formatting error in hypot_386.s Added new functions Acosh, Asinh, Atanh, Copysign, Erf, Erfc, Expm1, and Log1p. Added 386 FPU version of Fmod. Added tests, benchmarks, and precision to expected results in all_test.go. Edited makefile so it all compiles. R=rsc CC=golang-dev http://codereview.appspot.com/195052 Committer: Russ Cox <rsc@golang.org>
Diffstat (limited to 'src/pkg/math/acosh.go')
-rw-r--r--src/pkg/math/acosh.go59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/pkg/math/acosh.go b/src/pkg/math/acosh.go
new file mode 100644
index 000000000..1f0d3f338
--- /dev/null
+++ b/src/pkg/math/acosh.go
@@ -0,0 +1,59 @@
+// Copyright 2010 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package math
+
+
+// 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(x) calculates the inverse hyperbolic cosine of x.
+//
+// Special cases are:
+// Acosh(x) = NaN if x < 1
+// Acosh(NaN) = NaN
+func Acosh(x float64) float64 {
+ const (
+ Ln2 = 6.93147180559945286227e-01 // 0x3FE62E42FEFA39EF
+ Large = 1 << 28 // 2^28
+ )
+ 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
+}