diff options
Diffstat (limited to 'src/pkg/math/all_test.go')
-rw-r--r-- | src/pkg/math/all_test.go | 700 |
1 files changed, 375 insertions, 325 deletions
diff --git a/src/pkg/math/all_test.go b/src/pkg/math/all_test.go index 18a3f1b31..6033d37e3 100644 --- a/src/pkg/math/all_test.go +++ b/src/pkg/math/all_test.go @@ -7,6 +7,7 @@ package math_test import ( "fmt" . "math" + "runtime" "testing" ) @@ -286,16 +287,16 @@ type fi struct { } var frexp = []fi{ - fi{6.2237649061045918750e-01, 3}, - fi{9.6735905932226306250e-01, 3}, - fi{-5.5376011438400318000e-01, -1}, - fi{-6.2632545228388436250e-01, 3}, - fi{6.02268356699901081250e-01, 4}, - fi{7.3159430981099115000e-01, 2}, - fi{6.5363542893241332500e-01, 3}, - fi{6.8198497760900255000e-01, 2}, - fi{9.1265404584042750000e-01, 1}, - fi{-5.4287029803597508250e-01, 4}, + {6.2237649061045918750e-01, 3}, + {9.6735905932226306250e-01, 3}, + {-5.5376011438400318000e-01, -1}, + {-6.2632545228388436250e-01, 3}, + {6.02268356699901081250e-01, 4}, + {7.3159430981099115000e-01, 2}, + {6.5363542893241332500e-01, 3}, + {6.8198497760900255000e-01, 2}, + {9.1265404584042750000e-01, 1}, + {-5.4287029803597508250e-01, 4}, } var gamma = []float64{ 2.3254348370739963835386613898e+01, @@ -358,16 +359,16 @@ var jM3 = []float64{ -2.3762660886100206491674503e-01, } var lgamma = []fi{ - fi{3.146492141244545774319734e+00, 1}, - fi{8.003414490659126375852113e+00, 1}, - fi{1.517575735509779707488106e+00, -1}, - fi{-2.588480028182145853558748e-01, 1}, - fi{1.1989897050205555002007985e+01, 1}, - fi{6.262899811091257519386906e-01, 1}, - fi{3.5287924899091566764846037e+00, 1}, - fi{4.5725644770161182299423372e-01, 1}, - fi{-6.363667087767961257654854e-02, 1}, - fi{-1.077385130910300066425564e+01, -1}, + {3.146492141244545774319734e+00, 1}, + {8.003414490659126375852113e+00, 1}, + {1.517575735509779707488106e+00, -1}, + {-2.588480028182145853558748e-01, 1}, + {1.1989897050205555002007985e+01, 1}, + {6.262899811091257519386906e-01, 1}, + {3.5287924899091566764846037e+00, 1}, + {4.5725644770161182299423372e-01, 1}, + {-6.363667087767961257654854e-02, 1}, + {-1.077385130910300066425564e+01, -1}, } var log = []float64{ 1.605231462693062999102599e+00, @@ -382,16 +383,16 @@ var log = []float64{ 2.161703872847352815363655e+00, } var logb = []float64{ - 3.0000000000000000e+00, - 3.0000000000000000e+00, - -1.0000000000000000e+00, - 3.0000000000000000e+00, - 4.0000000000000000e+00, + 2.0000000000000000e+00, + 2.0000000000000000e+00, + -2.0000000000000000e+00, 2.0000000000000000e+00, 3.0000000000000000e+00, + 1.0000000000000000e+00, 2.0000000000000000e+00, 1.0000000000000000e+00, - 4.0000000000000000e+00, + 0.0000000000000000e+00, + 3.0000000000000000e+00, } var log10 = []float64{ 6.9714316642508290997617083e-01, @@ -430,16 +431,16 @@ var log2 = []float64{ 3.118679457227342224364709e+00, } var modf = [][2]float64{ - [2]float64{4.0000000000000000e+00, 9.7901192488367350108546816e-01}, - [2]float64{7.0000000000000000e+00, 7.3887247457810456552351752e-01}, - [2]float64{0.0000000000000000e+00, -2.7688005719200159404635997e-01}, - [2]float64{-5.0000000000000000e+00, -1.060361827107492160848778e-02}, - [2]float64{9.0000000000000000e+00, 6.3629370719841737980004837e-01}, - [2]float64{2.0000000000000000e+00, 9.2637723924396464525443662e-01}, - [2]float64{5.0000000000000000e+00, 2.2908343145930665230025625e-01}, - [2]float64{2.0000000000000000e+00, 7.2793991043601025126008608e-01}, - [2]float64{1.0000000000000000e+00, 8.2530809168085506044576505e-01}, - [2]float64{-8.0000000000000000e+00, -6.8592476857560136238589621e-01}, + {4.0000000000000000e+00, 9.7901192488367350108546816e-01}, + {7.0000000000000000e+00, 7.3887247457810456552351752e-01}, + {0.0000000000000000e+00, -2.7688005719200159404635997e-01}, + {-5.0000000000000000e+00, -1.060361827107492160848778e-02}, + {9.0000000000000000e+00, 6.3629370719841737980004837e-01}, + {2.0000000000000000e+00, 9.2637723924396464525443662e-01}, + {5.0000000000000000e+00, 2.2908343145930665230025625e-01}, + {2.0000000000000000e+00, 7.2793991043601025126008608e-01}, + {1.0000000000000000e+00, 8.2530809168085506044576505e-01}, + {-8.0000000000000000e+00, -6.8592476857560136238589621e-01}, } var nextafter = []float64{ 4.97901192488367438926388786e+00, @@ -707,41 +708,41 @@ var atanhSC = []float64{ NaN(), } var vfatan2SC = [][2]float64{ - [2]float64{Inf(-1), Inf(-1)}, - [2]float64{Inf(-1), -Pi}, - [2]float64{Inf(-1), 0}, - [2]float64{Inf(-1), +Pi}, - [2]float64{Inf(-1), Inf(1)}, - [2]float64{Inf(-1), NaN()}, - [2]float64{-Pi, Inf(-1)}, - [2]float64{-Pi, 0}, - [2]float64{-Pi, Inf(1)}, - [2]float64{-Pi, NaN()}, - [2]float64{Copysign(0, -1), Inf(-1)}, - [2]float64{Copysign(0, -1), -Pi}, - [2]float64{Copysign(0, -1), Copysign(0, -1)}, - [2]float64{Copysign(0, -1), 0}, - [2]float64{Copysign(0, -1), +Pi}, - [2]float64{Copysign(0, -1), Inf(1)}, - [2]float64{Copysign(0, -1), NaN()}, - [2]float64{0, Inf(-1)}, - [2]float64{0, -Pi}, - [2]float64{0, Copysign(0, -1)}, - [2]float64{0, 0}, - [2]float64{0, +Pi}, - [2]float64{0, Inf(1)}, - [2]float64{0, NaN()}, - [2]float64{+Pi, Inf(-1)}, - [2]float64{+Pi, 0}, - [2]float64{+Pi, Inf(1)}, - [2]float64{+Pi, NaN()}, - [2]float64{Inf(1), Inf(-1)}, - [2]float64{Inf(1), -Pi}, - [2]float64{Inf(1), 0}, - [2]float64{Inf(1), +Pi}, - [2]float64{Inf(1), Inf(1)}, - [2]float64{Inf(1), NaN()}, - [2]float64{NaN(), NaN()}, + {Inf(-1), Inf(-1)}, + {Inf(-1), -Pi}, + {Inf(-1), 0}, + {Inf(-1), +Pi}, + {Inf(-1), Inf(1)}, + {Inf(-1), NaN()}, + {-Pi, Inf(-1)}, + {-Pi, 0}, + {-Pi, Inf(1)}, + {-Pi, NaN()}, + {Copysign(0, -1), Inf(-1)}, + {Copysign(0, -1), -Pi}, + {Copysign(0, -1), Copysign(0, -1)}, + {Copysign(0, -1), 0}, + {Copysign(0, -1), +Pi}, + {Copysign(0, -1), Inf(1)}, + {Copysign(0, -1), NaN()}, + {0, Inf(-1)}, + {0, -Pi}, + {0, Copysign(0, -1)}, + {0, 0}, + {0, +Pi}, + {0, Inf(1)}, + {0, NaN()}, + {+Pi, Inf(-1)}, + {+Pi, 0}, + {+Pi, Inf(1)}, + {+Pi, NaN()}, + {Inf(1), Inf(-1)}, + {Inf(1), -Pi}, + {Inf(1), 0}, + {Inf(1), +Pi}, + {Inf(1), Inf(1)}, + {Inf(1), NaN()}, + {NaN(), NaN()}, } var atan2SC = []float64{ -3 * Pi / 4, // atan2(-Inf, -Inf) @@ -876,11 +877,15 @@ var erfcSC = []float64{ var vfexpSC = []float64{ Inf(-1), + -2000, + 2000, Inf(1), NaN(), } var expSC = []float64{ 0, + 0, + Inf(1), Inf(1), NaN(), } @@ -916,40 +921,40 @@ var fabsSC = []float64{ } var vffmodSC = [][2]float64{ - [2]float64{Inf(-1), Inf(-1)}, - [2]float64{Inf(-1), -Pi}, - [2]float64{Inf(-1), 0}, - [2]float64{Inf(-1), Pi}, - [2]float64{Inf(-1), Inf(1)}, - [2]float64{Inf(-1), NaN()}, - [2]float64{-Pi, Inf(-1)}, - [2]float64{-Pi, 0}, - [2]float64{-Pi, Inf(1)}, - [2]float64{-Pi, NaN()}, - [2]float64{Copysign(0, -1), Inf(-1)}, - [2]float64{Copysign(0, -1), 0}, - [2]float64{Copysign(0, -1), Inf(1)}, - [2]float64{Copysign(0, -1), NaN()}, - [2]float64{0, Inf(-1)}, - [2]float64{0, 0}, - [2]float64{0, Inf(1)}, - [2]float64{0, NaN()}, - [2]float64{Pi, Inf(-1)}, - [2]float64{Pi, 0}, - [2]float64{Pi, Inf(1)}, - [2]float64{Pi, NaN()}, - [2]float64{Inf(1), Inf(-1)}, - [2]float64{Inf(1), -Pi}, - [2]float64{Inf(1), 0}, - [2]float64{Inf(1), Pi}, - [2]float64{Inf(1), Inf(1)}, - [2]float64{Inf(1), NaN()}, - [2]float64{NaN(), Inf(-1)}, - [2]float64{NaN(), -Pi}, - [2]float64{NaN(), 0}, - [2]float64{NaN(), Pi}, - [2]float64{NaN(), Inf(1)}, - [2]float64{NaN(), NaN()}, + {Inf(-1), Inf(-1)}, + {Inf(-1), -Pi}, + {Inf(-1), 0}, + {Inf(-1), Pi}, + {Inf(-1), Inf(1)}, + {Inf(-1), NaN()}, + {-Pi, Inf(-1)}, + {-Pi, 0}, + {-Pi, Inf(1)}, + {-Pi, NaN()}, + {Copysign(0, -1), Inf(-1)}, + {Copysign(0, -1), 0}, + {Copysign(0, -1), Inf(1)}, + {Copysign(0, -1), NaN()}, + {0, Inf(-1)}, + {0, 0}, + {0, Inf(1)}, + {0, NaN()}, + {Pi, Inf(-1)}, + {Pi, 0}, + {Pi, Inf(1)}, + {Pi, NaN()}, + {Inf(1), Inf(-1)}, + {Inf(1), -Pi}, + {Inf(1), 0}, + {Inf(1), Pi}, + {Inf(1), Inf(1)}, + {Inf(1), NaN()}, + {NaN(), Inf(-1)}, + {NaN(), -Pi}, + {NaN(), 0}, + {NaN(), Pi}, + {NaN(), Inf(1)}, + {NaN(), NaN()}, } var fmodSC = []float64{ NaN(), // fmod(-Inf, -Inf) @@ -996,11 +1001,11 @@ var vffrexpSC = []float64{ NaN(), } var frexpSC = []fi{ - fi{Inf(-1), 0}, - fi{Copysign(0, -1), 0}, - fi{0, 0}, - fi{Inf(1), 0}, - fi{NaN(), 0}, + {Inf(-1), 0}, + {Copysign(0, -1), 0}, + {0, 0}, + {Inf(1), 0}, + {NaN(), 0}, } var vfgammaSC = []float64{ @@ -1021,25 +1026,25 @@ var gammaSC = []float64{ } var vfhypotSC = [][2]float64{ - [2]float64{Inf(-1), Inf(-1)}, - [2]float64{Inf(-1), 0}, - [2]float64{Inf(-1), Inf(1)}, - [2]float64{Inf(-1), NaN()}, - [2]float64{Copysign(0, -1), Copysign(0, -1)}, - [2]float64{Copysign(0, -1), 0}, - [2]float64{0, Copysign(0, -1)}, - [2]float64{0, 0}, // +0, +0 - [2]float64{0, Inf(-1)}, - [2]float64{0, Inf(1)}, - [2]float64{0, NaN()}, - [2]float64{Inf(1), Inf(-1)}, - [2]float64{Inf(1), 0}, - [2]float64{Inf(1), Inf(1)}, - [2]float64{Inf(1), NaN()}, - [2]float64{NaN(), Inf(-1)}, - [2]float64{NaN(), 0}, - [2]float64{NaN(), Inf(1)}, - [2]float64{NaN(), NaN()}, + {Inf(-1), Inf(-1)}, + {Inf(-1), 0}, + {Inf(-1), Inf(1)}, + {Inf(-1), NaN()}, + {Copysign(0, -1), Copysign(0, -1)}, + {Copysign(0, -1), 0}, + {0, Copysign(0, -1)}, + {0, 0}, // +0, +0 + {0, Inf(-1)}, + {0, Inf(1)}, + {0, NaN()}, + {Inf(1), Inf(-1)}, + {Inf(1), 0}, + {Inf(1), Inf(1)}, + {Inf(1), NaN()}, + {NaN(), Inf(-1)}, + {NaN(), 0}, + {NaN(), Inf(1)}, + {NaN(), NaN()}, } var hypotSC = []float64{ Inf(1), @@ -1117,13 +1122,13 @@ var vflgammaSC = []float64{ NaN(), } var lgammaSC = []fi{ - fi{Inf(-1), 1}, - fi{Inf(1), 1}, - fi{Inf(1), 1}, - fi{0, 1}, - fi{0, 1}, - fi{Inf(1), 1}, - fi{NaN(), 1}, + {Inf(-1), 1}, + {Inf(1), 1}, + {Inf(1), 1}, + {0, 1}, + {0, 1}, + {Inf(1), 1}, + {NaN(), 1}, } var vflogSC = []float64{ @@ -1183,15 +1188,15 @@ var vfmodfSC = []float64{ NaN(), } var modfSC = [][2]float64{ - [2]float64{Inf(-1), NaN()}, // [2]float64{Copysign(0, -1), Inf(-1)}, - [2]float64{Inf(1), NaN()}, // [2]float64{0, Inf(1)}, - [2]float64{NaN(), NaN()}, + {Inf(-1), NaN()}, // [2]float64{Copysign(0, -1), Inf(-1)}, + {Inf(1), NaN()}, // [2]float64{0, Inf(1)}, + {NaN(), NaN()}, } var vfnextafterSC = [][2]float64{ - [2]float64{0, NaN()}, - [2]float64{NaN(), 0}, - [2]float64{NaN(), NaN()}, + {0, NaN()}, + {NaN(), 0}, + {NaN(), NaN()}, } var nextafterSC = []float64{ NaN(), @@ -1200,70 +1205,70 @@ var nextafterSC = []float64{ } var vfpowSC = [][2]float64{ - [2]float64{Inf(-1), -Pi}, - [2]float64{Inf(-1), -3}, - [2]float64{Inf(-1), Copysign(0, -1)}, - [2]float64{Inf(-1), 0}, - [2]float64{Inf(-1), 1}, - [2]float64{Inf(-1), 3}, - [2]float64{Inf(-1), Pi}, - [2]float64{Inf(-1), NaN()}, - - [2]float64{-Pi, Inf(-1)}, - [2]float64{-Pi, -Pi}, - [2]float64{-Pi, Copysign(0, -1)}, - [2]float64{-Pi, 0}, - [2]float64{-Pi, 1}, - [2]float64{-Pi, Pi}, - [2]float64{-Pi, Inf(1)}, - [2]float64{-Pi, NaN()}, - - [2]float64{-1, Inf(-1)}, - [2]float64{-1, Inf(1)}, - [2]float64{-1, NaN()}, - [2]float64{-1 / 2, Inf(-1)}, - [2]float64{-1 / 2, Inf(1)}, - [2]float64{Copysign(0, -1), Inf(-1)}, - [2]float64{Copysign(0, -1), -Pi}, - [2]float64{Copysign(0, -1), -3}, - [2]float64{Copysign(0, -1), 3}, - [2]float64{Copysign(0, -1), Pi}, - [2]float64{Copysign(0, -1), Inf(1)}, - - [2]float64{0, Inf(-1)}, - [2]float64{0, -Pi}, - [2]float64{0, -3}, - [2]float64{0, Copysign(0, -1)}, - [2]float64{0, 0}, - [2]float64{0, 3}, - [2]float64{0, Pi}, - [2]float64{0, Inf(1)}, - [2]float64{0, NaN()}, - - [2]float64{1 / 2, Inf(-1)}, - [2]float64{1 / 2, Inf(1)}, - [2]float64{1, Inf(-1)}, - [2]float64{1, Inf(1)}, - [2]float64{1, NaN()}, - - [2]float64{Pi, Inf(-1)}, - [2]float64{Pi, Copysign(0, -1)}, - [2]float64{Pi, 0}, - [2]float64{Pi, 1}, - [2]float64{Pi, Inf(1)}, - [2]float64{Pi, NaN()}, - [2]float64{Inf(1), -Pi}, - [2]float64{Inf(1), Copysign(0, -1)}, - [2]float64{Inf(1), 0}, - [2]float64{Inf(1), 1}, - [2]float64{Inf(1), Pi}, - [2]float64{Inf(1), NaN()}, - [2]float64{NaN(), -Pi}, - [2]float64{NaN(), Copysign(0, -1)}, - [2]float64{NaN(), 0}, - [2]float64{NaN(), 1}, - [2]float64{NaN(), Pi}, - [2]float64{NaN(), NaN()}, + {Inf(-1), -Pi}, + {Inf(-1), -3}, + {Inf(-1), Copysign(0, -1)}, + {Inf(-1), 0}, + {Inf(-1), 1}, + {Inf(-1), 3}, + {Inf(-1), Pi}, + {Inf(-1), NaN()}, + + {-Pi, Inf(-1)}, + {-Pi, -Pi}, + {-Pi, Copysign(0, -1)}, + {-Pi, 0}, + {-Pi, 1}, + {-Pi, Pi}, + {-Pi, Inf(1)}, + {-Pi, NaN()}, + + {-1, Inf(-1)}, + {-1, Inf(1)}, + {-1, NaN()}, + {-1 / 2, Inf(-1)}, + {-1 / 2, Inf(1)}, + {Copysign(0, -1), Inf(-1)}, + {Copysign(0, -1), -Pi}, + {Copysign(0, -1), -3}, + {Copysign(0, -1), 3}, + {Copysign(0, -1), Pi}, + {Copysign(0, -1), Inf(1)}, + + {0, Inf(-1)}, + {0, -Pi}, + {0, -3}, + {0, Copysign(0, -1)}, + {0, 0}, + {0, 3}, + {0, Pi}, + {0, Inf(1)}, + {0, NaN()}, + + {1 / 2, Inf(-1)}, + {1 / 2, Inf(1)}, + {1, Inf(-1)}, + {1, Inf(1)}, + {1, NaN()}, + + {Pi, Inf(-1)}, + {Pi, Copysign(0, -1)}, + {Pi, 0}, + {Pi, 1}, + {Pi, Inf(1)}, + {Pi, NaN()}, + {Inf(1), -Pi}, + {Inf(1), Copysign(0, -1)}, + {Inf(1), 0}, + {Inf(1), 1}, + {Inf(1), Pi}, + {Inf(1), NaN()}, + {NaN(), -Pi}, + {NaN(), Copysign(0, -1)}, + {NaN(), 0}, + {NaN(), 1}, + {NaN(), Pi}, + {NaN(), NaN()}, } var powSC = []float64{ 0, // pow(-Inf, -Pi) @@ -1467,12 +1472,12 @@ func TestAcos(t *testing.T) { for i := 0; i < len(vf); i++ { a := vf[i] / 10 if f := Acos(a); !close(acos[i], f) { - t.Errorf("Acos(%g) = %g, want %g\n", a, f, acos[i]) + t.Errorf("Acos(%g) = %g, want %g", a, f, acos[i]) } } for i := 0; i < len(vfacosSC); i++ { if f := Acos(vfacosSC[i]); !alike(acosSC[i], f) { - t.Errorf("Acos(%g) = %g, want %g\n", vfacosSC[i], f, acosSC[i]) + t.Errorf("Acos(%g) = %g, want %g", vfacosSC[i], f, acosSC[i]) } } } @@ -1481,12 +1486,12 @@ func TestAcosh(t *testing.T) { for i := 0; i < len(vf); i++ { a := 1 + Fabs(vf[i]) if f := Acosh(a); !veryclose(acosh[i], f) { - t.Errorf("Acosh(%g) = %g, want %g\n", a, f, acosh[i]) + t.Errorf("Acosh(%g) = %g, want %g", a, f, acosh[i]) } } for i := 0; i < len(vfacoshSC); i++ { if f := Acosh(vfacoshSC[i]); !alike(acoshSC[i], f) { - t.Errorf("Acosh(%g) = %g, want %g\n", vfacoshSC[i], f, acoshSC[i]) + t.Errorf("Acosh(%g) = %g, want %g", vfacoshSC[i], f, acoshSC[i]) } } } @@ -1495,12 +1500,12 @@ func TestAsin(t *testing.T) { for i := 0; i < len(vf); i++ { a := vf[i] / 10 if f := Asin(a); !veryclose(asin[i], f) { - t.Errorf("Asin(%g) = %g, want %g\n", a, f, asin[i]) + t.Errorf("Asin(%g) = %g, want %g", a, f, asin[i]) } } for i := 0; i < len(vfasinSC); i++ { if f := Asin(vfasinSC[i]); !alike(asinSC[i], f) { - t.Errorf("Asin(%g) = %g, want %g\n", vfasinSC[i], f, asinSC[i]) + t.Errorf("Asin(%g) = %g, want %g", vfasinSC[i], f, asinSC[i]) } } } @@ -1508,12 +1513,12 @@ func TestAsin(t *testing.T) { func TestAsinh(t *testing.T) { for i := 0; i < len(vf); i++ { if f := Asinh(vf[i]); !veryclose(asinh[i], f) { - t.Errorf("Asinh(%g) = %g, want %g\n", vf[i], f, asinh[i]) + t.Errorf("Asinh(%g) = %g, want %g", vf[i], f, asinh[i]) } } for i := 0; i < len(vfasinhSC); i++ { if f := Asinh(vfasinhSC[i]); !alike(asinhSC[i], f) { - t.Errorf("Asinh(%g) = %g, want %g\n", vfasinhSC[i], f, asinhSC[i]) + t.Errorf("Asinh(%g) = %g, want %g", vfasinhSC[i], f, asinhSC[i]) } } } @@ -1521,12 +1526,12 @@ func TestAsinh(t *testing.T) { func TestAtan(t *testing.T) { for i := 0; i < len(vf); i++ { if f := Atan(vf[i]); !veryclose(atan[i], f) { - t.Errorf("Atan(%g) = %g, want %g\n", vf[i], f, atan[i]) + t.Errorf("Atan(%g) = %g, want %g", vf[i], f, atan[i]) } } for i := 0; i < len(vfatanSC); i++ { if f := Atan(vfatanSC[i]); !alike(atanSC[i], f) { - t.Errorf("Atan(%g) = %g, want %g\n", vfatanSC[i], f, atanSC[i]) + t.Errorf("Atan(%g) = %g, want %g", vfatanSC[i], f, atanSC[i]) } } } @@ -1535,12 +1540,12 @@ func TestAtanh(t *testing.T) { for i := 0; i < len(vf); i++ { a := vf[i] / 10 if f := Atanh(a); !veryclose(atanh[i], f) { - t.Errorf("Atanh(%g) = %g, want %g\n", a, f, atanh[i]) + t.Errorf("Atanh(%g) = %g, want %g", a, f, atanh[i]) } } for i := 0; i < len(vfatanhSC); i++ { if f := Atanh(vfatanhSC[i]); !alike(atanhSC[i], f) { - t.Errorf("Atanh(%g) = %g, want %g\n", vfatanhSC[i], f, atanhSC[i]) + t.Errorf("Atanh(%g) = %g, want %g", vfatanhSC[i], f, atanhSC[i]) } } } @@ -1548,12 +1553,12 @@ func TestAtanh(t *testing.T) { func TestAtan2(t *testing.T) { for i := 0; i < len(vf); i++ { if f := Atan2(10, vf[i]); !veryclose(atan2[i], f) { - t.Errorf("Atan2(10, %g) = %g, want %g\n", vf[i], f, atan2[i]) + t.Errorf("Atan2(10, %g) = %g, want %g", vf[i], f, atan2[i]) } } for i := 0; i < len(vfatan2SC); i++ { if f := Atan2(vfatan2SC[i][0], vfatan2SC[i][1]); !alike(atan2SC[i], f) { - t.Errorf("Atan2(%g, %g) = %g, want %g\n", vfatan2SC[i][0], vfatan2SC[i][1], f, atan2SC[i]) + t.Errorf("Atan2(%g, %g) = %g, want %g", vfatan2SC[i][0], vfatan2SC[i][1], f, atan2SC[i]) } } } @@ -1561,12 +1566,12 @@ func TestAtan2(t *testing.T) { 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]) + t.Errorf("Cbrt(%g) = %g, want %g", 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]) + t.Errorf("Cbrt(%g) = %g, want %g", vfcbrtSC[i], f, cbrtSC[i]) } } } @@ -1574,12 +1579,12 @@ func TestCbrt(t *testing.T) { func TestCeil(t *testing.T) { for i := 0; i < len(vf); i++ { if f := Ceil(vf[i]); ceil[i] != f { - t.Errorf("Ceil(%g) = %g, want %g\n", vf[i], f, ceil[i]) + t.Errorf("Ceil(%g) = %g, want %g", 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]) + t.Errorf("Ceil(%g) = %g, want %g", vfceilSC[i], f, ceilSC[i]) } } } @@ -1587,12 +1592,17 @@ func TestCeil(t *testing.T) { func TestCopysign(t *testing.T) { for i := 0; i < len(vf); i++ { if f := Copysign(vf[i], -1); copysign[i] != f { - t.Errorf("Copysign(%g, -1) = %g, want %g\n", vf[i], f, copysign[i]) + t.Errorf("Copysign(%g, -1) = %g, want %g", vf[i], f, copysign[i]) + } + } + for i := 0; i < len(vf); i++ { + if f := Copysign(vf[i], 1); -copysign[i] != f { + t.Errorf("Copysign(%g, 1) = %g, want %g", vf[i], f, -copysign[i]) } } for i := 0; i < len(vfcopysignSC); i++ { if f := Copysign(vfcopysignSC[i], -1); !alike(copysignSC[i], f) { - t.Errorf("Copysign(%g, -1) = %g, want %g\n", vfcopysignSC[i], f, copysignSC[i]) + t.Errorf("Copysign(%g, -1) = %g, want %g", vfcopysignSC[i], f, copysignSC[i]) } } } @@ -1600,12 +1610,12 @@ func TestCopysign(t *testing.T) { func TestCos(t *testing.T) { for i := 0; i < len(vf); i++ { if f := Cos(vf[i]); !close(cos[i], f) { - t.Errorf("Cos(%g) = %g, want %g\n", vf[i], f, cos[i]) + t.Errorf("Cos(%g) = %g, want %g", vf[i], f, cos[i]) } } for i := 0; i < len(vfcosSC); i++ { if f := Cos(vfcosSC[i]); !alike(cosSC[i], f) { - t.Errorf("Cos(%g) = %g, want %g\n", vfcosSC[i], f, cosSC[i]) + t.Errorf("Cos(%g) = %g, want %g", vfcosSC[i], f, cosSC[i]) } } } @@ -1613,12 +1623,12 @@ func TestCos(t *testing.T) { func TestCosh(t *testing.T) { for i := 0; i < len(vf); i++ { if f := Cosh(vf[i]); !close(cosh[i], f) { - t.Errorf("Cosh(%g) = %g, want %g\n", vf[i], f, cosh[i]) + t.Errorf("Cosh(%g) = %g, want %g", vf[i], f, cosh[i]) } } for i := 0; i < len(vfcoshSC); i++ { if f := Cosh(vfcoshSC[i]); !alike(coshSC[i], f) { - t.Errorf("Cosh(%g) = %g, want %g\n", vfcoshSC[i], f, coshSC[i]) + t.Errorf("Cosh(%g) = %g, want %g", vfcoshSC[i], f, coshSC[i]) } } } @@ -1627,12 +1637,12 @@ func TestErf(t *testing.T) { for i := 0; i < len(vf); i++ { a := vf[i] / 10 if f := Erf(a); !veryclose(erf[i], f) { - t.Errorf("Erf(%g) = %g, want %g\n", a, f, erf[i]) + t.Errorf("Erf(%g) = %g, want %g", a, f, erf[i]) } } for i := 0; i < len(vferfSC); i++ { if f := Erf(vferfSC[i]); !alike(erfSC[i], f) { - t.Errorf("Erf(%g) = %g, want %g\n", vferfSC[i], f, erfSC[i]) + t.Errorf("Erf(%g) = %g, want %g", vferfSC[i], f, erfSC[i]) } } } @@ -1641,25 +1651,30 @@ func TestErfc(t *testing.T) { for i := 0; i < len(vf); i++ { a := vf[i] / 10 if f := Erfc(a); !veryclose(erfc[i], f) { - t.Errorf("Erfc(%g) = %g, want %g\n", a, f, erfc[i]) + t.Errorf("Erfc(%g) = %g, want %g", a, f, erfc[i]) } } for i := 0; i < len(vferfcSC); i++ { if f := Erfc(vferfcSC[i]); !alike(erfcSC[i], f) { - t.Errorf("Erfc(%g) = %g, want %g\n", vferfcSC[i], f, erfcSC[i]) + t.Errorf("Erfc(%g) = %g, want %g", vferfcSC[i], f, erfcSC[i]) } } } func TestExp(t *testing.T) { + testExp(t, Exp, "Exp") + testExp(t, ExpGo, "ExpGo") +} + +func testExp(t *testing.T, Exp func(float64) float64, name string) { for i := 0; i < len(vf); i++ { if f := Exp(vf[i]); !close(exp[i], f) { - t.Errorf("Exp(%g) = %g, want %g\n", vf[i], f, exp[i]) + t.Errorf("%s(%g) = %g, want %g", name, 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]) + t.Errorf("%s(%g) = %g, want %g", name, vfexpSC[i], f, expSC[i]) } } } @@ -1668,25 +1683,37 @@ func TestExpm1(t *testing.T) { for i := 0; i < len(vf); i++ { a := vf[i] / 100 if f := Expm1(a); !veryclose(expm1[i], f) { - t.Errorf("Expm1(%g) = %g, want %g\n", a, f, expm1[i]) + t.Errorf("Expm1(%g) = %g, want %g", a, f, expm1[i]) } } for i := 0; i < len(vfexpm1SC); i++ { if f := Expm1(vfexpm1SC[i]); !alike(expm1SC[i], f) { - t.Errorf("Expm1(%g) = %g, want %g\n", vfexpm1SC[i], f, expm1SC[i]) + t.Errorf("Expm1(%g) = %g, want %g", vfexpm1SC[i], f, expm1SC[i]) } } } func TestExp2(t *testing.T) { + testExp2(t, Exp2, "Exp2") + testExp2(t, Exp2Go, "Exp2Go") +} + +func testExp2(t *testing.T, Exp2 func(float64) float64, name string) { for i := 0; i < len(vf); i++ { if f := Exp2(vf[i]); !close(exp2[i], f) { - t.Errorf("Exp2(%g) = %g, want %g\n", vf[i], f, exp2[i]) + t.Errorf("%s(%g) = %g, want %g", name, vf[i], f, exp2[i]) } } for i := 0; i < len(vfexpSC); i++ { if f := Exp2(vfexpSC[i]); !alike(expSC[i], f) { - t.Errorf("Exp2(%g) = %g, want %g\n", vfexpSC[i], f, expSC[i]) + t.Errorf("%s(%g) = %g, want %g", name, vfexpSC[i], f, expSC[i]) + } + } + for n := -1074; n < 1024; n++ { + f := Exp2(float64(n)) + vf := Ldexp(1, n) + if f != vf { + t.Errorf("%s(%d) = %g, want %g", name, n, f, vf) } } } @@ -1694,12 +1721,12 @@ func TestExp2(t *testing.T) { func TestFabs(t *testing.T) { for i := 0; i < len(vf); i++ { if f := Fabs(vf[i]); fabs[i] != f { - t.Errorf("Fabs(%g) = %g, want %g\n", vf[i], f, fabs[i]) + t.Errorf("Fabs(%g) = %g, want %g", vf[i], f, fabs[i]) } } for i := 0; i < len(vffabsSC); i++ { if f := Fabs(vffabsSC[i]); !alike(fabsSC[i], f) { - t.Errorf("Fabs(%g) = %g, want %g\n", vffabsSC[i], f, fabsSC[i]) + t.Errorf("Fabs(%g) = %g, want %g", vffabsSC[i], f, fabsSC[i]) } } } @@ -1707,7 +1734,7 @@ func TestFabs(t *testing.T) { func TestFdim(t *testing.T) { for i := 0; i < len(vf); i++ { if f := Fdim(vf[i], 0); fdim[i] != f { - t.Errorf("Fdim(%g, %g) = %g, want %g\n", vf[i], 0.0, f, fdim[i]) + t.Errorf("Fdim(%g, %g) = %g, want %g", vf[i], 0.0, f, fdim[i]) } } } @@ -1715,12 +1742,12 @@ func TestFdim(t *testing.T) { func TestFloor(t *testing.T) { for i := 0; i < len(vf); i++ { if f := Floor(vf[i]); floor[i] != f { - t.Errorf("Floor(%g) = %g, want %g\n", vf[i], f, floor[i]) + t.Errorf("Floor(%g) = %g, want %g", 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]) + t.Errorf("Floor(%g) = %g, want %g", vfceilSC[i], f, ceilSC[i]) } } } @@ -1728,7 +1755,7 @@ func TestFloor(t *testing.T) { func TestFmax(t *testing.T) { for i := 0; i < len(vf); i++ { if f := Fmax(vf[i], ceil[i]); ceil[i] != f { - t.Errorf("Fmax(%g, %g) = %g, want %g\n", vf[i], ceil[i], f, ceil[i]) + t.Errorf("Fmax(%g, %g) = %g, want %g", vf[i], ceil[i], f, ceil[i]) } } } @@ -1736,7 +1763,7 @@ func TestFmax(t *testing.T) { func TestFmin(t *testing.T) { for i := 0; i < len(vf); i++ { if f := Fmin(vf[i], floor[i]); floor[i] != f { - t.Errorf("Fmin(%g, %g) = %g, want %g\n", vf[i], floor[i], f, floor[i]) + t.Errorf("Fmin(%g, %g) = %g, want %g", vf[i], floor[i], f, floor[i]) } } } @@ -1744,12 +1771,12 @@ func TestFmin(t *testing.T) { func TestFmod(t *testing.T) { for i := 0; i < len(vf); i++ { if f := Fmod(10, vf[i]); fmod[i] != f { - t.Errorf("Fmod(10, %g) = %g, want %g\n", vf[i], f, fmod[i]) + t.Errorf("Fmod(10, %g) = %g, want %g", vf[i], f, fmod[i]) } } for i := 0; i < len(vffmodSC); i++ { if f := Fmod(vffmodSC[i][0], vffmodSC[i][1]); !alike(fmodSC[i], f) { - t.Errorf("Fmod(%g, %g) = %g, want %g\n", vffmodSC[i][0], vffmodSC[i][1], f, fmodSC[i]) + t.Errorf("Fmod(%g, %g) = %g, want %g", vffmodSC[i][0], vffmodSC[i][1], f, fmodSC[i]) } } } @@ -1757,12 +1784,12 @@ func TestFmod(t *testing.T) { func TestFrexp(t *testing.T) { for i := 0; i < len(vf); i++ { if f, j := Frexp(vf[i]); !veryclose(frexp[i].f, f) || frexp[i].i != j { - t.Errorf("Frexp(%g) = %g, %d, want %g, %d\n", vf[i], f, j, frexp[i].f, frexp[i].i) + t.Errorf("Frexp(%g) = %g, %d, want %g, %d", vf[i], f, j, frexp[i].f, frexp[i].i) } } for i := 0; i < len(vffrexpSC); i++ { if f, j := Frexp(vffrexpSC[i]); !alike(frexpSC[i].f, f) || frexpSC[i].i != j { - t.Errorf("Frexp(%g) = %g, %d, want %g, %d\n", vffrexpSC[i], f, j, frexpSC[i].f, frexpSC[i].i) + t.Errorf("Frexp(%g) = %g, %d, want %g, %d", vffrexpSC[i], f, j, frexpSC[i].f, frexpSC[i].i) } } } @@ -1770,12 +1797,12 @@ func TestFrexp(t *testing.T) { func TestGamma(t *testing.T) { for i := 0; i < len(vf); i++ { if f := Gamma(vf[i]); !close(gamma[i], f) { - t.Errorf("Gamma(%g) = %g, want %g\n", vf[i], f, gamma[i]) + t.Errorf("Gamma(%g) = %g, want %g", vf[i], f, gamma[i]) } } for i := 0; i < len(vfgammaSC); i++ { if f := Gamma(vfgammaSC[i]); !alike(gammaSC[i], f) { - t.Errorf("Gamma(%g) = %g, want %g\n", vfgammaSC[i], f, gammaSC[i]) + t.Errorf("Gamma(%g) = %g, want %g", vfgammaSC[i], f, gammaSC[i]) } } } @@ -1784,25 +1811,26 @@ func TestHypot(t *testing.T) { for i := 0; i < len(vf); i++ { a := Fabs(1e200 * tanh[i] * Sqrt(2)) if f := Hypot(1e200*tanh[i], 1e200*tanh[i]); !veryclose(a, f) { - t.Errorf("Hypot(%g, %g) = %g, want %g\n", 1e200*tanh[i], 1e200*tanh[i], f, a) + t.Errorf("Hypot(%g, %g) = %g, want %g", 1e200*tanh[i], 1e200*tanh[i], f, a) } } for i := 0; i < len(vfhypotSC); i++ { if f := Hypot(vfhypotSC[i][0], vfhypotSC[i][1]); !alike(hypotSC[i], f) { - t.Errorf("Hypot(%g, %g) = %g, want %g\n", vfhypotSC[i][0], vfhypotSC[i][1], f, hypotSC[i]) + t.Errorf("Hypot(%g, %g) = %g, want %g", vfhypotSC[i][0], vfhypotSC[i][1], f, hypotSC[i]) } } } func TestIlogb(t *testing.T) { for i := 0; i < len(vf); i++ { - if e := Ilogb(vf[i]); frexp[i].i != e { - t.Errorf("Ilogb(%g) = %d, want %d\n", vf[i], e, frexp[i].i) + a := frexp[i].i - 1 // adjust because fr in the interval [½, 1) + if e := Ilogb(vf[i]); a != e { + t.Errorf("Ilogb(%g) = %d, want %d", vf[i], e, a) } } for i := 0; i < len(vflogbSC); i++ { if e := Ilogb(vflogbSC[i]); ilogbSC[i] != e { - t.Errorf("Ilogb(%g) = %d, want %d\n", vflogbSC[i], e, ilogbSC[i]) + t.Errorf("Ilogb(%g) = %d, want %d", vflogbSC[i], e, ilogbSC[i]) } } } @@ -1810,12 +1838,12 @@ func TestIlogb(t *testing.T) { func TestJ0(t *testing.T) { for i := 0; i < len(vf); i++ { if f := J0(vf[i]); !soclose(j0[i], f, 4e-14) { - t.Errorf("J0(%g) = %g, want %g\n", vf[i], f, j0[i]) + t.Errorf("J0(%g) = %g, want %g", vf[i], f, j0[i]) } } for i := 0; i < len(vfj0SC); i++ { if f := J0(vfj0SC[i]); !alike(j0SC[i], f) { - t.Errorf("J0(%g) = %g, want %g\n", vfj0SC[i], f, j0SC[i]) + t.Errorf("J0(%g) = %g, want %g", vfj0SC[i], f, j0SC[i]) } } } @@ -1823,12 +1851,12 @@ func TestJ0(t *testing.T) { func TestJ1(t *testing.T) { for i := 0; i < len(vf); i++ { if f := J1(vf[i]); !close(j1[i], f) { - t.Errorf("J1(%g) = %g, want %g\n", vf[i], f, j1[i]) + t.Errorf("J1(%g) = %g, want %g", vf[i], f, j1[i]) } } for i := 0; i < len(vfj0SC); i++ { if f := J1(vfj0SC[i]); !alike(j1SC[i], f) { - t.Errorf("J1(%g) = %g, want %g\n", vfj0SC[i], f, j1SC[i]) + t.Errorf("J1(%g) = %g, want %g", vfj0SC[i], f, j1SC[i]) } } } @@ -1836,18 +1864,18 @@ func TestJ1(t *testing.T) { func TestJn(t *testing.T) { for i := 0; i < len(vf); i++ { if f := Jn(2, vf[i]); !close(j2[i], f) { - t.Errorf("Jn(2, %g) = %g, want %g\n", vf[i], f, j2[i]) + t.Errorf("Jn(2, %g) = %g, want %g", vf[i], f, j2[i]) } if f := Jn(-3, vf[i]); !close(jM3[i], f) { - t.Errorf("Jn(-3, %g) = %g, want %g\n", vf[i], f, jM3[i]) + t.Errorf("Jn(-3, %g) = %g, want %g", vf[i], f, jM3[i]) } } for i := 0; i < len(vfj0SC); i++ { if f := Jn(2, vfj0SC[i]); !alike(j2SC[i], f) { - t.Errorf("Jn(2, %g) = %g, want %g\n", vfj0SC[i], f, j2SC[i]) + t.Errorf("Jn(2, %g) = %g, want %g", vfj0SC[i], f, j2SC[i]) } if f := Jn(-3, vfj0SC[i]); !alike(jM3SC[i], f) { - t.Errorf("Jn(-3, %g) = %g, want %g\n", vfj0SC[i], f, jM3SC[i]) + t.Errorf("Jn(-3, %g) = %g, want %g", vfj0SC[i], f, jM3SC[i]) } } } @@ -1855,12 +1883,12 @@ func TestJn(t *testing.T) { func TestLdexp(t *testing.T) { for i := 0; i < len(vf); i++ { if f := Ldexp(frexp[i].f, frexp[i].i); !veryclose(vf[i], f) { - t.Errorf("Ldexp(%g, %d) = %g, want %g\n", frexp[i].f, frexp[i].i, f, vf[i]) + t.Errorf("Ldexp(%g, %d) = %g, want %g", frexp[i].f, frexp[i].i, f, vf[i]) } } for i := 0; i < len(vffrexpSC); i++ { if f := Ldexp(frexpSC[i].f, frexpSC[i].i); !alike(vffrexpSC[i], f) { - t.Errorf("Ldexp(%g, %d) = %g, want %g\n", frexpSC[i].f, frexpSC[i].i, f, vffrexpSC[i]) + t.Errorf("Ldexp(%g, %d) = %g, want %g", frexpSC[i].f, frexpSC[i].i, f, vffrexpSC[i]) } } } @@ -1868,12 +1896,12 @@ func TestLdexp(t *testing.T) { func TestLgamma(t *testing.T) { for i := 0; i < len(vf); i++ { if f, s := Lgamma(vf[i]); !close(lgamma[i].f, f) || lgamma[i].i != s { - t.Errorf("Lgamma(%g) = %g, %d, want %g, %d\n", vf[i], f, s, lgamma[i].f, lgamma[i].i) + t.Errorf("Lgamma(%g) = %g, %d, want %g, %d", vf[i], f, s, lgamma[i].f, lgamma[i].i) } } for i := 0; i < len(vflgammaSC); i++ { if f, s := Lgamma(vflgammaSC[i]); !alike(lgammaSC[i].f, f) || lgammaSC[i].i != s { - t.Errorf("Lgamma(%g) = %g, %d, want %g, %d\n", vflgammaSC[i], f, s, lgammaSC[i].f, lgammaSC[i].i) + t.Errorf("Lgamma(%g) = %g, %d, want %g, %d", vflgammaSC[i], f, s, lgammaSC[i].f, lgammaSC[i].i) } } } @@ -1882,15 +1910,15 @@ func TestLog(t *testing.T) { for i := 0; i < len(vf); i++ { a := Fabs(vf[i]) if f := Log(a); log[i] != f { - t.Errorf("Log(%g) = %g, want %g\n", a, f, log[i]) + t.Errorf("Log(%g) = %g, want %g", a, f, log[i]) } } if f := Log(10); f != Ln10 { - t.Errorf("Log(%g) = %g, want %g\n", 10.0, f, Ln10) + t.Errorf("Log(%g) = %g, want %g", 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]) + t.Errorf("Log(%g) = %g, want %g", vflogSC[i], f, logSC[i]) } } } @@ -1898,12 +1926,12 @@ func TestLog(t *testing.T) { func TestLogb(t *testing.T) { for i := 0; i < len(vf); i++ { if f := Logb(vf[i]); logb[i] != f { - t.Errorf("Logb(%g) = %g, want %g\n", vf[i], f, logb[i]) + t.Errorf("Logb(%g) = %g, want %g", vf[i], f, logb[i]) } } for i := 0; i < len(vflogbSC); i++ { if f := Logb(vflogbSC[i]); !alike(logbSC[i], f) { - t.Errorf("Logb(%g) = %g, want %g\n", vflogbSC[i], f, logbSC[i]) + t.Errorf("Logb(%g) = %g, want %g", vflogbSC[i], f, logbSC[i]) } } } @@ -1912,15 +1940,15 @@ 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]) + t.Errorf("Log10(%g) = %g, want %g", a, f, log10[i]) } } if f := Log10(E); f != Log10E { - t.Errorf("Log10(%g) = %g, want %g\n", E, f, Log10E) + t.Errorf("Log10(%g) = %g, want %g", 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]) + t.Errorf("Log10(%g) = %g, want %g", vflogSC[i], f, logSC[i]) } } } @@ -1929,16 +1957,16 @@ func TestLog1p(t *testing.T) { for i := 0; i < len(vf); i++ { a := vf[i] / 100 if f := Log1p(a); !veryclose(log1p[i], f) { - t.Errorf("Log1p(%g) = %g, want %g\n", a, f, log1p[i]) + t.Errorf("Log1p(%g) = %g, want %g", a, f, log1p[i]) } } a := float64(9) if f := Log1p(a); f != Ln10 { - t.Errorf("Log1p(%g) = %g, want %g\n", a, f, Ln10) + t.Errorf("Log1p(%g) = %g, want %g", a, f, Ln10) } for i := 0; i < len(vflogSC); i++ { if f := Log1p(vflog1pSC[i]); !alike(log1pSC[i], f) { - t.Errorf("Log1p(%g) = %g, want %g\n", vflog1pSC[i], f, log1pSC[i]) + t.Errorf("Log1p(%g) = %g, want %g", vflog1pSC[i], f, log1pSC[i]) } } } @@ -1947,15 +1975,15 @@ func TestLog2(t *testing.T) { for i := 0; i < len(vf); i++ { a := Fabs(vf[i]) if f := Log2(a); !veryclose(log2[i], f) { - t.Errorf("Log2(%g) = %g, want %g\n", a, f, log2[i]) + t.Errorf("Log2(%g) = %g, want %g", a, f, log2[i]) } } if f := Log2(E); f != Log2E { - t.Errorf("Log2(%g) = %g, want %g\n", E, f, Log2E) + t.Errorf("Log2(%g) = %g, want %g", E, f, Log2E) } for i := 0; i < len(vflogSC); i++ { if f := Log2(vflogSC[i]); !alike(logSC[i], f) { - t.Errorf("Log2(%g) = %g, want %g\n", vflogSC[i], f, logSC[i]) + t.Errorf("Log2(%g) = %g, want %g", vflogSC[i], f, logSC[i]) } } } @@ -1963,12 +1991,12 @@ func TestLog2(t *testing.T) { func TestModf(t *testing.T) { for i := 0; i < len(vf); i++ { if f, g := Modf(vf[i]); !veryclose(modf[i][0], f) || !veryclose(modf[i][1], g) { - t.Errorf("Modf(%g) = %g, %g, want %g, %g\n", vf[i], f, g, modf[i][0], modf[i][1]) + t.Errorf("Modf(%g) = %g, %g, want %g, %g", vf[i], f, g, modf[i][0], modf[i][1]) } } for i := 0; i < len(vfmodfSC); i++ { if f, g := Modf(vfmodfSC[i]); !alike(modfSC[i][0], f) || !alike(modfSC[i][1], g) { - t.Errorf("Modf(%g) = %g, %g, want %g, %g\n", vfmodfSC[i], f, g, modfSC[i][0], modfSC[i][1]) + t.Errorf("Modf(%g) = %g, %g, want %g, %g", vfmodfSC[i], f, g, modfSC[i][0], modfSC[i][1]) } } } @@ -1976,12 +2004,12 @@ func TestModf(t *testing.T) { func TestNextafter(t *testing.T) { for i := 0; i < len(vf); i++ { if f := Nextafter(vf[i], 10); nextafter[i] != f { - t.Errorf("Nextafter(%g, %g) = %g want %g\n", vf[i], 10.0, f, nextafter[i]) + t.Errorf("Nextafter(%g, %g) = %g want %g", vf[i], 10.0, f, nextafter[i]) } } for i := 0; i < len(vfmodfSC); i++ { if f := Nextafter(vfnextafterSC[i][0], vfnextafterSC[i][1]); !alike(nextafterSC[i], f) { - t.Errorf("Nextafter(%g, %g) = %g want %g\n", vfnextafterSC[i][0], vfnextafterSC[i][1], f, nextafterSC[i]) + t.Errorf("Nextafter(%g, %g) = %g want %g", vfnextafterSC[i][0], vfnextafterSC[i][1], f, nextafterSC[i]) } } } @@ -1989,12 +2017,12 @@ func TestNextafter(t *testing.T) { func TestPow(t *testing.T) { for i := 0; i < len(vf); i++ { if f := Pow(10, vf[i]); !close(pow[i], f) { - t.Errorf("Pow(10, %g) = %g, want %g\n", vf[i], f, pow[i]) + t.Errorf("Pow(10, %g) = %g, want %g", vf[i], f, pow[i]) } } for i := 0; i < len(vfpowSC); i++ { if f := Pow(vfpowSC[i][0], vfpowSC[i][1]); !alike(powSC[i], f) { - t.Errorf("Pow(%g, %g) = %g, want %g\n", vfpowSC[i][0], vfpowSC[i][1], f, powSC[i]) + t.Errorf("Pow(%g, %g) = %g, want %g", vfpowSC[i][0], vfpowSC[i][1], f, powSC[i]) } } } @@ -2002,12 +2030,12 @@ func TestPow(t *testing.T) { func TestRemainder(t *testing.T) { for i := 0; i < len(vf); i++ { if f := Remainder(10, vf[i]); remainder[i] != f { - t.Errorf("Remainder(10, %g) = %g, want %g\n", vf[i], f, remainder[i]) + t.Errorf("Remainder(10, %g) = %g, want %g", vf[i], f, remainder[i]) } } for i := 0; i < len(vffmodSC); i++ { if f := Remainder(vffmodSC[i][0], vffmodSC[i][1]); !alike(fmodSC[i], f) { - t.Errorf("Remainder(%g, %g) = %g, want %g\n", vffmodSC[i][0], vffmodSC[i][1], f, fmodSC[i]) + t.Errorf("Remainder(%g, %g) = %g, want %g", vffmodSC[i][0], vffmodSC[i][1], f, fmodSC[i]) } } } @@ -2015,24 +2043,24 @@ func TestRemainder(t *testing.T) { func TestSignbit(t *testing.T) { for i := 0; i < len(vf); i++ { if f := Signbit(vf[i]); signbit[i] != f { - t.Errorf("Signbit(%g) = %t, want %t\n", vf[i], f, signbit[i]) + t.Errorf("Signbit(%g) = %t, want %t", vf[i], f, signbit[i]) } } for i := 0; i < len(vfsignbitSC); i++ { if f := Signbit(vfsignbitSC[i]); signbitSC[i] != f { - t.Errorf("Signbit(%g) = %t, want %t\n", vfsignbitSC[i], f, signbitSC[i]) + t.Errorf("Signbit(%g) = %t, want %t", vfsignbitSC[i], f, signbitSC[i]) } } } func TestSin(t *testing.T) { for i := 0; i < len(vf); i++ { if f := Sin(vf[i]); !close(sin[i], f) { - t.Errorf("Sin(%g) = %g, want %g\n", vf[i], f, sin[i]) + t.Errorf("Sin(%g) = %g, want %g", vf[i], f, sin[i]) } } for i := 0; i < len(vfsinSC); i++ { if f := Sin(vfsinSC[i]); !alike(sinSC[i], f) { - t.Errorf("Sin(%g) = %g, want %g\n", vfsinSC[i], f, sinSC[i]) + t.Errorf("Sin(%g) = %g, want %g", vfsinSC[i], f, sinSC[i]) } } } @@ -2040,7 +2068,7 @@ func TestSin(t *testing.T) { 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]) + t.Errorf("Sincos(%g) = %g, %g want %g, %g", vf[i], s, c, sin[i], cos[i]) } } } @@ -2048,12 +2076,12 @@ func TestSincos(t *testing.T) { func TestSinh(t *testing.T) { for i := 0; i < len(vf); i++ { if f := Sinh(vf[i]); !close(sinh[i], f) { - t.Errorf("Sinh(%g) = %g, want %g\n", vf[i], f, sinh[i]) + t.Errorf("Sinh(%g) = %g, want %g", vf[i], f, sinh[i]) } } for i := 0; i < len(vfsinhSC); i++ { if f := Sinh(vfsinhSC[i]); !alike(sinhSC[i], f) { - t.Errorf("Sinh(%g) = %g, want %g\n", vfsinhSC[i], f, sinhSC[i]) + t.Errorf("Sinh(%g) = %g, want %g", vfsinhSC[i], f, sinhSC[i]) } } } @@ -2062,19 +2090,19 @@ func TestSqrt(t *testing.T) { for i := 0; i < len(vf); i++ { a := Fabs(vf[i]) if f := SqrtGo(a); sqrt[i] != f { - t.Errorf("SqrtGo(%g) = %g, want %g\n", a, f, sqrt[i]) + t.Errorf("SqrtGo(%g) = %g, want %g", a, f, sqrt[i]) } a = Fabs(vf[i]) if f := Sqrt(a); sqrt[i] != f { - t.Errorf("Sqrt(%g) = %g, want %g\n", a, f, sqrt[i]) + t.Errorf("Sqrt(%g) = %g, want %g", a, f, sqrt[i]) } } for i := 0; i < len(vfsqrtSC); i++ { if f := SqrtGo(vfsqrtSC[i]); !alike(sqrtSC[i], f) { - t.Errorf("SqrtGo(%g) = %g, want %g\n", vfsqrtSC[i], f, sqrtSC[i]) + t.Errorf("SqrtGo(%g) = %g, want %g", vfsqrtSC[i], f, sqrtSC[i]) } if f := Sqrt(vfsqrtSC[i]); !alike(sqrtSC[i], f) { - t.Errorf("Sqrt(%g) = %g, want %g\n", vfsqrtSC[i], f, sqrtSC[i]) + t.Errorf("Sqrt(%g) = %g, want %g", vfsqrtSC[i], f, sqrtSC[i]) } } } @@ -2082,13 +2110,23 @@ func TestSqrt(t *testing.T) { func TestTan(t *testing.T) { for i := 0; i < len(vf); i++ { if f := Tan(vf[i]); !close(tan[i], f) { - t.Errorf("Tan(%g) = %g, want %g\n", vf[i], f, tan[i]) + t.Errorf("Tan(%g) = %g, want %g", vf[i], f, tan[i]) } } // same special cases as Sin for i := 0; i < len(vfsinSC); i++ { if f := Tan(vfsinSC[i]); !alike(sinSC[i], f) { - t.Errorf("Tan(%g) = %g, want %g\n", vfsinSC[i], f, sinSC[i]) + t.Errorf("Tan(%g) = %g, want %g", vfsinSC[i], f, sinSC[i]) + } + } + + // Make sure portable Tan(Pi/2) doesn't panic (it used to). + // The portable implementation returns NaN. + // Assembly implementations might not, + // because Pi/2 is not exactly representable. + if runtime.GOARCH != "386" { + if f := Tan(Pi / 2); !alike(f, NaN()) { + t.Errorf("Tan(%g) = %g, want %g", Pi/2, f, NaN()) } } } @@ -2096,12 +2134,12 @@ func TestTan(t *testing.T) { func TestTanh(t *testing.T) { for i := 0; i < len(vf); i++ { if f := Tanh(vf[i]); !veryclose(tanh[i], f) { - t.Errorf("Tanh(%g) = %g, want %g\n", vf[i], f, tanh[i]) + t.Errorf("Tanh(%g) = %g, want %g", vf[i], f, tanh[i]) } } for i := 0; i < len(vftanhSC); i++ { if f := Tanh(vftanhSC[i]); !alike(tanhSC[i], f) { - t.Errorf("Tanh(%g) = %g, want %g\n", vftanhSC[i], f, tanhSC[i]) + t.Errorf("Tanh(%g) = %g, want %g", vftanhSC[i], f, tanhSC[i]) } } } @@ -2109,12 +2147,12 @@ func TestTanh(t *testing.T) { func TestTrunc(t *testing.T) { for i := 0; i < len(vf); i++ { if f := Trunc(vf[i]); trunc[i] != f { - t.Errorf("Trunc(%g) = %g, want %g\n", vf[i], f, trunc[i]) + t.Errorf("Trunc(%g) = %g, want %g", vf[i], f, trunc[i]) } } for i := 0; i < len(vfceilSC); i++ { if f := Trunc(vfceilSC[i]); !alike(ceilSC[i], f) { - t.Errorf("Trunc(%g) = %g, want %g\n", vfceilSC[i], f, ceilSC[i]) + t.Errorf("Trunc(%g) = %g, want %g", vfceilSC[i], f, ceilSC[i]) } } } @@ -2123,12 +2161,12 @@ func TestY0(t *testing.T) { for i := 0; i < len(vf); i++ { a := Fabs(vf[i]) if f := Y0(a); !close(y0[i], f) { - t.Errorf("Y0(%g) = %g, want %g\n", a, f, y0[i]) + t.Errorf("Y0(%g) = %g, want %g", a, f, y0[i]) } } for i := 0; i < len(vfy0SC); i++ { if f := Y0(vfy0SC[i]); !alike(y0SC[i], f) { - t.Errorf("Y0(%g) = %g, want %g\n", vfy0SC[i], f, y0SC[i]) + t.Errorf("Y0(%g) = %g, want %g", vfy0SC[i], f, y0SC[i]) } } } @@ -2137,12 +2175,12 @@ func TestY1(t *testing.T) { for i := 0; i < len(vf); i++ { a := Fabs(vf[i]) if f := Y1(a); !soclose(y1[i], f, 2e-14) { - t.Errorf("Y1(%g) = %g, want %g\n", a, f, y1[i]) + t.Errorf("Y1(%g) = %g, want %g", a, f, y1[i]) } } for i := 0; i < len(vfy0SC); i++ { if f := Y1(vfy0SC[i]); !alike(y1SC[i], f) { - t.Errorf("Y1(%g) = %g, want %g\n", vfy0SC[i], f, y1SC[i]) + t.Errorf("Y1(%g) = %g, want %g", vfy0SC[i], f, y1SC[i]) } } } @@ -2151,18 +2189,18 @@ func TestYn(t *testing.T) { for i := 0; i < len(vf); i++ { a := Fabs(vf[i]) if f := Yn(2, a); !close(y2[i], f) { - t.Errorf("Yn(2, %g) = %g, want %g\n", a, f, y2[i]) + t.Errorf("Yn(2, %g) = %g, want %g", a, f, y2[i]) } if f := Yn(-3, a); !close(yM3[i], f) { - t.Errorf("Yn(-3, %g) = %g, want %g\n", a, f, yM3[i]) + t.Errorf("Yn(-3, %g) = %g, want %g", a, f, yM3[i]) } } for i := 0; i < len(vfy0SC); i++ { if f := Yn(2, vfy0SC[i]); !alike(y2SC[i], f) { - t.Errorf("Yn(2, %g) = %g, want %g\n", vfy0SC[i], f, y2SC[i]) + t.Errorf("Yn(2, %g) = %g, want %g", vfy0SC[i], f, y2SC[i]) } if f := Yn(-3, vfy0SC[i]); !alike(yM3SC[i], f) { - t.Errorf("Yn(-3, %g) = %g, want %g\n", vfy0SC[i], f, yM3SC[i]) + t.Errorf("Yn(-3, %g) = %g, want %g", vfy0SC[i], f, yM3SC[i]) } } } @@ -2175,7 +2213,7 @@ func TestLargeCos(t *testing.T) { 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) + t.Errorf("Cos(%g) = %g, want %g", vf[i]+large, f2, f1) } } } @@ -2186,7 +2224,7 @@ func TestLargeSin(t *testing.T) { f1 := Sin(vf[i]) f2 := Sin(vf[i] + large) if !kindaclose(f1, f2) { - t.Errorf("Sin(%g) = %g, want %g\n", vf[i]+large, f2, f1) + t.Errorf("Sin(%g) = %g, want %g", vf[i]+large, f2, f1) } } } @@ -2197,7 +2235,7 @@ func TestLargeSincos(t *testing.T) { 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) + t.Errorf("Sincos(%g) = %g, %g, want %g, %g", vf[i]+large, f2, g2, f1, g1) } } } @@ -2208,7 +2246,7 @@ func TestLargeTan(t *testing.T) { f1 := Tan(vf[i]) f2 := Tan(vf[i] + large) if !kindaclose(f1, f2) { - t.Errorf("Tan(%g) = %g, want %g\n", vf[i]+large, f2, f1) + t.Errorf("Tan(%g) = %g, want %g", vf[i]+large, f2, f1) } } } @@ -2224,10 +2262,10 @@ type floatTest struct { } var floatTests = []floatTest{ - floatTest{float64(MaxFloat64), "MaxFloat64", "1.7976931348623157e+308"}, - floatTest{float64(MinFloat64), "MinFloat64", "5e-324"}, - floatTest{float32(MaxFloat32), "MaxFloat32", "3.4028235e+38"}, - floatTest{float32(MinFloat32), "MinFloat32", "1e-45"}, + {float64(MaxFloat64), "MaxFloat64", "1.7976931348623157e+308"}, + {float64(SmallestNonzeroFloat64), "SmallestNonzeroFloat64", "5e-324"}, + {float32(MaxFloat32), "MaxFloat32", "3.4028235e+38"}, + {float32(SmallestNonzeroFloat32), "SmallestNonzeroFloat32", "1e-45"}, } func TestFloatMinMax(t *testing.T) { @@ -2331,6 +2369,12 @@ func BenchmarkExp(b *testing.B) { } } +func BenchmarkExpGo(b *testing.B) { + for i := 0; i < b.N; i++ { + ExpGo(.5) + } +} + func BenchmarkExpm1(b *testing.B) { for i := 0; i < b.N; i++ { Expm1(.5) @@ -2343,6 +2387,12 @@ func BenchmarkExp2(b *testing.B) { } } +func BenchmarkExp2Go(b *testing.B) { + for i := 0; i < b.N; i++ { + Exp2Go(.5) + } +} + func BenchmarkFabs(b *testing.B) { for i := 0; i < b.N; i++ { Fabs(.5) |