Commit 65357913 authored by David Chase's avatar David Chase

math: fix math.Remainder(-x,x) (for Inf > x > 0)

Modify the |x| == |y| case to return -0 when x < 0.

Fixes #30814.

Change-Id: Ic4cd48001e0e894a12b5b813c6a1ddc3a055610b
Reviewed-on: https://go-review.googlesource.com/c/go/+/167479
Run-TryBot: David Chase <drchase@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarRobert Griesemer <gri@golang.org>
parent 9d9d4eeb
...@@ -2795,6 +2795,20 @@ func TestRemainder(t *testing.T) { ...@@ -2795,6 +2795,20 @@ func TestRemainder(t *testing.T) {
if f := Remainder(5.9790119248836734e+200, 1.1258465975523544); -0.4810497673014966 != f { if f := Remainder(5.9790119248836734e+200, 1.1258465975523544); -0.4810497673014966 != f {
t.Errorf("Remainder(5.9790119248836734e+200, 1.1258465975523544) = %g, want -0.4810497673014966", f) t.Errorf("Remainder(5.9790119248836734e+200, 1.1258465975523544) = %g, want -0.4810497673014966", f)
} }
// verify that sign is correct when r == 0.
test := func(x, y float64) {
if r := Remainder(x, y); r == 0 && Signbit(r) != Signbit(x) {
t.Errorf("Remainder(x=%f, y=%f) = %f, sign of (zero) result should agree with sign of x", x, y, r)
}
}
for x := 0.0; x <= 3.0; x += 1 {
for y := 1.0; y <= 3.0; y += 1 {
test(x, y)
test(x, -y)
test(-x, y)
test(-x, -y)
}
}
} }
func TestRound(t *testing.T) { func TestRound(t *testing.T) {
......
...@@ -57,6 +57,10 @@ func remainder(x, y float64) float64 { ...@@ -57,6 +57,10 @@ func remainder(x, y float64) float64 {
y = -y y = -y
} }
if x == y { if x == y {
if sign {
zero := 0.0
return -zero
}
return 0 return 0
} }
if y <= HalfMax { if y <= HalfMax {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment