summaryrefslogtreecommitdiff
path: root/numpy/core
diff options
context:
space:
mode:
authorCharles Harris <charlesr.harris@gmail.com>2019-02-22 12:55:50 -0700
committerGitHub <noreply@github.com>2019-02-22 12:55:50 -0700
commit1bf2b9434b74a27019a04622dd5bc3790102e7d6 (patch)
tree9c27ffa51141aa4994e65bdb14475243dc0ce1b6 /numpy/core
parent04b422017008bb24713475b85c072395dce89059 (diff)
parent56bf38b018160471dfe88cb6f2a6dc0a5e93c087 (diff)
downloadnumpy-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.src4
-rw-r--r--numpy/core/tests/test_umath.py6
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))