[Python-checkins] r51525 - in python/trunk: Lib/test/test_float.py Objects/floatobject.c

Tim Peters tim.peters at gmail.com
Thu Aug 24 00:00:30 CEST 2006


> Author: alex.martelli
> Date: Wed Aug 23 22:42:02 2006
> New Revision: 51525
>
> Modified:
>    python/trunk/Lib/test/test_float.py
>    python/trunk/Objects/floatobject.c
> Log:
> x**2 should about equal x*x (including for a float x such that the result is
> inf) but didn't; added a test to test_float to verify that, and ignored the
> ERANGE value for errno in the pow operation to make the new test pass (with
> help from Marilyn Davis at the Google Python Sprint -- thanks!).

Huh.  It's been a (mildly controversial, but intentional all the same)
feature that Python tries to raise raise OverflowError on overflowing
libm operations.  Doesn't work all that well, since   there's no
consistency across platforms about when libm sets errno, or to what
(when it does).

> Modified: python/trunk/Lib/test/test_float.py
> ==============================================================================
> --- python/trunk/Lib/test/test_float.py (original)
> +++ python/trunk/Lib/test/test_float.py Wed Aug 23 22:42:02 2006
> @@ -99,12 +99,25 @@
>                                ('<f', LE_FLOAT_NAN)]:
>                  struct.unpack(fmt, data)
>
> +# on an IEEE platform, "overflowing" operations produce infinity
> +
> +class IEEEOperationsTestCase(unittest.TestCase):
> +    if float.__getformat__("double").startswith("IEEE"):
> +        def test_double_infinity(self):
> +            big = 4.8e159
> +            pro = big*big
> +            self.assertEquals(repr(pro), 'inf')

You must have run this on Linux?  Can't pass on Windows (at least).

> +            sqr = big**2
> +            self.assertEquals(repr(sqr), 'inf')

Same as above.  C89 defines nothing about what the platform
double->string routines produce for IEEE inf, NaN, or signed zeroes,
and there's no consistency across platforms for that either.  A better
test is suggested by pyport.h's default implementation if its "is it
an infinity?" macro:

#define Py_IS_INFINITY(X) ((X) && (X)*0.5 == (X))

Since you expect a postive infinity here, specialize to:

    self.assert_(sqr > 0.0 and sqr * 0.5 == sqr)


More information about the Python-checkins mailing list