[Python-Dev] Patches: 1 for the price of 10.

Josiah Carlson jcarlson at uci.edu
Thu Dec 23 17:43:53 CET 2004


Titus Brown <titus at caltech.edu> wrote:
> 
> -> > 1067760 -- float-->long conversion on fileobj.seek calls, rather than
> -> >        float-->int.  Permits larger floats (2.0**62) to match large
> -> >        int (2**62) arguments.  rhettinger marked as "won't fix" in
> -> >        the original bug report; this seems like a clean solution,
> -> >        tho.  Recommend apply.
> -> 
> -> Wouldn't this cause subtle errors when the float -> long conversion is
> -> no longer precise? Or is this a non issue because it could only happen
> -> when seeking on impossibly large files?
> 
> When would the float --> long conversion not be precise?  The docs
> say PyLong_FromDouble takes the integer part, so it's like doing
> a floor(), yes?

Precision.
>>> 2.0**52
4503599627370496.0
>>> 2.0**52+1
4503599627370497.0
>>> 2.0**53
9007199254740992.0
>>> 2.0**53+1
9007199254740992.0

Anything above float(2**53-1) (one must be careful about the order of
float conversions) are basically useless for offsets into files.


> The current behavior is to convert directly from float to int, even
> though seek() can take longs as an argument.  Thus 2.0**31 works,
> 2**31 works, 2**62 works, but 2.0**62 doesn't.  This seems mildly
> inconsistent and prompted the guy to submit a bug report, and then
> a patch.

"works" and "doesn't work" aren't precise.  "doesn't raise an exception"
and "does raise an exception" are precise.  Note the above float
precision precision example about why even non-exceptions may not "work".


 - Josiah



More information about the Python-Dev mailing list