diff -r f494052eb476 Lib/test/test_long.py --- a/Lib/test/test_long.py Mon Feb 08 20:28:22 2016 +0200 +++ b/Lib/test/test_long.py Mon Feb 08 16:32:48 2016 -0500 @@ -723,6 +723,20 @@ for zero in ["huge / 0", "mhuge / 0"]: self.assertRaises(ZeroDivisionError, eval, zero, namespace) + def test_floordiv(self): + with self.assertRaises(ZeroDivisionError): + a = 1 // 0 + + self.assertEqual(2 // 3, 0) + self.assertEqual(2 // -3, -1) + self.assertEqual(-2 // 3, -1) + self.assertEqual(-2 // -3, 0) + + self.assertEqual(-11 // -3, 3) + self.assertEqual(-11 // 3, -4) + self.assertEqual(11 // -3, -4) + self.assertEqual(11 // 3, 3) + def check_truediv(self, a, b, skip_small=True): """Verify that the result of a/b is correctly rounded, by comparing it with a pure Python implementation of correctly diff -r f494052eb476 Objects/longobject.c --- a/Objects/longobject.c Mon Feb 08 20:28:22 2016 +0200 +++ b/Objects/longobject.c Mon Feb 08 16:32:48 2016 -0500 @@ -3572,7 +3572,30 @@ { PyLongObject *div; - CHECK_BINOP(a, b); + if (PyLong_Check(a) && PyLong_Check(b)) { + if (Py_ABS(Py_SIZE(a)) == 1 && Py_ABS(Py_SIZE(b)) == 1) { + sdigit left = ((PyLongObject*)a)->ob_digit[0]; + sdigit right = ((PyLongObject*)b)->ob_digit[0]; + sdigit div; + + if (Py_SIZE(a) != Py_SIZE(b)) { + /* either 'a' or 'b' is negative */ + div = left / right; + if (left != div * right) { + /* we want floor */ + ++div; + } + return PyLong_FromLong(-div); + } + else { + return PyLong_FromLong(left / right); + } + } + } + else { + CHECK_BINOP(a, b); + } + if (l_divmod((PyLongObject*)a, (PyLongObject*)b, &div, NULL) < 0) div = NULL; return (PyObject *)div;