[Python-Dev] Re: -Dwarn, long->double overflow (was RE: [Python-checkins] CVS: python/dist/src/Misc NEWS,1.219,1.220)
Guido van Rossum
guido@python.org
Fri, 31 Aug 2001 15:39:21 -0400
> [Guido]
> > + + A new command line option, -D<arg>, is added to control run-time
> > + warnings for the use of classic division.
> > ...
> > + Using -Dwarn issues a run-time warning about all uses of classic
> > + division for int, long, float and complex arguments.
>
> I'm unclear on why we warn about classic division when a float or complex is
> involved:
>
> C:\Code\python\PCbuild>python -Dwarn
> Python 2.2a2+ (#22, Aug 31 2001, 14:36:57) [MSC 32 bit (Intel)] on win32
> Type "help", "copyright", "credits" or "license" for more information.
> >>> 2./3.
> __main__:1: DeprecationWarning: classic float division
> 0.66666666666666663
> >>>
>
> Given that this is going to return the same result even in Python 3.0, what
> is it warning me about? That is, as an end user, I'm being warned about
> behavior I can't do anything about, and behavior that Python isn't going to
> change anyway.
Sorry, I should have explained the intention.
This warning is intended for perusal by a tool (yet to create) that
reads the warnings and can automatically fix your code by inserting
the proper future division statements and/or replace / by //. The
tool parses the source looking for / operators. For each / it sees if
it has corresponding warnings, and if so, if the warnings are
consistent (only int/long or only float/complex), it does the right
thing. If all / operators in a module have at least one warning, it
assumes that it has full coverage, and it adds a future division
statement to the module. If there are some / operators for which it
doesn't have any warnings, it asks the user to create a better test
case. For this, it needs to know about float and complex divisions as
well.
> Different issue: I would like to add OverflowError when coercion of
> long to float yields a senseless result. PEP 238 mentions this as a
> possibility, and
>
> >>> from __future__ import division
> >>> x = 1L << 3000
> >>> x/(2*x)
> -1.#IND
> >>>
>
> really sucks. For that matter,
>
> >>> float(1L << 3000)
> 1.#INF
> >>>
>
> has always sucked; future division just makes it suck harder <wink>.
>
> Any objections to raising OverflowError here?
Sounds OK to me.
> Note this is a bit painful for a bogus reason: PyFloat_AsDouble returns a
> double, and nothing in the codebase now checks it for a -1.0 error return
> (despite that it can already produce one). So half the effort would be
> repairing code currently ignoring the possibility of error.
>
>
> Third issue: I don't see a *good* reason for the future-division
>
> x/(2*x)
>
> above not to return 0.5. long_true_divide could be made smart enough to do
> that (more generally, to return a good float approximation whenever the true
> result is representable as a float).
Sure, but I also don't see a good reason to make this a priority.
It's a "don't care" corner of the language to me.
--Guido van Rossum (home page: http://www.python.org/~guido/)