math: special cases for Ceil, Exp, Floor, Log, Log10

Added special case tests to all_test.go. Added tests to Floor,
in-lined tests in Exp and Log.

R=rsc
CC=golang-dev
https://golang.org/cl/184081
diff --git a/src/pkg/math/all_test.go b/src/pkg/math/all_test.go
index 9f39489..0c65dd7 100644
--- a/src/pkg/math/all_test.go
+++ b/src/pkg/math/all_test.go
@@ -118,6 +118,18 @@
 	6.0174879014578053e-01,
 	2.1617038728473527e+00,
 }
+var log10 = []float64{
+	6.9714316642508291e-01,
+	8.8867769017393205e-01,
+	-5.5770832400658930e-01,
+	6.9989004768229943e-01,
+	9.8391002850684232e-01,
+	4.6633031029295153e-01,
+	7.1842557117242328e-01,
+	4.3583479968917772e-01,
+	2.6133617905227037e-01,
+	9.3881606348649405e-01,
+}
 var pow = []float64{
 	9.5282232631648415e+04,
 	5.4811599352999900e+07,
@@ -210,6 +222,28 @@
 	NaN(),
 }
 
+var vfceilSC = []float64{
+	Inf(-1),
+	Inf(1),
+	NaN(),
+}
+var ceilSC = []float64{
+	Inf(-1),
+	Inf(1),
+	NaN(),
+}
+
+var vfexpSC = []float64{
+	Inf(-1),
+	Inf(1),
+	NaN(),
+}
+var expSC = []float64{
+	0,
+	Inf(1),
+	NaN(),
+}
+
 var vffmodSC = [][2]float64{
 	[2]float64{Inf(-1), Inf(-1)},
 	[2]float64{Inf(-1), -Pi},
@@ -275,6 +309,21 @@
 	NaN(),
 }
 
+var vflogSC = []float64{
+	Inf(-1),
+	-Pi,
+	0,
+	Inf(1),
+	NaN(),
+}
+var logSC = []float64{
+	NaN(),
+	NaN(),
+	Inf(-1),
+	Inf(1),
+	NaN(),
+}
+
 var vfpowSC = [][2]float64{
 	[2]float64{-Pi, Pi},
 	[2]float64{-Pi, -Pi},
@@ -440,6 +489,11 @@
 			t.Errorf("Ceil(%g) = %g, want %g\n", vf[i], f, ceil[i])
 		}
 	}
+	for i := 0; i < len(vfceilSC); i++ {
+		if f := Ceil(vfceilSC[i]); !alike(ceilSC[i], f) {
+			t.Errorf("Ceil(%g) = %g, want %g\n", vfceilSC[i], f, ceilSC[i])
+		}
+	}
 }
 
 func TestExp(t *testing.T) {
@@ -448,6 +502,11 @@
 			t.Errorf("Exp(%g) = %g, want %g\n", vf[i], f, exp[i])
 		}
 	}
+	for i := 0; i < len(vfexpSC); i++ {
+		if f := Exp(vfexpSC[i]); !alike(expSC[i], f) {
+			t.Errorf("Exp(%g) = %g, want %g\n", vfexpSC[i], f, expSC[i])
+		}
+	}
 }
 
 func TestFloor(t *testing.T) {
@@ -456,6 +515,11 @@
 			t.Errorf("Floor(%g) = %g, want %g\n", vf[i], f, floor[i])
 		}
 	}
+	for i := 0; i < len(vfceilSC); i++ {
+		if f := Floor(vfceilSC[i]); !alike(ceilSC[i], f) {
+			t.Errorf("Floor(%g) = %g, want %g\n", vfceilSC[i], f, ceilSC[i])
+		}
+	}
 }
 
 func TestFmod(t *testing.T) {
@@ -479,7 +543,29 @@
 		}
 	}
 	if f := Log(10); f != Ln10 {
-		t.Errorf("Log(%g) = %g, want %g\n", 10, f, Ln10)
+		t.Errorf("Log(%g) = %g, want %g\n", 10.0, f, Ln10)
+	}
+	for i := 0; i < len(vflogSC); i++ {
+		if f := Log(vflogSC[i]); !alike(logSC[i], f) {
+			t.Errorf("Log(%g) = %g, want %g\n", vflogSC[i], f, logSC[i])
+		}
+	}
+}
+
+func TestLog10(t *testing.T) {
+	for i := 0; i < len(vf); i++ {
+		a := Fabs(vf[i])
+		if f := Log10(a); !veryclose(log10[i], f) {
+			t.Errorf("Log10(%g) = %g, want %g\n", a, f, log10[i])
+		}
+	}
+	if f := Log10(E); f != Log10E {
+		t.Errorf("Log10(%g) = %g, want %g\n", E, f, Log10E)
+	}
+	for i := 0; i < len(vflogSC); i++ {
+		if f := Log10(vflogSC[i]); !alike(logSC[i], f) {
+			t.Errorf("Log10(%g) = %g, want %g\n", vflogSC[i], f, logSC[i])
+		}
 	}
 }