You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
3.0/3.1: Bad bug in range() computation (or possible Integer problem) #50583
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
assignee='https://github.com/mdickinson'closed_at=<Date2009-06-24.19:24:52.866>created_at=<Date2009-06-24.10:51:41.833>labels= ['interpreter-core', 'type-bug', 'release-blocker']
title='3.0/3.1: Bad bug in range() computation (or possible Integer problem)'updated_at=<Date2009-06-25.11:31:15.735>user='https://bugs.python.org/mfxmfx'
Please note that the correct answer is 25, and the last element is missing !
This bug does not show on 64-bit versions (but 46337**2 is near 2**31).
~Markus
C:\Python31>python
Python 3.1rc2 (r31rc2:73414, Jun 13 2009, 16:43:15) [MSC v.1500 32 bit
(Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> len(list(range(46337**2, 46349**2, 46337)))
24
C:\Python30>python.exe
Python 3.0.1 (r301:69561, Feb 13 2009, 20:04:18) [MSC v.1500 32 bit
(Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> len(list(range(46337**2, 46349**2, 46337)))
24
Simpler test case:
Py2.6:
>>> n =46349**2
>>> n
2148229801L
>>> range(n-10, n, 3)
[2148229791L, 2148229794L, 2148229797L, 2148229800L]
Py3.0:
>>> n =46349**2
>>> n
2148229801
>>> list(range(n-10, n, 3))
[2148229791, 2148229794, 2148229797]
The length calculation in range_iter in Objects/rangeobject.c is
incorrect, when using a longrangeiterobject. The length is computed
as: (stop - start)//step. It should be ceiling((stop-start)/step), or
1 + (stop - start - 1)//step, provided that start <= stop and step > 0.
It's not clear to me right now whether there may also be problems with
negative steps, and with cases where start < stop, etc.
I think this is serious enough to be considered a release blocker for 3.1;
I'm working on a patch, and will post it later today.
There are also a whole bunch of tests that are commented
out in BuiltinTest.test_range in Lib/test/test_builtin.py.
Some of those tests fail with the current py3k; with this
patch applied, they all pass except the one involving 'badzero'.
Activity
mfxmfx commentedon Jun 24, 2009
Please note that the correct answer is 25, and the last element is missing !
This bug does not show on 64-bit versions (but 46337**2 is near 2**31).
~Markus
ezio-melotti commentedon Jun 24, 2009
mdickinson commentedon Jun 24, 2009
The length calculation in range_iter in Objects/rangeobject.c is
incorrect, when using a longrangeiterobject. The length is computed
as: (stop - start)//step. It should be ceiling((stop-start)/step), or
1 + (stop - start - 1)//step, provided that start <= stop and step > 0.
It's not clear to me right now whether there may also be problems with
negative steps, and with cases where start < stop, etc.
I think this is serious enough to be considered a release blocker for 3.1;
I'm working on a patch, and will post it later today.
mdickinson commentedon Jun 24, 2009
Here's a patch for py3k.
There are also a whole bunch of tests that are commented
out in BuiltinTest.test_range in Lib/test/test_builtin.py.
Some of those tests fail with the current py3k; with this
patch applied, they all pass except the one involving 'badzero'.
benjaminp commentedon Jun 24, 2009
The patch looks good. Please apply.
mdickinson commentedon Jun 24, 2009
Applied to py3k in r73547. Will backport to 3.0.
mdickinson commentedon Jun 24, 2009
Backported to release30-maint branch in r73549.
Thanks for catching this, Markus!
mfxmfx commentedon Jun 25, 2009
Many thanks for your quick fix! ~Markus