8.734595415957246977711748e-01,
1.314075231424398637614104e+00,
}
+var signbit = []bool{
+ false,
+ false,
+ true,
+ true,
+ false,
+ false,
+ false,
+ false,
+ false,
+ true,
+}
var sin = []float64{
-9.6466616586009283766724726e-01,
9.9338225271646545763467022e-01,
[2]float64{-Pi, 0},
[2]float64{-Pi, Inf(1)},
[2]float64{-Pi, NaN()},
+ [2]float64{-1 / Inf(1), Inf(-1)}, // -0, -Inf
+ [2]float64{-1 / Inf(1), -Pi}, // -0, -Pi
+ [2]float64{-1 / Inf(1), -1 / Inf(1)}, // -0, -0
+ [2]float64{-1 / Inf(1), 0}, // -0, +0
+ [2]float64{-1 / Inf(1), +Pi}, // -0, +Pi
+ [2]float64{-1 / Inf(1), Inf(1)}, // -0, +Inf
+ [2]float64{-1 / Inf(1), NaN()}, // -0, NaN
[2]float64{0, Inf(-1)},
[2]float64{0, -Pi},
+ [2]float64{0, -1 / Inf(1)}, // +0, -0
[2]float64{0, 0},
[2]float64{0, +Pi},
[2]float64{0, Inf(1)},
NaN(),
-Pi,
-Pi / 2,
- -0,
+ -1 / Inf(1), // -0
+ NaN(),
+ -Pi,
+ -Pi,
+ -Pi, // -0, -0
+ -1 / Inf(1),
+ -1 / Inf(1),
+ -1 / Inf(1),
NaN(),
Pi,
Pi,
+ Pi, // +0, -0
0,
0,
0,
1,
}
+var vfsignbitSC = []float64{
+ Inf(-1),
+ -1 / Inf(1), // -0
+ 1 / Inf(1), // +0
+ Inf(1),
+ NaN(),
+}
+var signbitSC = []bool{
+ true,
+ true,
+ false,
+ false,
+ false,
+}
+
var vfsqrtSC = []float64{
Inf(-1),
-Pi,
case IsNaN(a) && IsNaN(b):
return true
case a == b:
- return true
+ return Signbit(a) == Signbit(b)
}
return false
}
}
}
+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])
+ }
+ }
+ 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], 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) {
}
}
+func BenchmarkSignbit(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ Signbit(2.5)
+ }
+}
+
func BenchmarkSin(b *testing.B) {
for i := 0; i < b.N; i++ {
Sin(.5)
// 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
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.