OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libgo/] [go/] [math/] [atan2.go] - Blame information for rev 747

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 747 jeremybenn
// 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
 
30
//extern atan2
31
func libc_atan2(float64, float64) float64
32
 
33
func Atan2(y, x float64) float64 {
34
        return libc_atan2(y, x)
35
}
36
 
37
func atan2(y, x float64) float64 {
38
        // special cases
39
        switch {
40
        case IsNaN(y) || IsNaN(x):
41
                return NaN()
42
        case y == 0:
43
                if x >= 0 && !Signbit(x) {
44
                        return Copysign(0, y)
45
                }
46
                return Copysign(Pi, y)
47
        case x == 0:
48
                return Copysign(Pi/2, y)
49
        case IsInf(x, 0):
50
                if IsInf(x, 1) {
51
                        switch {
52
                        case IsInf(y, 0):
53
                                return Copysign(Pi/4, y)
54
                        default:
55
                                return Copysign(0, y)
56
                        }
57
                }
58
                switch {
59
                case IsInf(y, 0):
60
                        return Copysign(3*Pi/4, y)
61
                default:
62
                        return Copysign(Pi, y)
63
                }
64
        case IsInf(y, 0):
65
                return Copysign(Pi/2, y)
66
        }
67
 
68
        // Call atan and determine the quadrant.
69
        q := Atan(y / x)
70
        if x < 0 {
71
                if q <= 0 {
72
                        return q + Pi
73
                }
74
                return q - Pi
75
        }
76
        return q
77
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.