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])
+ }
}
}