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)