From: David Chase Date: Wed, 13 Mar 2019 20:46:10 +0000 (-0400) Subject: math: fix math.Remainder(-x,x) (for Inf > x > 0) X-Git-Tag: go1.13beta1~1019 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=653579138555ff2728ba16f841b640e06deab8df;p=gostls13.git 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 TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- diff --git a/src/math/all_test.go b/src/math/all_test.go index ed42941780..208c8233e0 100644 --- a/src/math/all_test.go +++ b/src/math/all_test.go @@ -2795,6 +2795,20 @@ func TestRemainder(t *testing.T) { if f := Remainder(5.9790119248836734e+200, 1.1258465975523544); -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) { diff --git a/src/math/remainder.go b/src/math/remainder.go index 504fdda7df..7c77d6eb3b 100644 --- a/src/math/remainder.go +++ b/src/math/remainder.go @@ -57,6 +57,10 @@ func remainder(x, y float64) float64 { y = -y } if x == y { + if sign { + zero := 0.0 + return -zero + } return 0 } if y <= HalfMax {