math: atan2 special cases (negative zero)

Added Signbit(), revised Copysign()

R=rsc
CC=golang-dev
https://golang.org/cl/822045
diff --git a/src/pkg/math/atan2.go b/src/pkg/math/atan2.go
index a738fbc..49d4bdd 100644
--- a/src/pkg/math/atan2.go
+++ b/src/pkg/math/atan2.go
@@ -11,8 +11,10 @@
 // Special cases are (in order):
 //	Atan2(y, NaN) = NaN
 //	Atan2(NaN, x) = NaN
-//	Atan2(0, x>=0) = 0
-//	Atan2(0, x<0) = Pi
+//	Atan2(+0, x>=0) = +0
+//	Atan2(-0, x>=0) = -0
+//	Atan2(+0, x<=-0) = +Pi
+//	Atan2(-0, x<=-0) = -Pi
 //	Atan2(y>0, 0) = +Pi/2
 //	Atan2(y<0, 0) = -Pi/2
 //	Atan2(+Inf, +Inf) = +Pi/4
@@ -32,41 +34,29 @@
 	case y != y || x != x: // IsNaN(y) || IsNaN(x):
 		return NaN()
 	case y == 0:
-		if x >= 0 {
-			return 0
+		if x >= 0 && !Signbit(x) {
+			return Copysign(0, y)
 		}
-		return Pi
+		return Copysign(Pi, y)
 	case x == 0:
-		if y > 0 {
-			return Pi / 2
-		}
-		return -Pi / 2
+		return Copysign(Pi/2, y)
 	case x < -MaxFloat64 || x > MaxFloat64: // IsInf(x, 0):
 		if x > MaxFloat64 { // IsInf(x, 1) {
 			switch {
-			case y > MaxFloat64: // IsInf(y, 1):
-				return Pi / 4
-			case y < -MaxFloat64: // IsInf(y, -1):
-				return -Pi / 4
+			case y < -MaxFloat64 || y > MaxFloat64: // IsInf(y, -1) || IsInf(y, 1):
+				return Copysign(Pi/4, y)
 			default:
-				return 0
+				return Copysign(0, y)
 			}
 		}
 		switch {
-		case y > MaxFloat64: //IsInf(y, 1):
-			return 3 * Pi / 4
-		case y < -MaxFloat64: //IsInf(y, -1):
-			return -3 * Pi / 4
-		case y > 0:
-			return Pi
+		case y < -MaxFloat64 || y > MaxFloat64: // IsInf(y, -1) || IsInf(y, 1):
+			return Copysign(3*Pi/4, y)
 		default:
-			return -Pi
+			return Copysign(Pi, y)
 		}
 	case y < -MaxFloat64 || y > MaxFloat64: //IsInf(y, 0):
-		if y > MaxFloat64 { // IsInf(y, 1) {
-			return Pi / 2
-		}
-		return -Pi / 2
+		return Copysign(Pi/2, y)
 	}
 
 	// Call atan and determine the quadrant.