1// Copyright 2009 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
5package math
6
7/*
8	Floating-point arcsine and arccosine.
9
10	They are implemented by computing the arctangent
11	after appropriate range reduction.
12*/
13
14// Asin returns the arcsine, in radians, of x.
15//
16// Special cases are:
17//	Asin(±0) = ±0
18//	Asin(x) = NaN if x < -1 or x > 1
19
20//extern asin
21func libc_asin(float64) float64
22
23func Asin(x float64) float64 {
24	return libc_asin(x)
25}
26
27func asin(x float64) float64 {
28	if x == 0 {
29		return x // special case
30	}
31	sign := false
32	if x < 0 {
33		x = -x
34		sign = true
35	}
36	if x > 1 {
37		return NaN() // special case
38	}
39
40	temp := Sqrt(1 - x*x)
41	if x > 0.7 {
42		temp = Pi/2 - satan(temp/x)
43	} else {
44		temp = satan(x / temp)
45	}
46
47	if sign {
48		temp = -temp
49	}
50	return temp
51}
52
53// Acos returns the arccosine, in radians, of x.
54//
55// Special case is:
56//	Acos(x) = NaN if x < -1 or x > 1
57
58//extern acos
59func libc_acos(float64) float64
60
61func Acos(x float64) float64 {
62	return libc_acos(x)
63}
64
65func acos(x float64) float64 {
66	return Pi/2 - Asin(x)
67}
68