Changeset 391 for python/trunk/Lib/test/test_float.py
- Timestamp:
- Mar 19, 2014, 11:31:01 PM (11 years ago)
- Location:
- python/trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
python/trunk
-
Property svn:mergeinfo
set to
/python/vendor/Python-2.7.6 merged eligible /python/vendor/current merged eligible
-
Property svn:mergeinfo
set to
-
python/trunk/Lib/test/test_float.py
r2 r391 6 6 from math import isinf, isnan, copysign, ldexp 7 7 import operator 8 import random, fractions 8 import random 9 import fractions 10 import sys 9 11 10 12 INF = float("inf") 11 13 NAN = float("nan") 14 15 have_getformat = hasattr(float, "__getformat__") 16 requires_getformat = unittest.skipUnless(have_getformat, 17 "requires __getformat__") 18 requires_setformat = unittest.skipUnless(hasattr(float, "__setformat__"), 19 "requires __setformat__") 20 # decorator for skipping tests on non-IEEE 754 platforms 21 requires_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 26 test_dir = os.path.dirname(__file__) or os.curdir 27 format_testfile = os.path.join(test_dir, 'formatfloat_testcases.txt') 12 28 13 29 class GeneralFloatCases(unittest.TestCase): … … 25 41 self.assertRaises(ValueError, float, "-+3.14") 26 42 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") 27 46 if test_support.have_unicode: 28 47 self.assertEqual(float(unicode(" 3.14 ")), 3.14) 29 48 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) 32 96 33 97 @test_support.run_with_locale('LC_NUMERIC', 'fr_FR', 'de_DE') … … 35 99 # set locale to something that doesn't use '.' for the decimal point 36 100 # float must not accept the locale specific decimal point but 37 # it still has to accept the normal python synta c101 # it still has to accept the normal python syntax 38 102 import locale 39 103 if not locale.localeconv()['decimal_point'] == ',': … … 101 165 self.assertAlmostEqual(float(FooStr('8')), 9.) 102 166 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 103 173 def test_floatasratio(self): 104 174 for f, ratio in [ … … 134 204 self.assertRaises(ValueError, float('nan').as_integer_ratio) 135 205 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 136 434 class FormatFunctionsTestCase(unittest.TestCase): 137 435 … … 145 443 146 444 def test_getformat(self): 147 self.assert _(float.__getformat__('double') in148 ['unknown', 'IEEE, big-endian', 'IEEE, little-endian'])149 self.assert _(float.__getformat__('float') in150 ['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']) 151 449 self.assertRaises(ValueError, float.__getformat__, 'chicken') 152 450 self.assertRaises(TypeError, float.__getformat__, 1) … … 184 482 # representing an infinity or a NaN should raise an exception. 185 483 484 @requires_setformat 186 485 class UnknownFormatTestCase(unittest.TestCase): 187 486 def setUp(self): … … 216 515 217 516 class 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') 255 630 256 631 class ReprTestCase(unittest.TestCase): … … 266 641 floats_file.close() 267 642 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 694 class 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 268 867 # Beginning with Python 2.6 float has cross platform compatible 269 868 # ways to create and represent inf and nan 270 869 class InfNanTest(unittest.TestCase): 271 870 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"))) 278 877 279 878 self.assertEqual(repr(float("inf")), "inf") … … 317 916 318 917 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"))) 322 921 323 922 self.assertEqual(repr(float("nan")), "nan") … … 348 947 349 948 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()) 353 952 354 953 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 358 966 359 967 fromHex = float.fromhex … … 786 1394 IEEEFormatTestCase, 787 1395 ReprTestCase, 1396 RoundTestCase, 788 1397 InfNanTest, 789 1398 HexFloatTestCase,
Note:
See TracChangeset
for help on using the changeset viewer.