diff options
author | Charles Harris <charlesr.harris@gmail.com> | 2019-02-22 12:55:50 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-02-22 12:55:50 -0700 |
commit | 1bf2b9434b74a27019a04622dd5bc3790102e7d6 (patch) | |
tree | 9c27ffa51141aa4994e65bdb14475243dc0ce1b6 /numpy/core | |
parent | 04b422017008bb24713475b85c072395dce89059 (diff) | |
parent | 56bf38b018160471dfe88cb6f2a6dc0a5e93c087 (diff) | |
download | numpy-1bf2b9434b74a27019a04622dd5bc3790102e7d6.tar.gz |
Merge pull request #12846 from tlatorre-uchicago/divmod-bugfix
BUG: fix signed zero behavior in npy_divmod
Diffstat (limited to 'numpy/core')
-rw-r--r-- | numpy/core/src/npymath/npy_math_internal.h.src | 4 | ||||
-rw-r--r-- | numpy/core/tests/test_umath.py | 6 |
2 files changed, 8 insertions, 2 deletions
diff --git a/numpy/core/src/npymath/npy_math_internal.h.src b/numpy/core/src/npymath/npy_math_internal.h.src index f2e5229b0..fa820baac 100644 --- a/numpy/core/src/npymath/npy_math_internal.h.src +++ b/numpy/core/src/npymath/npy_math_internal.h.src @@ -654,7 +654,7 @@ npy_divmod@c@(@type@ a, @type@ b, @type@ *modulus) } else { /* if mod is zero ensure correct sign */ - mod = (b > 0) ? 0.0@c@ : -0.0@c@; + mod = npy_copysign@c@(0, b); } /* snap quotient to nearest integral value */ @@ -665,7 +665,7 @@ npy_divmod@c@(@type@ a, @type@ b, @type@ *modulus) } else { /* if div is zero ensure correct sign */ - floordiv = (a / b > 0) ? 0.0@c@ : -0.0@c@; + floordiv = npy_copysign@c@(0, a/b); } *modulus = mod; diff --git a/numpy/core/tests/test_umath.py b/numpy/core/tests/test_umath.py index 21097244f..db6b51922 100644 --- a/numpy/core/tests/test_umath.py +++ b/numpy/core/tests/test_umath.py @@ -273,6 +273,12 @@ class TestDivision(object): y = np.floor_divide(x**2, x) assert_equal(y, [1.e+110, 0], err_msg=msg) + def test_floor_division_signed_zero(self): + # Check that the sign bit is correctly set when dividing positive and + # negative zero by one. + x = np.zeros(10) + assert_equal(np.signbit(x//1), 0) + assert_equal(np.signbit((-x)//1), 1) def floor_divide_and_remainder(x, y): return (np.floor_divide(x, y), np.remainder(x, y)) |