Author: Carl Friedrich Bolz-Tereick <cfb...@gmx.de>
Branch: math-improvements
Changeset: r93757:744cb1dc4f2e
Date: 2018-02-05 11:49 +0100
http://bitbucket.org/pypy/pypy/changeset/744cb1dc4f2e/

Log:    fix rbigint.int_divmod

diff --git a/rpython/rlib/rbigint.py b/rpython/rlib/rbigint.py
--- a/rpython/rlib/rbigint.py
+++ b/rpython/rlib/rbigint.py
@@ -949,24 +949,23 @@
         if not int_in_valid_range(w) or (wsign == -1 and v.sign != wsign):
             # Just fallback.
             return v.divmod(rbigint.fromint(w))
-            
+
         digit = abs(w)
         assert digit > 0
 
         div, mod = _divrem1(v, digit)
         div.sign = v.sign * wsign
-            
-        if v.sign != wsign:
+        if v.sign < 0:
+            mod = -mod
+        if mod and v.sign * wsign == -1:
+            mod += w
             if div.sign == 0:
                 div = ONENEGATIVERBIGINT
             else:
                 div = div.int_sub(1)
-            mod = w - mod
-            
-        mod = rbigint.fromint(wsign * mod)
-        
+        mod = rbigint.fromint(mod)
         return div, mod
-        
+
     @jit.elidable
     def pow(a, b, c=None):
         negativeOutput = False  # if x<0 return negative output
diff --git a/rpython/rlib/test/test_rbigint.py 
b/rpython/rlib/test/test_rbigint.py
--- a/rpython/rlib/test/test_rbigint.py
+++ b/rpython/rlib/test/test_rbigint.py
@@ -902,8 +902,6 @@
                 for sx, sy in (1, 1), (1, -1), (-1, -1), (-1, 1):
                     sx *= x
                     sy *= y
-                    if sx == 0 and sy == 1:
-                        import pdb; pdb.set_trace()
                     if sy == sys.maxint + 1:
                         continue
                     f1 = rbigint.fromlong(sx)
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to