...

# Source file src/math/atan2.go

```     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	// Atan2 returns the arc tangent of y/x, using
8	// the signs of the two to determine the quadrant
9	// of the return value.
10	//
11	// Special cases are (in order):
12	//	Atan2(y, NaN) = NaN
13	//	Atan2(NaN, x) = NaN
14	//	Atan2(+0, x>=0) = +0
15	//	Atan2(-0, x>=0) = -0
16	//	Atan2(+0, x<=-0) = +Pi
17	//	Atan2(-0, x<=-0) = -Pi
18	//	Atan2(y>0, 0) = +Pi/2
19	//	Atan2(y<0, 0) = -Pi/2
20	//	Atan2(+Inf, +Inf) = +Pi/4
21	//	Atan2(-Inf, +Inf) = -Pi/4
22	//	Atan2(+Inf, -Inf) = 3Pi/4
23	//	Atan2(-Inf, -Inf) = -3Pi/4
24	//	Atan2(y, +Inf) = 0
25	//	Atan2(y>0, -Inf) = +Pi
26	//	Atan2(y<0, -Inf) = -Pi
27	//	Atan2(+Inf, x) = +Pi/2
28	//	Atan2(-Inf, x) = -Pi/2
29	func Atan2(y, x float64) float64
30
31	func atan2(y, x float64) float64 {
32		// special cases
33		switch {
34		case IsNaN(y) || IsNaN(x):
35			return NaN()
36		case y == 0:
37			if x >= 0 && !Signbit(x) {
38				return Copysign(0, y)
39			}
40			return Copysign(Pi, y)
41		case x == 0:
42			return Copysign(Pi/2, y)
43		case IsInf(x, 0):
44			if IsInf(x, 1) {
45				switch {
46				case IsInf(y, 0):
47					return Copysign(Pi/4, y)
48				default:
49					return Copysign(0, y)
50				}
51			}
52			switch {
53			case IsInf(y, 0):
54				return Copysign(3*Pi/4, y)
55			default:
56				return Copysign(Pi, y)
57			}
58		case IsInf(y, 0):
59			return Copysign(Pi/2, y)
60		}
61
62		// Call atan and determine the quadrant.
63		q := Atan(y / x)
64		if x < 0 {
65			if q <= 0 {
66				return q + Pi
67			}
68			return q - Pi
69		}
70		return q
71	}
72
```

View as plain text