math: add Cbrt and Sincos; x87 versions of Sincos, Frexp, Ldexp

Added special condition and benchmarks for Cbrt, Sincos. Took Frexp and Ldexp out of bits.go.

R=rsc
CC=golang-dev
https://golang.org/cl/206084
diff --git a/src/pkg/math/all_test.go b/src/pkg/math/all_test.go
index bd1d400..1109165 100644
--- a/src/pkg/math/all_test.go
+++ b/src/pkg/math/all_test.go
@@ -112,6 +112,18 @@
 	1.3902530903455392306872261e+00,
 	2.2859857424479142655411058e+00,
 }
+var cbrt = []float64{
+	1.7075799841925094446722675e+00,
+	1.9779982212970353936691498e+00,
+	-6.5177429017779910853339447e-01,
+	-1.7111838886544019873338113e+00,
+	2.1279920909827937423960472e+00,
+	1.4303536770460741452312367e+00,
+	1.7357021059106154902341052e+00,
+	1.3972633462554328350552916e+00,
+	1.2221149580905388454977636e+00,
+	-2.0556003730500069110343596e+00,
+}
 var ceil = []float64{
 	5.0000000000000000e+00,
 	8.0000000000000000e+00,
@@ -546,6 +558,17 @@
 	NaN(),
 }
 
+var vfcbrtSC = []float64{
+	Inf(-1),
+	Inf(1),
+	NaN(),
+}
+var cbrtSC = []float64{
+	Inf(-1),
+	Inf(1),
+	NaN(),
+}
+
 var vfceilSC = []float64{
 	Inf(-1),
 	Inf(1),
@@ -993,6 +1016,19 @@
 	}
 }
 
+func TestCbrt(t *testing.T) {
+	for i := 0; i < len(vf); i++ {
+		if f := Cbrt(vf[i]); !veryclose(cbrt[i], f) {
+			t.Errorf("Cbrt(%g) = %g, want %g\n", vf[i], f, cbrt[i])
+		}
+	}
+	for i := 0; i < len(vfcbrtSC); i++ {
+		if f := Cbrt(vfcbrtSC[i]); !alike(cbrtSC[i], f) {
+			t.Errorf("Cbrt(%g) = %g, want %g\n", vfcbrtSC[i], f, cbrtSC[i])
+		}
+	}
+}
+
 func TestCeil(t *testing.T) {
 	for i := 0; i < len(vf); i++ {
 		if f := Ceil(vf[i]); ceil[i] != f {
@@ -1309,6 +1345,14 @@
 	}
 }
 
+func TestSincos(t *testing.T) {
+	for i := 0; i < len(vf); i++ {
+		if s, c := Sincos(vf[i]); !close(sin[i], s) || !close(cos[i], c) {
+			t.Errorf("Sincos(%g) = %g, %g want %g, %g\n", vf[i], s, c, sin[i], cos[i])
+		}
+	}
+}
+
 func TestSinh(t *testing.T) {
 	for i := 0; i < len(vf); i++ {
 		if f := Sinh(vf[i]); !close(sinh[i], f) {
@@ -1366,6 +1410,17 @@
 
 // Check that math functions of high angle values
 // return similar results to low angle values
+func TestLargeCos(t *testing.T) {
+	large := float64(100000 * Pi)
+	for i := 0; i < len(vf); i++ {
+		f1 := Cos(vf[i])
+		f2 := Cos(vf[i] + large)
+		if !kindaclose(f1, f2) {
+			t.Errorf("Cos(%g) = %g, want %g\n", vf[i]+large, f2, f1)
+		}
+	}
+}
+
 func TestLargeSin(t *testing.T) {
 	large := float64(100000 * Pi)
 	for i := 0; i < len(vf); i++ {
@@ -1377,13 +1432,13 @@
 	}
 }
 
-func TestLargeCos(t *testing.T) {
+func TestLargeSincos(t *testing.T) {
 	large := float64(100000 * Pi)
 	for i := 0; i < len(vf); i++ {
-		f1 := Cos(vf[i])
-		f2 := Cos(vf[i] + large)
-		if !kindaclose(f1, f2) {
-			t.Errorf("Cos(%g) = %g, want %g\n", vf[i]+large, f2, f1)
+		f1, g1 := Sincos(vf[i])
+		f2, g2 := Sincos(vf[i] + large)
+		if !kindaclose(f1, f2) || !kindaclose(g1, g2) {
+			t.Errorf("Sincos(%g) = %g, %g, want %g, %g\n", vf[i]+large, f2, g2, f1, g1)
 		}
 	}
 }
@@ -1469,6 +1524,12 @@
 	}
 }
 
+func BenchmarkCbrt(b *testing.B) {
+	for i := 0; i < b.N; i++ {
+		Cbrt(10)
+	}
+}
+
 func BenchmarkCeil(b *testing.B) {
 	for i := 0; i < b.N; i++ {
 		Ceil(.5)
@@ -1625,6 +1686,12 @@
 	}
 }
 
+func BenchmarkSincos(b *testing.B) {
+	for i := 0; i < b.N; i++ {
+		Sincos(.5)
+	}
+}
+
 func BenchmarkSinh(b *testing.B) {
 	for i := 0; i < b.N; i++ {
 		Sinh(2.5)