| // Copyright 2009 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 |
| |
| /* |
| Floating-point arcsine and arccosine. |
| |
| They are implemented by computing the arctangent |
| after appropriate range reduction. |
| */ |
| |
| // Asin returns the arcsine, in radians, of x. |
| // |
| // Special cases are: |
| // Asin(±0) = ±0 |
| // Asin(x) = NaN if x < -1 or x > 1 |
| func Asin(x float64) float64 { |
| if haveArchAsin { |
| return archAsin(x) |
| } |
| return asin(x) |
| } |
| |
| func asin(x float64) float64 { |
| if x == 0 { |
| return x // special case |
| } |
| sign := false |
| if x < 0 { |
| x = -x |
| sign = true |
| } |
| if x > 1 { |
| return NaN() // special case |
| } |
| |
| temp := Sqrt(1 - x*x) |
| if x > 0.7 { |
| temp = Pi/2 - satan(temp/x) |
| } else { |
| temp = satan(x / temp) |
| } |
| |
| if sign { |
| temp = -temp |
| } |
| return temp |
| } |
| |
| // Acos returns the arccosine, in radians, of x. |
| // |
| // Special case is: |
| // Acos(x) = NaN if x < -1 or x > 1 |
| func Acos(x float64) float64 { |
| if haveArchAcos { |
| return archAcos(x) |
| } |
| return acos(x) |
| } |
| |
| func acos(x float64) float64 { |
| return Pi/2 - Asin(x) |
| } |