From b10b4087132d51ee33bf5e0777282af23d6ee3cd Mon Sep 17 00:00:00 2001 From: gfyoung Date: Wed, 22 Feb 2017 20:44:38 -0500 Subject: BUG: Remove extra digit in binary_repr at limit For negative numbers at the limit for a given number of digits, we were appending an extra digit unnecessarily. Closes gh-8670. --- numpy/core/numeric.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'numpy/core/numeric.py') diff --git a/numpy/core/numeric.py b/numpy/core/numeric.py index 066697f3e..d4d4045a0 100644 --- a/numpy/core/numeric.py +++ b/numpy/core/numeric.py @@ -2206,7 +2206,7 @@ def binary_repr(num, width=None): designated form. If the `width` value is insufficient, it will be ignored, and `num` will - be returned in binary(`num` > 0) or two's complement (`num` < 0) form + be returned in binary (`num` > 0) or two's complement (`num` < 0) form with its width equal to the minimum number of bits needed to represent the number in the designated form. This behavior is deprecated and will later raise an error. @@ -2276,10 +2276,16 @@ def binary_repr(num, width=None): else: poswidth = len(bin(-num)[2:]) - twocomp = 2**(poswidth + 1) + num + # See gh-8679: remove extra digit + # for numbers at boundaries. + if 2**(poswidth - 1) == -num: + poswidth -= 1 + + twocomp = 2**(poswidth + 1) + num binary = bin(twocomp)[2:] binwidth = len(binary) + outwidth = max(binwidth, width) warn_if_insufficient(width, binwidth) return '1' * (outwidth - binwidth) + binary -- cgit v1.2.1