~james-page/ubuntu/utopic/gccgo-go/cgo-support

« back to all changes in this revision

Viewing changes to src/pkg/math/atan2.go

  • Committer: Package Import Robot
  • Author(s): James Page
  • Date: 2014-01-27 09:18:55 UTC
  • Revision ID: package-import@ubuntu.com-20140127091855-zxfshmykfsyyw4b2
Tags: upstream-1.2
ImportĀ upstreamĀ versionĀ 1.2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
}