Ignore:
Timestamp:
Mar 19, 2014, 11:31:01 PM (11 years ago)
Author:
dmik
Message:

python: Merge vendor 2.7.6 to trunk.

Location:
python/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • python/trunk

  • python/trunk/Lib/test/test_float.py

    r2 r391  
    66from math import isinf, isnan, copysign, ldexp
    77import operator
    8 import random, fractions
     8import random
     9import fractions
     10import sys
    911
    1012INF = float("inf")
    1113NAN = float("nan")
     14
     15have_getformat = hasattr(float, "__getformat__")
     16requires_getformat = unittest.skipUnless(have_getformat,
     17                                         "requires __getformat__")
     18requires_setformat = unittest.skipUnless(hasattr(float, "__setformat__"),
     19                                         "requires __setformat__")
     20# decorator for skipping tests on non-IEEE 754 platforms
     21requires_IEEE_754 = unittest.skipUnless(have_getformat and
     22    float.__getformat__("double").startswith("IEEE"),
     23    "test requires IEEE 754 doubles")
     24
     25#locate file with float format test values
     26test_dir = os.path.dirname(__file__) or os.curdir
     27format_testfile = os.path.join(test_dir, 'formatfloat_testcases.txt')
    1228
    1329class GeneralFloatCases(unittest.TestCase):
     
    2541        self.assertRaises(ValueError, float, "-+3.14")
    2642        self.assertRaises(ValueError, float, "--3.14")
     43        # check that we don't accept alternate exponent markers
     44        self.assertRaises(ValueError, float, "-1.7d29")
     45        self.assertRaises(ValueError, float, "3D-14")
    2746        if test_support.have_unicode:
    2847            self.assertEqual(float(unicode("  3.14  ")), 3.14)
    2948            self.assertEqual(float(unicode("  \u0663.\u0661\u0664  ",'raw-unicode-escape')), 3.14)
    30             # Implementation limitation in PyFloat_FromString()
    31             self.assertRaises(ValueError, float, unicode("1"*10000))
     49
     50        # extra long strings should no longer be a problem
     51        # (in 2.6, long unicode inputs to float raised ValueError)
     52        float('.' + '1'*1000)
     53        float(unicode('.' + '1'*1000))
     54
     55    def check_conversion_to_int(self, x):
     56        """Check that int(x) has the correct value and type, for a float x."""
     57        n = int(x)
     58        if x >= 0.0:
     59            # x >= 0 and n = int(x)  ==>  n <= x < n + 1
     60            self.assertLessEqual(n, x)
     61            self.assertLess(x, n + 1)
     62        else:
     63            # x < 0 and n = int(x)  ==>  n >= x > n - 1
     64            self.assertGreaterEqual(n, x)
     65            self.assertGreater(x, n - 1)
     66
     67        # Result should be an int if within range, else a long.
     68        if -sys.maxint-1 <= n <= sys.maxint:
     69            self.assertEqual(type(n), int)
     70        else:
     71            self.assertEqual(type(n), long)
     72
     73        # Double check.
     74        self.assertEqual(type(int(n)), type(n))
     75
     76    def test_conversion_to_int(self):
     77        # Check that floats within the range of an int convert to type
     78        # int, not long.  (issue #11144.)
     79        boundary = float(sys.maxint + 1)
     80        epsilon = 2**-sys.float_info.mant_dig * boundary
     81
     82        # These 2 floats are either side of the positive int/long boundary on
     83        # both 32-bit and 64-bit systems.
     84        self.check_conversion_to_int(boundary - epsilon)
     85        self.check_conversion_to_int(boundary)
     86
     87        # These floats are either side of the negative long/int boundary on
     88        # 64-bit systems...
     89        self.check_conversion_to_int(-boundary - 2*epsilon)
     90        self.check_conversion_to_int(-boundary)
     91
     92        # ... and these ones are either side of the negative long/int
     93        # boundary on 32-bit systems.
     94        self.check_conversion_to_int(-boundary - 1.0)
     95        self.check_conversion_to_int(-boundary - 1.0 + 2*epsilon)
    3296
    3397    @test_support.run_with_locale('LC_NUMERIC', 'fr_FR', 'de_DE')
     
    3599        # set locale to something that doesn't use '.' for the decimal point
    36100        # float must not accept the locale specific decimal point but
    37         # it still has to accept the normal python syntac
     101        # it still has to accept the normal python syntax
    38102        import locale
    39103        if not locale.localeconv()['decimal_point'] == ',':
     
    101165        self.assertAlmostEqual(float(FooStr('8')), 9.)
    102166
     167    def test_is_integer(self):
     168        self.assertFalse((1.1).is_integer())
     169        self.assertTrue((1.).is_integer())
     170        self.assertFalse(float("nan").is_integer())
     171        self.assertFalse(float("inf").is_integer())
     172
    103173    def test_floatasratio(self):
    104174        for f, ratio in [
     
    134204        self.assertRaises(ValueError, float('nan').as_integer_ratio)
    135205
     206    def assertEqualAndEqualSign(self, a, b):
     207        # fail unless a == b and a and b have the same sign bit;
     208        # the only difference from assertEqual is that this test
     209        # distinguishes -0.0 and 0.0.
     210        self.assertEqual((a, copysign(1.0, a)), (b, copysign(1.0, b)))
     211
     212    @requires_IEEE_754
     213    def test_float_mod(self):
     214        # Check behaviour of % operator for IEEE 754 special cases.
     215        # In particular, check signs of zeros.
     216        mod = operator.mod
     217
     218        self.assertEqualAndEqualSign(mod(-1.0, 1.0), 0.0)
     219        self.assertEqualAndEqualSign(mod(-1e-100, 1.0), 1.0)
     220        self.assertEqualAndEqualSign(mod(-0.0, 1.0), 0.0)
     221        self.assertEqualAndEqualSign(mod(0.0, 1.0), 0.0)
     222        self.assertEqualAndEqualSign(mod(1e-100, 1.0), 1e-100)
     223        self.assertEqualAndEqualSign(mod(1.0, 1.0), 0.0)
     224
     225        self.assertEqualAndEqualSign(mod(-1.0, -1.0), -0.0)
     226        self.assertEqualAndEqualSign(mod(-1e-100, -1.0), -1e-100)
     227        self.assertEqualAndEqualSign(mod(-0.0, -1.0), -0.0)
     228        self.assertEqualAndEqualSign(mod(0.0, -1.0), -0.0)
     229        self.assertEqualAndEqualSign(mod(1e-100, -1.0), -1.0)
     230        self.assertEqualAndEqualSign(mod(1.0, -1.0), -0.0)
     231
     232    @requires_IEEE_754
     233    def test_float_pow(self):
     234        # test builtin pow and ** operator for IEEE 754 special cases.
     235        # Special cases taken from section F.9.4.4 of the C99 specification
     236
     237        for pow_op in pow, operator.pow:
     238            # x**NAN is NAN for any x except 1
     239            self.assertTrue(isnan(pow_op(-INF, NAN)))
     240            self.assertTrue(isnan(pow_op(-2.0, NAN)))
     241            self.assertTrue(isnan(pow_op(-1.0, NAN)))
     242            self.assertTrue(isnan(pow_op(-0.5, NAN)))
     243            self.assertTrue(isnan(pow_op(-0.0, NAN)))
     244            self.assertTrue(isnan(pow_op(0.0, NAN)))
     245            self.assertTrue(isnan(pow_op(0.5, NAN)))
     246            self.assertTrue(isnan(pow_op(2.0, NAN)))
     247            self.assertTrue(isnan(pow_op(INF, NAN)))
     248            self.assertTrue(isnan(pow_op(NAN, NAN)))
     249
     250            # NAN**y is NAN for any y except +-0
     251            self.assertTrue(isnan(pow_op(NAN, -INF)))
     252            self.assertTrue(isnan(pow_op(NAN, -2.0)))
     253            self.assertTrue(isnan(pow_op(NAN, -1.0)))
     254            self.assertTrue(isnan(pow_op(NAN, -0.5)))
     255            self.assertTrue(isnan(pow_op(NAN, 0.5)))
     256            self.assertTrue(isnan(pow_op(NAN, 1.0)))
     257            self.assertTrue(isnan(pow_op(NAN, 2.0)))
     258            self.assertTrue(isnan(pow_op(NAN, INF)))
     259
     260            # (+-0)**y raises ZeroDivisionError for y a negative odd integer
     261            self.assertRaises(ZeroDivisionError, pow_op, -0.0, -1.0)
     262            self.assertRaises(ZeroDivisionError, pow_op, 0.0, -1.0)
     263
     264            # (+-0)**y raises ZeroDivisionError for y finite and negative
     265            # but not an odd integer
     266            self.assertRaises(ZeroDivisionError, pow_op, -0.0, -2.0)
     267            self.assertRaises(ZeroDivisionError, pow_op, -0.0, -0.5)
     268            self.assertRaises(ZeroDivisionError, pow_op, 0.0, -2.0)
     269            self.assertRaises(ZeroDivisionError, pow_op, 0.0, -0.5)
     270
     271            # (+-0)**y is +-0 for y a positive odd integer
     272            self.assertEqualAndEqualSign(pow_op(-0.0, 1.0), -0.0)
     273            self.assertEqualAndEqualSign(pow_op(0.0, 1.0), 0.0)
     274
     275            # (+-0)**y is 0 for y finite and positive but not an odd integer
     276            self.assertEqualAndEqualSign(pow_op(-0.0, 0.5), 0.0)
     277            self.assertEqualAndEqualSign(pow_op(-0.0, 2.0), 0.0)
     278            self.assertEqualAndEqualSign(pow_op(0.0, 0.5), 0.0)
     279            self.assertEqualAndEqualSign(pow_op(0.0, 2.0), 0.0)
     280
     281            # (-1)**+-inf is 1
     282            self.assertEqualAndEqualSign(pow_op(-1.0, -INF), 1.0)
     283            self.assertEqualAndEqualSign(pow_op(-1.0, INF), 1.0)
     284
     285            # 1**y is 1 for any y, even if y is an infinity or nan
     286            self.assertEqualAndEqualSign(pow_op(1.0, -INF), 1.0)
     287            self.assertEqualAndEqualSign(pow_op(1.0, -2.0), 1.0)
     288            self.assertEqualAndEqualSign(pow_op(1.0, -1.0), 1.0)
     289            self.assertEqualAndEqualSign(pow_op(1.0, -0.5), 1.0)
     290            self.assertEqualAndEqualSign(pow_op(1.0, -0.0), 1.0)
     291            self.assertEqualAndEqualSign(pow_op(1.0, 0.0), 1.0)
     292            self.assertEqualAndEqualSign(pow_op(1.0, 0.5), 1.0)
     293            self.assertEqualAndEqualSign(pow_op(1.0, 1.0), 1.0)
     294            self.assertEqualAndEqualSign(pow_op(1.0, 2.0), 1.0)
     295            self.assertEqualAndEqualSign(pow_op(1.0, INF), 1.0)
     296            self.assertEqualAndEqualSign(pow_op(1.0, NAN), 1.0)
     297
     298            # x**+-0 is 1 for any x, even if x is a zero, infinity, or nan
     299            self.assertEqualAndEqualSign(pow_op(-INF, 0.0), 1.0)
     300            self.assertEqualAndEqualSign(pow_op(-2.0, 0.0), 1.0)
     301            self.assertEqualAndEqualSign(pow_op(-1.0, 0.0), 1.0)
     302            self.assertEqualAndEqualSign(pow_op(-0.5, 0.0), 1.0)
     303            self.assertEqualAndEqualSign(pow_op(-0.0, 0.0), 1.0)
     304            self.assertEqualAndEqualSign(pow_op(0.0, 0.0), 1.0)
     305            self.assertEqualAndEqualSign(pow_op(0.5, 0.0), 1.0)
     306            self.assertEqualAndEqualSign(pow_op(1.0, 0.0), 1.0)
     307            self.assertEqualAndEqualSign(pow_op(2.0, 0.0), 1.0)
     308            self.assertEqualAndEqualSign(pow_op(INF, 0.0), 1.0)
     309            self.assertEqualAndEqualSign(pow_op(NAN, 0.0), 1.0)
     310            self.assertEqualAndEqualSign(pow_op(-INF, -0.0), 1.0)
     311            self.assertEqualAndEqualSign(pow_op(-2.0, -0.0), 1.0)
     312            self.assertEqualAndEqualSign(pow_op(-1.0, -0.0), 1.0)
     313            self.assertEqualAndEqualSign(pow_op(-0.5, -0.0), 1.0)
     314            self.assertEqualAndEqualSign(pow_op(-0.0, -0.0), 1.0)
     315            self.assertEqualAndEqualSign(pow_op(0.0, -0.0), 1.0)
     316            self.assertEqualAndEqualSign(pow_op(0.5, -0.0), 1.0)
     317            self.assertEqualAndEqualSign(pow_op(1.0, -0.0), 1.0)
     318            self.assertEqualAndEqualSign(pow_op(2.0, -0.0), 1.0)
     319            self.assertEqualAndEqualSign(pow_op(INF, -0.0), 1.0)
     320            self.assertEqualAndEqualSign(pow_op(NAN, -0.0), 1.0)
     321
     322            # x**y raises ValueError for finite negative x and non-integral y
     323            self.assertRaises(ValueError, pow_op, -2.0, -0.5)
     324            self.assertRaises(ValueError, pow_op, -2.0, 0.5)
     325            self.assertRaises(ValueError, pow_op, -1.0, -0.5)
     326            self.assertRaises(ValueError, pow_op, -1.0, 0.5)
     327            self.assertRaises(ValueError, pow_op, -0.5, -0.5)
     328            self.assertRaises(ValueError, pow_op, -0.5, 0.5)
     329
     330            # x**-INF is INF for abs(x) < 1
     331            self.assertEqualAndEqualSign(pow_op(-0.5, -INF), INF)
     332            self.assertEqualAndEqualSign(pow_op(-0.0, -INF), INF)
     333            self.assertEqualAndEqualSign(pow_op(0.0, -INF), INF)
     334            self.assertEqualAndEqualSign(pow_op(0.5, -INF), INF)
     335
     336            # x**-INF is 0 for abs(x) > 1
     337            self.assertEqualAndEqualSign(pow_op(-INF, -INF), 0.0)
     338            self.assertEqualAndEqualSign(pow_op(-2.0, -INF), 0.0)
     339            self.assertEqualAndEqualSign(pow_op(2.0, -INF), 0.0)
     340            self.assertEqualAndEqualSign(pow_op(INF, -INF), 0.0)
     341
     342            # x**INF is 0 for abs(x) < 1
     343            self.assertEqualAndEqualSign(pow_op(-0.5, INF), 0.0)
     344            self.assertEqualAndEqualSign(pow_op(-0.0, INF), 0.0)
     345            self.assertEqualAndEqualSign(pow_op(0.0, INF), 0.0)
     346            self.assertEqualAndEqualSign(pow_op(0.5, INF), 0.0)
     347
     348            # x**INF is INF for abs(x) > 1
     349            self.assertEqualAndEqualSign(pow_op(-INF, INF), INF)
     350            self.assertEqualAndEqualSign(pow_op(-2.0, INF), INF)
     351            self.assertEqualAndEqualSign(pow_op(2.0, INF), INF)
     352            self.assertEqualAndEqualSign(pow_op(INF, INF), INF)
     353
     354            # (-INF)**y is -0.0 for y a negative odd integer
     355            self.assertEqualAndEqualSign(pow_op(-INF, -1.0), -0.0)
     356
     357            # (-INF)**y is 0.0 for y negative but not an odd integer
     358            self.assertEqualAndEqualSign(pow_op(-INF, -0.5), 0.0)
     359            self.assertEqualAndEqualSign(pow_op(-INF, -2.0), 0.0)
     360
     361            # (-INF)**y is -INF for y a positive odd integer
     362            self.assertEqualAndEqualSign(pow_op(-INF, 1.0), -INF)
     363
     364            # (-INF)**y is INF for y positive but not an odd integer
     365            self.assertEqualAndEqualSign(pow_op(-INF, 0.5), INF)
     366            self.assertEqualAndEqualSign(pow_op(-INF, 2.0), INF)
     367
     368            # INF**y is INF for y positive
     369            self.assertEqualAndEqualSign(pow_op(INF, 0.5), INF)
     370            self.assertEqualAndEqualSign(pow_op(INF, 1.0), INF)
     371            self.assertEqualAndEqualSign(pow_op(INF, 2.0), INF)
     372
     373            # INF**y is 0.0 for y negative
     374            self.assertEqualAndEqualSign(pow_op(INF, -2.0), 0.0)
     375            self.assertEqualAndEqualSign(pow_op(INF, -1.0), 0.0)
     376            self.assertEqualAndEqualSign(pow_op(INF, -0.5), 0.0)
     377
     378            # basic checks not covered by the special cases above
     379            self.assertEqualAndEqualSign(pow_op(-2.0, -2.0), 0.25)
     380            self.assertEqualAndEqualSign(pow_op(-2.0, -1.0), -0.5)
     381            self.assertEqualAndEqualSign(pow_op(-2.0, -0.0), 1.0)
     382            self.assertEqualAndEqualSign(pow_op(-2.0, 0.0), 1.0)
     383            self.assertEqualAndEqualSign(pow_op(-2.0, 1.0), -2.0)
     384            self.assertEqualAndEqualSign(pow_op(-2.0, 2.0), 4.0)
     385            self.assertEqualAndEqualSign(pow_op(-1.0, -2.0), 1.0)
     386            self.assertEqualAndEqualSign(pow_op(-1.0, -1.0), -1.0)
     387            self.assertEqualAndEqualSign(pow_op(-1.0, -0.0), 1.0)
     388            self.assertEqualAndEqualSign(pow_op(-1.0, 0.0), 1.0)
     389            self.assertEqualAndEqualSign(pow_op(-1.0, 1.0), -1.0)
     390            self.assertEqualAndEqualSign(pow_op(-1.0, 2.0), 1.0)
     391            self.assertEqualAndEqualSign(pow_op(2.0, -2.0), 0.25)
     392            self.assertEqualAndEqualSign(pow_op(2.0, -1.0), 0.5)
     393            self.assertEqualAndEqualSign(pow_op(2.0, -0.0), 1.0)
     394            self.assertEqualAndEqualSign(pow_op(2.0, 0.0), 1.0)
     395            self.assertEqualAndEqualSign(pow_op(2.0, 1.0), 2.0)
     396            self.assertEqualAndEqualSign(pow_op(2.0, 2.0), 4.0)
     397
     398            # 1 ** large and -1 ** large; some libms apparently
     399            # have problems with these
     400            self.assertEqualAndEqualSign(pow_op(1.0, -1e100), 1.0)
     401            self.assertEqualAndEqualSign(pow_op(1.0, 1e100), 1.0)
     402            self.assertEqualAndEqualSign(pow_op(-1.0, -1e100), 1.0)
     403            self.assertEqualAndEqualSign(pow_op(-1.0, 1e100), 1.0)
     404
     405            # check sign for results that underflow to 0
     406            self.assertEqualAndEqualSign(pow_op(-2.0, -2000.0), 0.0)
     407            self.assertRaises(ValueError, pow_op, -2.0, -2000.5)
     408            self.assertEqualAndEqualSign(pow_op(-2.0, -2001.0), -0.0)
     409            self.assertEqualAndEqualSign(pow_op(2.0, -2000.0), 0.0)
     410            self.assertEqualAndEqualSign(pow_op(2.0, -2000.5), 0.0)
     411            self.assertEqualAndEqualSign(pow_op(2.0, -2001.0), 0.0)
     412            self.assertEqualAndEqualSign(pow_op(-0.5, 2000.0), 0.0)
     413            self.assertRaises(ValueError, pow_op, -0.5, 2000.5)
     414            self.assertEqualAndEqualSign(pow_op(-0.5, 2001.0), -0.0)
     415            self.assertEqualAndEqualSign(pow_op(0.5, 2000.0), 0.0)
     416            self.assertEqualAndEqualSign(pow_op(0.5, 2000.5), 0.0)
     417            self.assertEqualAndEqualSign(pow_op(0.5, 2001.0), 0.0)
     418
     419            # check we don't raise an exception for subnormal results,
     420            # and validate signs.  Tests currently disabled, since
     421            # they fail on systems where a subnormal result from pow
     422            # is flushed to zero (e.g. Debian/ia64.)
     423            #self.assertTrue(0.0 < pow_op(0.5, 1048) < 1e-315)
     424            #self.assertTrue(0.0 < pow_op(-0.5, 1048) < 1e-315)
     425            #self.assertTrue(0.0 < pow_op(0.5, 1047) < 1e-315)
     426            #self.assertTrue(0.0 > pow_op(-0.5, 1047) > -1e-315)
     427            #self.assertTrue(0.0 < pow_op(2.0, -1048) < 1e-315)
     428            #self.assertTrue(0.0 < pow_op(-2.0, -1048) < 1e-315)
     429            #self.assertTrue(0.0 < pow_op(2.0, -1047) < 1e-315)
     430            #self.assertTrue(0.0 > pow_op(-2.0, -1047) > -1e-315)
     431
     432
     433@requires_setformat
    136434class FormatFunctionsTestCase(unittest.TestCase):
    137435
     
    145443
    146444    def test_getformat(self):
    147         self.assert_(float.__getformat__('double') in
    148                      ['unknown', 'IEEE, big-endian', 'IEEE, little-endian'])
    149         self.assert_(float.__getformat__('float') in
    150                      ['unknown', 'IEEE, big-endian', 'IEEE, little-endian'])
     445        self.assertIn(float.__getformat__('double'),
     446                      ['unknown', 'IEEE, big-endian', 'IEEE, little-endian'])
     447        self.assertIn(float.__getformat__('float'),
     448                      ['unknown', 'IEEE, big-endian', 'IEEE, little-endian'])
    151449        self.assertRaises(ValueError, float.__getformat__, 'chicken')
    152450        self.assertRaises(TypeError, float.__getformat__, 1)
     
    184482# representing an infinity or a NaN should raise an exception.
    185483
     484@requires_setformat
    186485class UnknownFormatTestCase(unittest.TestCase):
    187486    def setUp(self):
     
    216515
    217516class IEEEFormatTestCase(unittest.TestCase):
    218     if float.__getformat__("double").startswith("IEEE"):
    219         def test_double_specials_do_unpack(self):
    220             for fmt, data in [('>d', BE_DOUBLE_INF),
    221                               ('>d', BE_DOUBLE_NAN),
    222                               ('<d', LE_DOUBLE_INF),
    223                               ('<d', LE_DOUBLE_NAN)]:
    224                 struct.unpack(fmt, data)
    225 
    226     if float.__getformat__("float").startswith("IEEE"):
    227         def test_float_specials_do_unpack(self):
    228             for fmt, data in [('>f', BE_FLOAT_INF),
    229                               ('>f', BE_FLOAT_NAN),
    230                               ('<f', LE_FLOAT_INF),
    231                               ('<f', LE_FLOAT_NAN)]:
    232                 struct.unpack(fmt, data)
    233 
    234     if float.__getformat__("double").startswith("IEEE"):
    235         def test_negative_zero(self):
    236             import math
    237             def pos_pos():
    238                 return 0.0, math.atan2(0.0, -1)
    239             def pos_neg():
    240                 return 0.0, math.atan2(-0.0, -1)
    241             def neg_pos():
    242                 return -0.0, math.atan2(0.0, -1)
    243             def neg_neg():
    244                 return -0.0, math.atan2(-0.0, -1)
    245             self.assertEquals(pos_pos(), neg_pos())
    246             self.assertEquals(pos_neg(), neg_neg())
    247 
    248     if float.__getformat__("double").startswith("IEEE"):
    249         def test_underflow_sign(self):
    250             import math
    251             # check that -1e-1000 gives -0.0, not 0.0
    252             self.assertEquals(math.atan2(-1e-1000, -1), math.atan2(-0.0, -1))
    253             self.assertEquals(math.atan2(float('-1e-1000'), -1),
    254                               math.atan2(-0.0, -1))
     517
     518    @requires_IEEE_754
     519    def test_double_specials_do_unpack(self):
     520        for fmt, data in [('>d', BE_DOUBLE_INF),
     521                          ('>d', BE_DOUBLE_NAN),
     522                          ('<d', LE_DOUBLE_INF),
     523                          ('<d', LE_DOUBLE_NAN)]:
     524            struct.unpack(fmt, data)
     525
     526    @requires_IEEE_754
     527    def test_float_specials_do_unpack(self):
     528        for fmt, data in [('>f', BE_FLOAT_INF),
     529                          ('>f', BE_FLOAT_NAN),
     530                          ('<f', LE_FLOAT_INF),
     531                          ('<f', LE_FLOAT_NAN)]:
     532            struct.unpack(fmt, data)
     533
     534    @requires_IEEE_754
     535    def test_negative_zero(self):
     536        def pos_pos():
     537            return 0.0, math.atan2(0.0, -1)
     538        def pos_neg():
     539            return 0.0, math.atan2(-0.0, -1)
     540        def neg_pos():
     541            return -0.0, math.atan2(0.0, -1)
     542        def neg_neg():
     543            return -0.0, math.atan2(-0.0, -1)
     544        self.assertEqual(pos_pos(), neg_pos())
     545        self.assertEqual(pos_neg(), neg_neg())
     546
     547    @requires_IEEE_754
     548    def test_underflow_sign(self):
     549        # check that -1e-1000 gives -0.0, not 0.0
     550        self.assertEqual(math.atan2(-1e-1000, -1), math.atan2(-0.0, -1))
     551        self.assertEqual(math.atan2(float('-1e-1000'), -1),
     552                         math.atan2(-0.0, -1))
     553
     554    def test_format(self):
     555        # these should be rewritten to use both format(x, spec) and
     556        # x.__format__(spec)
     557
     558        self.assertEqual(format(0.0, 'f'), '0.000000')
     559
     560        # the default is 'g', except for empty format spec
     561        self.assertEqual(format(0.0, ''), '0.0')
     562        self.assertEqual(format(0.01, ''), '0.01')
     563        self.assertEqual(format(0.01, 'g'), '0.01')
     564
     565        # empty presentation type should format in the same way as str
     566        # (issue 5920)
     567        x = 100/7.
     568        self.assertEqual(format(x, ''), str(x))
     569        self.assertEqual(format(x, '-'), str(x))
     570        self.assertEqual(format(x, '>'), str(x))
     571        self.assertEqual(format(x, '2'), str(x))
     572
     573        self.assertEqual(format(1.0, 'f'), '1.000000')
     574
     575        self.assertEqual(format(-1.0, 'f'), '-1.000000')
     576
     577        self.assertEqual(format( 1.0, ' f'), ' 1.000000')
     578        self.assertEqual(format(-1.0, ' f'), '-1.000000')
     579        self.assertEqual(format( 1.0, '+f'), '+1.000000')
     580        self.assertEqual(format(-1.0, '+f'), '-1.000000')
     581
     582        # % formatting
     583        self.assertEqual(format(-1.0, '%'), '-100.000000%')
     584
     585        # conversion to string should fail
     586        self.assertRaises(ValueError, format, 3.0, "s")
     587
     588        # other format specifiers shouldn't work on floats,
     589        #  in particular int specifiers
     590        for format_spec in ([chr(x) for x in range(ord('a'), ord('z')+1)] +
     591                            [chr(x) for x in range(ord('A'), ord('Z')+1)]):
     592            if not format_spec in 'eEfFgGn%':
     593                self.assertRaises(ValueError, format, 0.0, format_spec)
     594                self.assertRaises(ValueError, format, 1.0, format_spec)
     595                self.assertRaises(ValueError, format, -1.0, format_spec)
     596                self.assertRaises(ValueError, format, 1e100, format_spec)
     597                self.assertRaises(ValueError, format, -1e100, format_spec)
     598                self.assertRaises(ValueError, format, 1e-100, format_spec)
     599                self.assertRaises(ValueError, format, -1e-100, format_spec)
     600
     601        # issue 3382: 'f' and 'F' with inf's and nan's
     602        self.assertEqual('{0:f}'.format(INF), 'inf')
     603        self.assertEqual('{0:F}'.format(INF), 'INF')
     604        self.assertEqual('{0:f}'.format(-INF), '-inf')
     605        self.assertEqual('{0:F}'.format(-INF), '-INF')
     606        self.assertEqual('{0:f}'.format(NAN), 'nan')
     607        self.assertEqual('{0:F}'.format(NAN), 'NAN')
     608
     609    @requires_IEEE_754
     610    def test_format_testfile(self):
     611        with open(format_testfile) as testfile:
     612            for line in open(format_testfile):
     613                if line.startswith('--'):
     614                    continue
     615                line = line.strip()
     616                if not line:
     617                    continue
     618
     619                lhs, rhs = map(str.strip, line.split('->'))
     620                fmt, arg = lhs.split()
     621                arg = float(arg)
     622                self.assertEqual(fmt % arg, rhs)
     623                if not math.isnan(arg) and copysign(1.0, arg) > 0.0:
     624                    self.assertEqual(fmt % -arg, '-' + rhs)
     625
     626    def test_issue5864(self):
     627        self.assertEqual(format(123.456, '.4'), '123.5')
     628        self.assertEqual(format(1234.56, '.4'), '1.235e+03')
     629        self.assertEqual(format(12345.6, '.4'), '1.235e+04')
    255630
    256631class ReprTestCase(unittest.TestCase):
     
    266641        floats_file.close()
    267642
     643    @unittest.skipUnless(getattr(sys, 'float_repr_style', '') == 'short',
     644                         "applies only when using short float repr style")
     645    def test_short_repr(self):
     646        # test short float repr introduced in Python 3.1.  One aspect
     647        # of this repr is that we get some degree of str -> float ->
     648        # str roundtripping.  In particular, for any numeric string
     649        # containing 15 or fewer significant digits, those exact same
     650        # digits (modulo trailing zeros) should appear in the output.
     651        # No more repr(0.03) -> "0.029999999999999999"!
     652
     653        test_strings = [
     654            # output always includes *either* a decimal point and at
     655            # least one digit after that point, or an exponent.
     656            '0.0',
     657            '1.0',
     658            '0.01',
     659            '0.02',
     660            '0.03',
     661            '0.04',
     662            '0.05',
     663            '1.23456789',
     664            '10.0',
     665            '100.0',
     666            # values >= 1e16 get an exponent...
     667            '1000000000000000.0',
     668            '9999999999999990.0',
     669            '1e+16',
     670            '1e+17',
     671            # ... and so do values < 1e-4
     672            '0.001',
     673            '0.001001',
     674            '0.00010000000000001',
     675            '0.0001',
     676            '9.999999999999e-05',
     677            '1e-05',
     678            # values designed to provoke failure if the FPU rounding
     679            # precision isn't set correctly
     680            '8.72293771110361e+25',
     681            '7.47005307342313e+26',
     682            '2.86438000439698e+28',
     683            '8.89142905246179e+28',
     684            '3.08578087079232e+35',
     685            ]
     686
     687        for s in test_strings:
     688            negs = '-'+s
     689            self.assertEqual(s, repr(float(s)))
     690            self.assertEqual(negs, repr(float(negs)))
     691
     692
     693@requires_IEEE_754
     694class RoundTestCase(unittest.TestCase):
     695    def test_second_argument_type(self):
     696        # any type with an __index__ method should be permitted as
     697        # a second argument
     698        self.assertAlmostEqual(round(12.34, True), 12.3)
     699
     700        class MyIndex(object):
     701            def __index__(self): return 4
     702        self.assertAlmostEqual(round(-0.123456, MyIndex()), -0.1235)
     703        # but floats should be illegal
     704        self.assertRaises(TypeError, round, 3.14159, 2.0)
     705
     706    def test_inf_nan(self):
     707        # rounding an infinity or nan returns the same number;
     708        # (in py3k, rounding an infinity or nan raises an error,
     709        #  since the result can't be represented as a long).
     710        self.assertEqual(round(INF), INF)
     711        self.assertEqual(round(-INF), -INF)
     712        self.assertTrue(math.isnan(round(NAN)))
     713        for n in range(-5, 5):
     714            self.assertEqual(round(INF, n), INF)
     715            self.assertEqual(round(-INF, n), -INF)
     716            self.assertTrue(math.isnan(round(NAN, n)))
     717
     718        self.assertRaises(TypeError, round, INF, 0.0)
     719        self.assertRaises(TypeError, round, -INF, 1.0)
     720        self.assertRaises(TypeError, round, NAN, "ceci n'est pas un integer")
     721        self.assertRaises(TypeError, round, -0.0, 1j)
     722
     723    def test_large_n(self):
     724        for n in [324, 325, 400, 2**31-1, 2**31, 2**32, 2**100]:
     725            self.assertEqual(round(123.456, n), 123.456)
     726            self.assertEqual(round(-123.456, n), -123.456)
     727            self.assertEqual(round(1e300, n), 1e300)
     728            self.assertEqual(round(1e-320, n), 1e-320)
     729        self.assertEqual(round(1e150, 300), 1e150)
     730        self.assertEqual(round(1e300, 307), 1e300)
     731        self.assertEqual(round(-3.1415, 308), -3.1415)
     732        self.assertEqual(round(1e150, 309), 1e150)
     733        self.assertEqual(round(1.4e-315, 315), 1e-315)
     734
     735    def test_small_n(self):
     736        for n in [-308, -309, -400, 1-2**31, -2**31, -2**31-1, -2**100]:
     737            self.assertEqual(round(123.456, n), 0.0)
     738            self.assertEqual(round(-123.456, n), -0.0)
     739            self.assertEqual(round(1e300, n), 0.0)
     740            self.assertEqual(round(1e-320, n), 0.0)
     741
     742    def test_overflow(self):
     743        self.assertRaises(OverflowError, round, 1.6e308, -308)
     744        self.assertRaises(OverflowError, round, -1.7e308, -308)
     745
     746    @unittest.skipUnless(getattr(sys, 'float_repr_style', '') == 'short',
     747                         "test applies only when using short float repr style")
     748    def test_previous_round_bugs(self):
     749        # particular cases that have occurred in bug reports
     750        self.assertEqual(round(562949953421312.5, 1),
     751                          562949953421312.5)
     752        self.assertEqual(round(56294995342131.5, 3),
     753                         56294995342131.5)
     754
     755    @unittest.skipUnless(getattr(sys, 'float_repr_style', '') == 'short',
     756                         "test applies only when using short float repr style")
     757    def test_halfway_cases(self):
     758        # Halfway cases need special attention, since the current
     759        # implementation has to deal with them specially.  Note that
     760        # 2.x rounds halfway values up (i.e., away from zero) while
     761        # 3.x does round-half-to-even.
     762        self.assertAlmostEqual(round(0.125, 2), 0.13)
     763        self.assertAlmostEqual(round(0.375, 2), 0.38)
     764        self.assertAlmostEqual(round(0.625, 2), 0.63)
     765        self.assertAlmostEqual(round(0.875, 2), 0.88)
     766        self.assertAlmostEqual(round(-0.125, 2), -0.13)
     767        self.assertAlmostEqual(round(-0.375, 2), -0.38)
     768        self.assertAlmostEqual(round(-0.625, 2), -0.63)
     769        self.assertAlmostEqual(round(-0.875, 2), -0.88)
     770
     771        self.assertAlmostEqual(round(0.25, 1), 0.3)
     772        self.assertAlmostEqual(round(0.75, 1), 0.8)
     773        self.assertAlmostEqual(round(-0.25, 1), -0.3)
     774        self.assertAlmostEqual(round(-0.75, 1), -0.8)
     775
     776        self.assertEqual(round(-6.5, 0), -7.0)
     777        self.assertEqual(round(-5.5, 0), -6.0)
     778        self.assertEqual(round(-1.5, 0), -2.0)
     779        self.assertEqual(round(-0.5, 0), -1.0)
     780        self.assertEqual(round(0.5, 0), 1.0)
     781        self.assertEqual(round(1.5, 0), 2.0)
     782        self.assertEqual(round(2.5, 0), 3.0)
     783        self.assertEqual(round(3.5, 0), 4.0)
     784        self.assertEqual(round(4.5, 0), 5.0)
     785        self.assertEqual(round(5.5, 0), 6.0)
     786        self.assertEqual(round(6.5, 0), 7.0)
     787
     788        # same but without an explicit second argument; in 3.x these
     789        # will give integers
     790        self.assertEqual(round(-6.5), -7.0)
     791        self.assertEqual(round(-5.5), -6.0)
     792        self.assertEqual(round(-1.5), -2.0)
     793        self.assertEqual(round(-0.5), -1.0)
     794        self.assertEqual(round(0.5), 1.0)
     795        self.assertEqual(round(1.5), 2.0)
     796        self.assertEqual(round(2.5), 3.0)
     797        self.assertEqual(round(3.5), 4.0)
     798        self.assertEqual(round(4.5), 5.0)
     799        self.assertEqual(round(5.5), 6.0)
     800        self.assertEqual(round(6.5), 7.0)
     801
     802        self.assertEqual(round(-25.0, -1), -30.0)
     803        self.assertEqual(round(-15.0, -1), -20.0)
     804        self.assertEqual(round(-5.0, -1), -10.0)
     805        self.assertEqual(round(5.0, -1), 10.0)
     806        self.assertEqual(round(15.0, -1), 20.0)
     807        self.assertEqual(round(25.0, -1), 30.0)
     808        self.assertEqual(round(35.0, -1), 40.0)
     809        self.assertEqual(round(45.0, -1), 50.0)
     810        self.assertEqual(round(55.0, -1), 60.0)
     811        self.assertEqual(round(65.0, -1), 70.0)
     812        self.assertEqual(round(75.0, -1), 80.0)
     813        self.assertEqual(round(85.0, -1), 90.0)
     814        self.assertEqual(round(95.0, -1), 100.0)
     815        self.assertEqual(round(12325.0, -1), 12330.0)
     816
     817        self.assertEqual(round(350.0, -2), 400.0)
     818        self.assertEqual(round(450.0, -2), 500.0)
     819
     820        self.assertAlmostEqual(round(0.5e21, -21), 1e21)
     821        self.assertAlmostEqual(round(1.5e21, -21), 2e21)
     822        self.assertAlmostEqual(round(2.5e21, -21), 3e21)
     823        self.assertAlmostEqual(round(5.5e21, -21), 6e21)
     824        self.assertAlmostEqual(round(8.5e21, -21), 9e21)
     825
     826        self.assertAlmostEqual(round(-1.5e22, -22), -2e22)
     827        self.assertAlmostEqual(round(-0.5e22, -22), -1e22)
     828        self.assertAlmostEqual(round(0.5e22, -22), 1e22)
     829        self.assertAlmostEqual(round(1.5e22, -22), 2e22)
     830
     831
     832    @requires_IEEE_754
     833    def test_format_specials(self):
     834        # Test formatting of nans and infs.
     835
     836        def test(fmt, value, expected):
     837            # Test with both % and format().
     838            self.assertEqual(fmt % value, expected, fmt)
     839            if not '#' in fmt:
     840                # Until issue 7094 is implemented, format() for floats doesn't
     841                #  support '#' formatting
     842                fmt = fmt[1:] # strip off the %
     843                self.assertEqual(format(value, fmt), expected, fmt)
     844
     845        for fmt in ['%e', '%f', '%g', '%.0e', '%.6f', '%.20g',
     846                    '%#e', '%#f', '%#g', '%#.20e', '%#.15f', '%#.3g']:
     847            pfmt = '%+' + fmt[1:]
     848            sfmt = '% ' + fmt[1:]
     849            test(fmt, INF, 'inf')
     850            test(fmt, -INF, '-inf')
     851            test(fmt, NAN, 'nan')
     852            test(fmt, -NAN, 'nan')
     853            # When asking for a sign, it's always provided. nans are
     854            #  always positive.
     855            test(pfmt, INF, '+inf')
     856            test(pfmt, -INF, '-inf')
     857            test(pfmt, NAN, '+nan')
     858            test(pfmt, -NAN, '+nan')
     859            # When using ' ' for a sign code, only infs can be negative.
     860            #  Others have a space.
     861            test(sfmt, INF, ' inf')
     862            test(sfmt, -INF, '-inf')
     863            test(sfmt, NAN, ' nan')
     864            test(sfmt, -NAN, ' nan')
     865
     866
    268867# Beginning with Python 2.6 float has cross platform compatible
    269868# ways to create and represent inf and nan
    270869class InfNanTest(unittest.TestCase):
    271870    def test_inf_from_str(self):
    272         self.assert_(isinf(float("inf")))
    273         self.assert_(isinf(float("+inf")))
    274         self.assert_(isinf(float("-inf")))
    275         self.assert_(isinf(float("infinity")))
    276         self.assert_(isinf(float("+infinity")))
    277         self.assert_(isinf(float("-infinity")))
     871        self.assertTrue(isinf(float("inf")))
     872        self.assertTrue(isinf(float("+inf")))
     873        self.assertTrue(isinf(float("-inf")))
     874        self.assertTrue(isinf(float("infinity")))
     875        self.assertTrue(isinf(float("+infinity")))
     876        self.assertTrue(isinf(float("-infinity")))
    278877
    279878        self.assertEqual(repr(float("inf")), "inf")
     
    317916
    318917    def test_nan_from_str(self):
    319         self.assert_(isnan(float("nan")))
    320         self.assert_(isnan(float("+nan")))
    321         self.assert_(isnan(float("-nan")))
     918        self.assertTrue(isnan(float("nan")))
     919        self.assertTrue(isnan(float("+nan")))
     920        self.assertTrue(isnan(float("-nan")))
    322921
    323922        self.assertEqual(repr(float("nan")), "nan")
     
    348947
    349948    def notest_float_nan(self):
    350         self.assert_(NAN.is_nan())
    351         self.failIf(INF.is_nan())
    352         self.failIf((0.).is_nan())
     949        self.assertTrue(NAN.is_nan())
     950        self.assertFalse(INF.is_nan())
     951        self.assertFalse((0.).is_nan())
    353952
    354953    def notest_float_inf(self):
    355         self.assert_(INF.is_inf())
    356         self.failIf(NAN.is_inf())
    357         self.failIf((0.).is_inf())
     954        self.assertTrue(INF.is_inf())
     955        self.assertFalse(NAN.is_inf())
     956        self.assertFalse((0.).is_inf())
     957
     958    def test_hash_inf(self):
     959        # the actual values here should be regarded as an
     960        # implementation detail, but they need to be
     961        # identical to those used in the Decimal module.
     962        self.assertEqual(hash(float('inf')), 314159)
     963        self.assertEqual(hash(float('-inf')), -271828)
     964        self.assertEqual(hash(float('nan')), 0)
     965
    358966
    359967fromHex = float.fromhex
     
    7861394        IEEEFormatTestCase,
    7871395        ReprTestCase,
     1396        RoundTestCase,
    7881397        InfNanTest,
    7891398        HexFloatTestCase,
Note: See TracChangeset for help on using the changeset viewer.