mirror of
https://github.com/golang/go
synced 2024-11-12 07:40:23 -07:00
math/cmplx: define Pow(0, x) for problematic values of x.
Currently it's always zero, but that is inconsistent with math.Pow and also plain wrong. This is a proposal for how it should be defined. Fixes #7583. LGTM=rsc R=golang-codereviews, iant, gobot, rsc CC=golang-codereviews https://golang.org/cl/76940044
This commit is contained in:
parent
929ee59fce
commit
a9014ba415
@ -656,6 +656,19 @@ func TestPolar(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
func TestPow(t *testing.T) {
|
func TestPow(t *testing.T) {
|
||||||
|
// Special cases for Pow(0, c).
|
||||||
|
var zero = complex(0, 0)
|
||||||
|
zeroPowers := [][2]complex128{
|
||||||
|
{0, 1 + 0i},
|
||||||
|
{1.5, 0 + 0i},
|
||||||
|
{-1.5, complex(math.Inf(0), 0)},
|
||||||
|
{-1.5 + 1.5i, Inf()},
|
||||||
|
}
|
||||||
|
for _, zp := range zeroPowers {
|
||||||
|
if f := Pow(zero, zp[0]); f != zp[1] {
|
||||||
|
t.Errorf("Pow(%g, %g) = %g, want %g", zero, zp[0], f, zp[1])
|
||||||
|
}
|
||||||
|
}
|
||||||
var a = complex(3.0, 3.0)
|
var a = complex(3.0, 3.0)
|
||||||
for i := 0; i < len(vc); i++ {
|
for i := 0; i < len(vc); i++ {
|
||||||
if f := Pow(a, vc[i]); !cSoclose(pow[i], f, 4e-15) {
|
if f := Pow(a, vc[i]); !cSoclose(pow[i], f, 4e-15) {
|
||||||
|
@ -43,7 +43,25 @@ import "math"
|
|||||||
// IEEE -10,+10 30000 9.4e-15 1.5e-15
|
// IEEE -10,+10 30000 9.4e-15 1.5e-15
|
||||||
|
|
||||||
// Pow returns x**y, the base-x exponential of y.
|
// Pow returns x**y, the base-x exponential of y.
|
||||||
|
// For generalized compatiblity with math.Pow:
|
||||||
|
// Pow(0, ±0) returns 1+0i
|
||||||
|
// Pow(0, c) for real(c)<0 returns Inf+0i if imag(c) is zero, otherwise Inf+Inf i.
|
||||||
func Pow(x, y complex128) complex128 {
|
func Pow(x, y complex128) complex128 {
|
||||||
|
if x == 0 { // Guaranteed also true for x == -0.
|
||||||
|
r, i := real(y), imag(y)
|
||||||
|
switch {
|
||||||
|
case r == 0:
|
||||||
|
return 1
|
||||||
|
case r < 0:
|
||||||
|
if i == 0 {
|
||||||
|
return complex(math.Inf(1), 0)
|
||||||
|
}
|
||||||
|
return Inf()
|
||||||
|
case r > 0:
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
panic("not reached")
|
||||||
|
}
|
||||||
modulus := Abs(x)
|
modulus := Abs(x)
|
||||||
if modulus == 0 {
|
if modulus == 0 {
|
||||||
return complex(0, 0)
|
return complex(0, 0)
|
||||||
|
Loading…
Reference in New Issue
Block a user