diff --git a/src/math/all_test.go b/src/math/all_test.go index efbb218d5b..886267bc17 100644 --- a/src/math/all_test.go +++ b/src/math/all_test.go @@ -1688,8 +1688,11 @@ var vfpowSC = [][2]float64{ {Nextafter(-1, 2), float64(1 << 63)}, {Nextafter(-1, -2), float64(1 << 63)}, - // Issue #57465, exponent is an even number that overflows int64 + // Issue #57465 {Copysign(0, -1), 1e19}, + {Copysign(0, -1), -1e19}, + {Copysign(0, -1), 1<<53 - 1}, + {Copysign(0, -1), -(1<<53 - 1)}, } var powSC = []float64{ 0, // pow(-Inf, -Pi) @@ -1766,8 +1769,11 @@ var powSC = []float64{ 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, + // Issue #57465 + 0, // pow(-0, 1e19) + Inf(1), // pow(-0, -1e19) + Copysign(0, -1), // pow(-0, 1<<53 -1) + Inf(-1), // pow(-0, -(1<<53 -1)) } var vfpow10SC = []int{ diff --git a/src/math/pow.go b/src/math/pow.go index 32ecf5870f..3f42945376 100644 --- a/src/math/pow.go +++ b/src/math/pow.go @@ -6,6 +6,11 @@ package math func isOddInt(x float64) bool { if Abs(x) >= (1 << 53) { + // 1 << 53 is the largest exact integer in the float64 format. + // Any number outside this range will be truncated before the decimal point and therefore will always be + // an even integer. + // Without this check and if x overflows int64 the int64(xi) conversion below may produce incorrect results + // on some architectures (and does so on arm64). See issue #57465. return false }