]> Cypherpunks repositories - gostls13.git/commitdiff
math: fix math.Remainder(-x,x) (for Inf > x > 0)
authorDavid Chase <drchase@google.com>
Wed, 13 Mar 2019 20:46:10 +0000 (16:46 -0400)
committerDavid Chase <drchase@google.com>
Fri, 15 Mar 2019 14:52:51 +0000 (14:52 +0000)
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: Robert Griesemer <gri@golang.org>
src/math/all_test.go
src/math/remainder.go

index ed42941780973a27b2f747757809c02fcada849f..208c8233e0d22e50b8f9a64be69e1fad0f09a6d1 100644 (file)
@@ -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) {
index 504fdda7dff64ea4237b784f9537a634aa100be7..7c77d6eb3b9edf879162c5fd512c8f0abe3a3e26 100644 (file)
@@ -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 {