github.com/m10x/go/src@v0.0.0-20220112094212-ba61592315da/math/asin.go (about) 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 5 package 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 func Asin(x float64) float64 { 20 if haveArchAsin { 21 return archAsin(x) 22 } 23 return asin(x) 24 } 25 26 func asin(x float64) float64 { 27 if x == 0 { 28 return x // special case 29 } 30 sign := false 31 if x < 0 { 32 x = -x 33 sign = true 34 } 35 if x > 1 { 36 return NaN() // special case 37 } 38 39 temp := Sqrt(1 - x*x) 40 if x > 0.7 { 41 temp = Pi/2 - satan(temp/x) 42 } else { 43 temp = satan(x / temp) 44 } 45 46 if sign { 47 temp = -temp 48 } 49 return temp 50 } 51 52 // Acos returns the arccosine, in radians, of x. 53 // 54 // Special case is: 55 // Acos(x) = NaN if x < -1 or x > 1 56 func Acos(x float64) float64 { 57 if haveArchAcos { 58 return archAcos(x) 59 } 60 return acos(x) 61 } 62 63 func acos(x float64) float64 { 64 return Pi/2 - Asin(x) 65 }