diff --git a/src/math/all_test.go b/src/math/all_test.go index 8d5e0ad4391..efbb218d5be 100644 --- a/src/math/all_test.go +++ b/src/math/all_test.go @@ -1687,6 +1687,9 @@ var vfpowSC = [][2]float64{ {Nextafter(1, -2), float64(1 << 63)}, {Nextafter(-1, 2), float64(1 << 63)}, {Nextafter(-1, -2), float64(1 << 63)}, + + // Issue #57465, exponent is an even number that overflows int64 + {Copysign(0, -1), 1e19}, } var powSC = []float64{ 0, // pow(-Inf, -Pi) @@ -1762,6 +1765,9 @@ var powSC = []float64{ 0, // pow(Nextafter(1, -2), float64(1 << 63)) 0, // pow(Nextafter(-1, 2), float64(1 << 63)) Inf(1), // pow(Nextafter(-1, -2), float64(1 << 63)) + + // Issue #57465, exponent is an even number that overflows int64 + 0, } var vfpow10SC = []int{ diff --git a/src/math/pow.go b/src/math/pow.go index 3af8c8b649b..32ecf5870fe 100644 --- a/src/math/pow.go +++ b/src/math/pow.go @@ -5,6 +5,10 @@ package math func isOddInt(x float64) bool { + if Abs(x) >= (1 << 53) { + return false + } + xi, xf := Modf(x) return xf == 0 && int64(xi)&1 == 1 } @@ -54,12 +58,12 @@ func pow(x, y float64) float64 { case x == 0: switch { case y < 0: - if isOddInt(y) { - return Copysign(Inf(1), x) + if Signbit(x) && isOddInt(y) { + return Inf(-1) } return Inf(1) case y > 0: - if isOddInt(y) { + if Signbit(x) && isOddInt(y) { return x } return 0