1ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 2ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport unittest, struct 3ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport os 4ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom test import test_support 5ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport math 6ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom math import isinf, isnan, copysign, ldexp 7ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport operator 8ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport random 9ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport fractions 10ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport sys 11ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 12ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehINF = float("inf") 13ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehNAN = float("nan") 14ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 15ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehhave_getformat = hasattr(float, "__getformat__") 16ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehrequires_getformat = unittest.skipUnless(have_getformat, 17ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh "requires __getformat__") 18ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehrequires_setformat = unittest.skipUnless(hasattr(float, "__setformat__"), 19ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh "requires __setformat__") 20ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# decorator for skipping tests on non-IEEE 754 platforms 21ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehrequires_IEEE_754 = unittest.skipUnless(have_getformat and 22ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh float.__getformat__("double").startswith("IEEE"), 23ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh "test requires IEEE 754 doubles") 24ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 25ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh#locate file with float format test values 26ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehtest_dir = os.path.dirname(__file__) or os.curdir 27ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehformat_testfile = os.path.join(test_dir, 'formatfloat_testcases.txt') 28ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 29ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass GeneralFloatCases(unittest.TestCase): 30ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 31ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_float(self): 32ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(float(3.14), 3.14) 33ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(float(314), 314.0) 34ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(float(314L), 314.0) 35ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(float(" 3.14 "), 3.14) 36ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, float, " 0x3.1 ") 37ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, float, " -0x3.p-1 ") 38ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, float, " +0x3.p-1 ") 39ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, float, "++3.14") 40ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, float, "+-3.14") 41ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, float, "-+3.14") 42ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, float, "--3.14") 43ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # check that we don't accept alternate exponent markers 44ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, float, "-1.7d29") 45ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, float, "3D-14") 46ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if test_support.have_unicode: 47ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(float(unicode(" 3.14 ")), 3.14) 48ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(float(unicode(" \u0663.\u0661\u0664 ",'raw-unicode-escape')), 3.14) 49ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 50ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # extra long strings should no longer be a problem 51ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # (in 2.6, long unicode inputs to float raised ValueError) 52ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh float('.' + '1'*1000) 53ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh float(unicode('.' + '1'*1000)) 54ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 55ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def check_conversion_to_int(self, x): 56ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh """Check that int(x) has the correct value and type, for a float x.""" 57ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh n = int(x) 58ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if x >= 0.0: 59ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # x >= 0 and n = int(x) ==> n <= x < n + 1 60ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertLessEqual(n, x) 61ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertLess(x, n + 1) 62ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh else: 63ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # x < 0 and n = int(x) ==> n >= x > n - 1 64ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertGreaterEqual(n, x) 65ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertGreater(x, n - 1) 66ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 67ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Result should be an int if within range, else a long. 68ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if -sys.maxint-1 <= n <= sys.maxint: 69ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(type(n), int) 70ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh else: 71ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(type(n), long) 72ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 73ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Double check. 74ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(type(int(n)), type(n)) 75ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 76ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_conversion_to_int(self): 77ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Check that floats within the range of an int convert to type 78ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # int, not long. (issue #11144.) 79ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh boundary = float(sys.maxint + 1) 80ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh epsilon = 2**-sys.float_info.mant_dig * boundary 81ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 82ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # These 2 floats are either side of the positive int/long boundary on 83ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # both 32-bit and 64-bit systems. 84ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.check_conversion_to_int(boundary - epsilon) 85ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.check_conversion_to_int(boundary) 86ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 87ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # These floats are either side of the negative long/int boundary on 88ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # 64-bit systems... 89ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.check_conversion_to_int(-boundary - 2*epsilon) 90ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.check_conversion_to_int(-boundary) 91ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 92ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # ... and these ones are either side of the negative long/int 93ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # boundary on 32-bit systems. 94ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.check_conversion_to_int(-boundary - 1.0) 95ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.check_conversion_to_int(-boundary - 1.0 + 2*epsilon) 96ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 97ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @test_support.run_with_locale('LC_NUMERIC', 'fr_FR', 'de_DE') 98ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_float_with_comma(self): 99ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # set locale to something that doesn't use '.' for the decimal point 100ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # float must not accept the locale specific decimal point but 101ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # it still has to accept the normal python syntax 102ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh import locale 103ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if not locale.localeconv()['decimal_point'] == ',': 104ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return 105ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 106ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(float(" 3.14 "), 3.14) 107ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(float("+3.14 "), 3.14) 108ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(float("-3.14 "), -3.14) 109ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(float(".14 "), .14) 110ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(float("3. "), 3.0) 111ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(float("3.e3 "), 3000.0) 112ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(float("3.2e3 "), 3200.0) 113ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(float("2.5e-1 "), 0.25) 114ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(float("5e-1"), 0.5) 115ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, float, " 3,14 ") 116ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, float, " +3,14 ") 117ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, float, " -3,14 ") 118ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, float, " 0x3.1 ") 119ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, float, " -0x3.p-1 ") 120ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, float, " +0x3.p-1 ") 121ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(float(" 25.e-1 "), 2.5) 122ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(test_support.fcmp(float(" .25e-1 "), .025), 0) 123ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 124ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_floatconversion(self): 125ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Make sure that calls to __float__() work properly 126ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh class Foo0: 127ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def __float__(self): 128ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return 42. 129ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 130ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh class Foo1(object): 131ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def __float__(self): 132ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return 42. 133ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 134ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh class Foo2(float): 135ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def __float__(self): 136ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return 42. 137ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 138ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh class Foo3(float): 139ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def __new__(cls, value=0.): 140ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return float.__new__(cls, 2*value) 141ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 142ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def __float__(self): 143ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return self 144ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 145ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh class Foo4(float): 146ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def __float__(self): 147ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return 42 148ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 149ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Issue 5759: __float__ not called on str subclasses (though it is on 150ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # unicode subclasses). 151ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh class FooStr(str): 152ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def __float__(self): 153ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return float(str(self)) + 1 154ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 155ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh class FooUnicode(unicode): 156ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def __float__(self): 157ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return float(unicode(self)) + 1 158ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 159ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertAlmostEqual(float(Foo0()), 42.) 160ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertAlmostEqual(float(Foo1()), 42.) 161ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertAlmostEqual(float(Foo2()), 42.) 162ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertAlmostEqual(float(Foo3(21)), 42.) 163ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(TypeError, float, Foo4(42)) 164ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertAlmostEqual(float(FooUnicode('8')), 9.) 165ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertAlmostEqual(float(FooStr('8')), 9.) 166ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 167ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_is_integer(self): 168ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertFalse((1.1).is_integer()) 169ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue((1.).is_integer()) 170ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertFalse(float("nan").is_integer()) 171ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertFalse(float("inf").is_integer()) 172ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 173ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_floatasratio(self): 174ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for f, ratio in [ 175ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh (0.875, (7, 8)), 176ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh (-0.875, (-7, 8)), 177ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh (0.0, (0, 1)), 178ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh (11.5, (23, 2)), 179ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ]: 180ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(f.as_integer_ratio(), ratio) 181ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 182ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for i in range(10000): 183ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh f = random.random() 184ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh f *= 10 ** random.randint(-100, 100) 185ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh n, d = f.as_integer_ratio() 186ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(float(n).__truediv__(d), f) 187ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 188ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh R = fractions.Fraction 189ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(R(0, 1), 190ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh R(*float(0.0).as_integer_ratio())) 191ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(R(5, 2), 192ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh R(*float(2.5).as_integer_ratio())) 193ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(R(1, 2), 194ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh R(*float(0.5).as_integer_ratio())) 195ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(R(4728779608739021, 2251799813685248), 196ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh R(*float(2.1).as_integer_ratio())) 197ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(R(-4728779608739021, 2251799813685248), 198ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh R(*float(-2.1).as_integer_ratio())) 199ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(R(-2100, 1), 200ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh R(*float(-2100.0).as_integer_ratio())) 201ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 202ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(OverflowError, float('inf').as_integer_ratio) 203ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(OverflowError, float('-inf').as_integer_ratio) 204ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, float('nan').as_integer_ratio) 205ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 206ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def assertEqualAndEqualSign(self, a, b): 207ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # fail unless a == b and a and b have the same sign bit; 208ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # the only difference from assertEqual is that this test 209ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # distinguishes -0.0 and 0.0. 210ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual((a, copysign(1.0, a)), (b, copysign(1.0, b))) 211ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 212ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @requires_IEEE_754 213ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_float_mod(self): 214ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Check behaviour of % operator for IEEE 754 special cases. 215ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # In particular, check signs of zeros. 216ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh mod = operator.mod 217ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 218ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(mod(-1.0, 1.0), 0.0) 219ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(mod(-1e-100, 1.0), 1.0) 220ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(mod(-0.0, 1.0), 0.0) 221ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(mod(0.0, 1.0), 0.0) 222ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(mod(1e-100, 1.0), 1e-100) 223ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(mod(1.0, 1.0), 0.0) 224ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 225ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(mod(-1.0, -1.0), -0.0) 226ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(mod(-1e-100, -1.0), -1e-100) 227ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(mod(-0.0, -1.0), -0.0) 228ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(mod(0.0, -1.0), -0.0) 229ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(mod(1e-100, -1.0), -1.0) 230ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(mod(1.0, -1.0), -0.0) 231ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 232ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @requires_IEEE_754 233ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_float_pow(self): 234ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # test builtin pow and ** operator for IEEE 754 special cases. 235ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Special cases taken from section F.9.4.4 of the C99 specification 236ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 237ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for pow_op in pow, operator.pow: 238ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # x**NAN is NAN for any x except 1 239ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(isnan(pow_op(-INF, NAN))) 240ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(isnan(pow_op(-2.0, NAN))) 241ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(isnan(pow_op(-1.0, NAN))) 242ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(isnan(pow_op(-0.5, NAN))) 243ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(isnan(pow_op(-0.0, NAN))) 244ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(isnan(pow_op(0.0, NAN))) 245ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(isnan(pow_op(0.5, NAN))) 246ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(isnan(pow_op(2.0, NAN))) 247ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(isnan(pow_op(INF, NAN))) 248ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(isnan(pow_op(NAN, NAN))) 249ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 250ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # NAN**y is NAN for any y except +-0 251ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(isnan(pow_op(NAN, -INF))) 252ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(isnan(pow_op(NAN, -2.0))) 253ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(isnan(pow_op(NAN, -1.0))) 254ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(isnan(pow_op(NAN, -0.5))) 255ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(isnan(pow_op(NAN, 0.5))) 256ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(isnan(pow_op(NAN, 1.0))) 257ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(isnan(pow_op(NAN, 2.0))) 258ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(isnan(pow_op(NAN, INF))) 259ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 260ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # (+-0)**y raises ZeroDivisionError for y a negative odd integer 261ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ZeroDivisionError, pow_op, -0.0, -1.0) 262ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ZeroDivisionError, pow_op, 0.0, -1.0) 263ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 264ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # (+-0)**y raises ZeroDivisionError for y finite and negative 265ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # but not an odd integer 266ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ZeroDivisionError, pow_op, -0.0, -2.0) 267ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ZeroDivisionError, pow_op, -0.0, -0.5) 268ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ZeroDivisionError, pow_op, 0.0, -2.0) 269ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ZeroDivisionError, pow_op, 0.0, -0.5) 270ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 271ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # (+-0)**y is +-0 for y a positive odd integer 272ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-0.0, 1.0), -0.0) 273ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(0.0, 1.0), 0.0) 274ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 275ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # (+-0)**y is 0 for y finite and positive but not an odd integer 276ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-0.0, 0.5), 0.0) 277ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-0.0, 2.0), 0.0) 278ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(0.0, 0.5), 0.0) 279ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(0.0, 2.0), 0.0) 280ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 281ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # (-1)**+-inf is 1 282ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-1.0, -INF), 1.0) 283ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-1.0, INF), 1.0) 284ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 285ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # 1**y is 1 for any y, even if y is an infinity or nan 286ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(1.0, -INF), 1.0) 287ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(1.0, -2.0), 1.0) 288ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(1.0, -1.0), 1.0) 289ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(1.0, -0.5), 1.0) 290ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(1.0, -0.0), 1.0) 291ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(1.0, 0.0), 1.0) 292ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(1.0, 0.5), 1.0) 293ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(1.0, 1.0), 1.0) 294ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(1.0, 2.0), 1.0) 295ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(1.0, INF), 1.0) 296ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(1.0, NAN), 1.0) 297ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 298ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # x**+-0 is 1 for any x, even if x is a zero, infinity, or nan 299ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-INF, 0.0), 1.0) 300ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-2.0, 0.0), 1.0) 301ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-1.0, 0.0), 1.0) 302ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-0.5, 0.0), 1.0) 303ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-0.0, 0.0), 1.0) 304ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(0.0, 0.0), 1.0) 305ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(0.5, 0.0), 1.0) 306ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(1.0, 0.0), 1.0) 307ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(2.0, 0.0), 1.0) 308ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(INF, 0.0), 1.0) 309ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(NAN, 0.0), 1.0) 310ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-INF, -0.0), 1.0) 311ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-2.0, -0.0), 1.0) 312ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-1.0, -0.0), 1.0) 313ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-0.5, -0.0), 1.0) 314ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-0.0, -0.0), 1.0) 315ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(0.0, -0.0), 1.0) 316ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(0.5, -0.0), 1.0) 317ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(1.0, -0.0), 1.0) 318ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(2.0, -0.0), 1.0) 319ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(INF, -0.0), 1.0) 320ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(NAN, -0.0), 1.0) 321ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 322ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # x**y raises ValueError for finite negative x and non-integral y 323ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, pow_op, -2.0, -0.5) 324ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, pow_op, -2.0, 0.5) 325ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, pow_op, -1.0, -0.5) 326ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, pow_op, -1.0, 0.5) 327ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, pow_op, -0.5, -0.5) 328ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, pow_op, -0.5, 0.5) 329ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 330ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # x**-INF is INF for abs(x) < 1 331ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-0.5, -INF), INF) 332ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-0.0, -INF), INF) 333ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(0.0, -INF), INF) 334ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(0.5, -INF), INF) 335ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 336ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # x**-INF is 0 for abs(x) > 1 337ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-INF, -INF), 0.0) 338ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-2.0, -INF), 0.0) 339ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(2.0, -INF), 0.0) 340ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(INF, -INF), 0.0) 341ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 342ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # x**INF is 0 for abs(x) < 1 343ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-0.5, INF), 0.0) 344ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-0.0, INF), 0.0) 345ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(0.0, INF), 0.0) 346ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(0.5, INF), 0.0) 347ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 348ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # x**INF is INF for abs(x) > 1 349ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-INF, INF), INF) 350ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-2.0, INF), INF) 351ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(2.0, INF), INF) 352ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(INF, INF), INF) 353ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 354ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # (-INF)**y is -0.0 for y a negative odd integer 355ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-INF, -1.0), -0.0) 356ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 357ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # (-INF)**y is 0.0 for y negative but not an odd integer 358ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-INF, -0.5), 0.0) 359ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-INF, -2.0), 0.0) 360ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 361ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # (-INF)**y is -INF for y a positive odd integer 362ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-INF, 1.0), -INF) 363ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 364ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # (-INF)**y is INF for y positive but not an odd integer 365ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-INF, 0.5), INF) 366ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-INF, 2.0), INF) 367ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 368ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # INF**y is INF for y positive 369ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(INF, 0.5), INF) 370ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(INF, 1.0), INF) 371ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(INF, 2.0), INF) 372ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 373ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # INF**y is 0.0 for y negative 374ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(INF, -2.0), 0.0) 375ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(INF, -1.0), 0.0) 376ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(INF, -0.5), 0.0) 377ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 378ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # basic checks not covered by the special cases above 379ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-2.0, -2.0), 0.25) 380ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-2.0, -1.0), -0.5) 381ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-2.0, -0.0), 1.0) 382ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-2.0, 0.0), 1.0) 383ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-2.0, 1.0), -2.0) 384ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-2.0, 2.0), 4.0) 385ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-1.0, -2.0), 1.0) 386ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-1.0, -1.0), -1.0) 387ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-1.0, -0.0), 1.0) 388ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-1.0, 0.0), 1.0) 389ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-1.0, 1.0), -1.0) 390ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-1.0, 2.0), 1.0) 391ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(2.0, -2.0), 0.25) 392ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(2.0, -1.0), 0.5) 393ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(2.0, -0.0), 1.0) 394ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(2.0, 0.0), 1.0) 395ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(2.0, 1.0), 2.0) 396ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(2.0, 2.0), 4.0) 397ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 398ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # 1 ** large and -1 ** large; some libms apparently 399ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # have problems with these 400ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(1.0, -1e100), 1.0) 401ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(1.0, 1e100), 1.0) 402ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-1.0, -1e100), 1.0) 403ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-1.0, 1e100), 1.0) 404ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 405ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # check sign for results that underflow to 0 406ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-2.0, -2000.0), 0.0) 407ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, pow_op, -2.0, -2000.5) 408ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-2.0, -2001.0), -0.0) 409ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(2.0, -2000.0), 0.0) 410ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(2.0, -2000.5), 0.0) 411ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(2.0, -2001.0), 0.0) 412ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-0.5, 2000.0), 0.0) 413ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, pow_op, -0.5, 2000.5) 414ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(-0.5, 2001.0), -0.0) 415ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(0.5, 2000.0), 0.0) 416ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(0.5, 2000.5), 0.0) 417ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqualAndEqualSign(pow_op(0.5, 2001.0), 0.0) 418ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 419ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # check we don't raise an exception for subnormal results, 420ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # and validate signs. Tests currently disabled, since 421ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # they fail on systems where a subnormal result from pow 422ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # is flushed to zero (e.g. Debian/ia64.) 423ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh #self.assertTrue(0.0 < pow_op(0.5, 1048) < 1e-315) 424ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh #self.assertTrue(0.0 < pow_op(-0.5, 1048) < 1e-315) 425ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh #self.assertTrue(0.0 < pow_op(0.5, 1047) < 1e-315) 426ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh #self.assertTrue(0.0 > pow_op(-0.5, 1047) > -1e-315) 427ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh #self.assertTrue(0.0 < pow_op(2.0, -1048) < 1e-315) 428ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh #self.assertTrue(0.0 < pow_op(-2.0, -1048) < 1e-315) 429ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh #self.assertTrue(0.0 < pow_op(2.0, -1047) < 1e-315) 430ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh #self.assertTrue(0.0 > pow_op(-2.0, -1047) > -1e-315) 431ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 432ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 433ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh@requires_setformat 434ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass FormatFunctionsTestCase(unittest.TestCase): 435ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 436ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def setUp(self): 437ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.save_formats = {'double':float.__getformat__('double'), 438ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'float':float.__getformat__('float')} 439ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 440ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def tearDown(self): 441ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh float.__setformat__('double', self.save_formats['double']) 442ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh float.__setformat__('float', self.save_formats['float']) 443ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 444ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_getformat(self): 445ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIn(float.__getformat__('double'), 446ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ['unknown', 'IEEE, big-endian', 'IEEE, little-endian']) 447ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertIn(float.__getformat__('float'), 448ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ['unknown', 'IEEE, big-endian', 'IEEE, little-endian']) 449ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, float.__getformat__, 'chicken') 450ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(TypeError, float.__getformat__, 1) 451ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 452ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_setformat(self): 453ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for t in 'double', 'float': 454ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh float.__setformat__(t, 'unknown') 455ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if self.save_formats[t] == 'IEEE, big-endian': 456ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, float.__setformat__, 457ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh t, 'IEEE, little-endian') 458ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh elif self.save_formats[t] == 'IEEE, little-endian': 459ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, float.__setformat__, 460ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh t, 'IEEE, big-endian') 461ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh else: 462ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, float.__setformat__, 463ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh t, 'IEEE, big-endian') 464ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, float.__setformat__, 465ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh t, 'IEEE, little-endian') 466ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, float.__setformat__, 467ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh t, 'chicken') 468ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, float.__setformat__, 469ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'chicken', 'unknown') 470ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 471ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehBE_DOUBLE_INF = '\x7f\xf0\x00\x00\x00\x00\x00\x00' 472ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehLE_DOUBLE_INF = ''.join(reversed(BE_DOUBLE_INF)) 473ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehBE_DOUBLE_NAN = '\x7f\xf8\x00\x00\x00\x00\x00\x00' 474ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehLE_DOUBLE_NAN = ''.join(reversed(BE_DOUBLE_NAN)) 475ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 476ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehBE_FLOAT_INF = '\x7f\x80\x00\x00' 477ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehLE_FLOAT_INF = ''.join(reversed(BE_FLOAT_INF)) 478ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehBE_FLOAT_NAN = '\x7f\xc0\x00\x00' 479ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehLE_FLOAT_NAN = ''.join(reversed(BE_FLOAT_NAN)) 480ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 481ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# on non-IEEE platforms, attempting to unpack a bit pattern 482ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# representing an infinity or a NaN should raise an exception. 483ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 484ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh@requires_setformat 485ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass UnknownFormatTestCase(unittest.TestCase): 486ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def setUp(self): 487ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.save_formats = {'double':float.__getformat__('double'), 488ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'float':float.__getformat__('float')} 489ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh float.__setformat__('double', 'unknown') 490ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh float.__setformat__('float', 'unknown') 491ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 492ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def tearDown(self): 493ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh float.__setformat__('double', self.save_formats['double']) 494ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh float.__setformat__('float', self.save_formats['float']) 495ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 496ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_double_specials_dont_unpack(self): 497ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for fmt, data in [('>d', BE_DOUBLE_INF), 498ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('>d', BE_DOUBLE_NAN), 499ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('<d', LE_DOUBLE_INF), 500ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('<d', LE_DOUBLE_NAN)]: 501ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, struct.unpack, fmt, data) 502ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 503ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_float_specials_dont_unpack(self): 504ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for fmt, data in [('>f', BE_FLOAT_INF), 505ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('>f', BE_FLOAT_NAN), 506ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('<f', LE_FLOAT_INF), 507ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('<f', LE_FLOAT_NAN)]: 508ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, struct.unpack, fmt, data) 509ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 510ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 511ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# on an IEEE platform, all we guarantee is that bit patterns 512ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# representing infinities or NaNs do not raise an exception; all else 513ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# is accident (today). 514ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# let's also try to guarantee that -0.0 and 0.0 don't get confused. 515ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 516ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass IEEEFormatTestCase(unittest.TestCase): 517ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 518ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @requires_IEEE_754 519ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_double_specials_do_unpack(self): 520ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for fmt, data in [('>d', BE_DOUBLE_INF), 521ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('>d', BE_DOUBLE_NAN), 522ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('<d', LE_DOUBLE_INF), 523ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('<d', LE_DOUBLE_NAN)]: 524ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh struct.unpack(fmt, data) 525ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 526ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @requires_IEEE_754 527ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_float_specials_do_unpack(self): 528ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for fmt, data in [('>f', BE_FLOAT_INF), 529ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('>f', BE_FLOAT_NAN), 530ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('<f', LE_FLOAT_INF), 531ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('<f', LE_FLOAT_NAN)]: 532ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh struct.unpack(fmt, data) 533ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 534ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @requires_IEEE_754 535ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_negative_zero(self): 536ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def pos_pos(): 537ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return 0.0, math.atan2(0.0, -1) 538ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def pos_neg(): 539ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return 0.0, math.atan2(-0.0, -1) 540ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def neg_pos(): 541ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return -0.0, math.atan2(0.0, -1) 542ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def neg_neg(): 543ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return -0.0, math.atan2(-0.0, -1) 544ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(pos_pos(), neg_pos()) 545ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(pos_neg(), neg_neg()) 546ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 547ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @requires_IEEE_754 548ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_underflow_sign(self): 549ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # check that -1e-1000 gives -0.0, not 0.0 550ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(math.atan2(-1e-1000, -1), math.atan2(-0.0, -1)) 551ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(math.atan2(float('-1e-1000'), -1), 552ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh math.atan2(-0.0, -1)) 553ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 554ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_format(self): 555ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # these should be rewritten to use both format(x, spec) and 556ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # x.__format__(spec) 557ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 558ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(format(0.0, 'f'), '0.000000') 559ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 560ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # the default is 'g', except for empty format spec 561ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(format(0.0, ''), '0.0') 562ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(format(0.01, ''), '0.01') 563ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(format(0.01, 'g'), '0.01') 564ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 565ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # empty presentation type should format in the same way as str 566ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # (issue 5920) 567ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh x = 100/7. 568ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(format(x, ''), str(x)) 569ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(format(x, '-'), str(x)) 570ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(format(x, '>'), str(x)) 571ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(format(x, '2'), str(x)) 572ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 573ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(format(1.0, 'f'), '1.000000') 574ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 575ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(format(-1.0, 'f'), '-1.000000') 576ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 577ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(format( 1.0, ' f'), ' 1.000000') 578ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(format(-1.0, ' f'), '-1.000000') 579ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(format( 1.0, '+f'), '+1.000000') 580ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(format(-1.0, '+f'), '-1.000000') 581ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 582ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # % formatting 583ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(format(-1.0, '%'), '-100.000000%') 584ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 585ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # conversion to string should fail 586ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, format, 3.0, "s") 587ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 588ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # other format specifiers shouldn't work on floats, 589ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # in particular int specifiers 590ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for format_spec in ([chr(x) for x in range(ord('a'), ord('z')+1)] + 591ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh [chr(x) for x in range(ord('A'), ord('Z')+1)]): 592ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if not format_spec in 'eEfFgGn%': 593ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, format, 0.0, format_spec) 594ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, format, 1.0, format_spec) 595ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, format, -1.0, format_spec) 596ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, format, 1e100, format_spec) 597ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, format, -1e100, format_spec) 598ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, format, 1e-100, format_spec) 599ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, format, -1e-100, format_spec) 600ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 601ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # issue 3382: 'f' and 'F' with inf's and nan's 602ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual('{0:f}'.format(INF), 'inf') 603ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual('{0:F}'.format(INF), 'INF') 604ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual('{0:f}'.format(-INF), '-inf') 605ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual('{0:F}'.format(-INF), '-INF') 606ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual('{0:f}'.format(NAN), 'nan') 607ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual('{0:F}'.format(NAN), 'NAN') 608ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 609ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @requires_IEEE_754 610ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_format_testfile(self): 611ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh with open(format_testfile) as testfile: 612ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for line in open(format_testfile): 613ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if line.startswith('--'): 614ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh continue 615ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh line = line.strip() 616ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if not line: 617ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh continue 618ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 619ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh lhs, rhs = map(str.strip, line.split('->')) 620ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fmt, arg = lhs.split() 621ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh arg = float(arg) 622ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(fmt % arg, rhs) 623ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if not math.isnan(arg) and copysign(1.0, arg) > 0.0: 624ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(fmt % -arg, '-' + rhs) 625ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 626ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_issue5864(self): 627ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(format(123.456, '.4'), '123.5') 628ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(format(1234.56, '.4'), '1.235e+03') 629ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(format(12345.6, '.4'), '1.235e+04') 630ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 631ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass ReprTestCase(unittest.TestCase): 632ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_repr(self): 633ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh floats_file = open(os.path.join(os.path.split(__file__)[0], 634ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'floating_points.txt')) 635ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for line in floats_file: 636ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh line = line.strip() 637ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if not line or line.startswith('#'): 638ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh continue 639ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh v = eval(line) 640ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(v, eval(repr(v))) 641ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh floats_file.close() 642ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 643ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @unittest.skipUnless(getattr(sys, 'float_repr_style', '') == 'short', 644ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh "applies only when using short float repr style") 645ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_short_repr(self): 646ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # test short float repr introduced in Python 3.1. One aspect 647ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # of this repr is that we get some degree of str -> float -> 648ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # str roundtripping. In particular, for any numeric string 649ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # containing 15 or fewer significant digits, those exact same 650ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # digits (modulo trailing zeros) should appear in the output. 651ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # No more repr(0.03) -> "0.029999999999999999"! 652ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 653ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh test_strings = [ 654ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # output always includes *either* a decimal point and at 655ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # least one digit after that point, or an exponent. 656ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '0.0', 657ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '1.0', 658ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '0.01', 659ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '0.02', 660ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '0.03', 661ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '0.04', 662ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '0.05', 663ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '1.23456789', 664ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '10.0', 665ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '100.0', 666ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # values >= 1e16 get an exponent... 667ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '1000000000000000.0', 668ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '9999999999999990.0', 669ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '1e+16', 670ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '1e+17', 671ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # ... and so do values < 1e-4 672ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '0.001', 673ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '0.001001', 674ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '0.00010000000000001', 675ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '0.0001', 676ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '9.999999999999e-05', 677ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '1e-05', 678ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # values designed to provoke failure if the FPU rounding 679ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # precision isn't set correctly 680ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '8.72293771110361e+25', 681ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '7.47005307342313e+26', 682ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '2.86438000439698e+28', 683ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '8.89142905246179e+28', 684ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '3.08578087079232e+35', 685ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ] 686ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 687ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for s in test_strings: 688ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh negs = '-'+s 689ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(s, repr(float(s))) 690ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(negs, repr(float(negs))) 691ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 692ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 693ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh@requires_IEEE_754 694ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass RoundTestCase(unittest.TestCase): 695ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_second_argument_type(self): 696ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # any type with an __index__ method should be permitted as 697ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # a second argument 698ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertAlmostEqual(round(12.34, True), 12.3) 699ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 700ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh class MyIndex(object): 701ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def __index__(self): return 4 702ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertAlmostEqual(round(-0.123456, MyIndex()), -0.1235) 703ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # but floats should be illegal 704ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(TypeError, round, 3.14159, 2.0) 705ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 706ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_inf_nan(self): 707ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # rounding an infinity or nan returns the same number; 708ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # (in py3k, rounding an infinity or nan raises an error, 709ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # since the result can't be represented as a long). 710ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(INF), INF) 711ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(-INF), -INF) 712ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(math.isnan(round(NAN))) 713ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for n in range(-5, 5): 714ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(INF, n), INF) 715ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(-INF, n), -INF) 716ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(math.isnan(round(NAN, n))) 717ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 718ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(TypeError, round, INF, 0.0) 719ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(TypeError, round, -INF, 1.0) 720ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(TypeError, round, NAN, "ceci n'est pas un integer") 721ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(TypeError, round, -0.0, 1j) 722ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 723ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_large_n(self): 724ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for n in [324, 325, 400, 2**31-1, 2**31, 2**32, 2**100]: 725ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(123.456, n), 123.456) 726ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(-123.456, n), -123.456) 727ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(1e300, n), 1e300) 728ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(1e-320, n), 1e-320) 729ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(1e150, 300), 1e150) 730ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(1e300, 307), 1e300) 731ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(-3.1415, 308), -3.1415) 732ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(1e150, 309), 1e150) 733ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(1.4e-315, 315), 1e-315) 734ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 735ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_small_n(self): 736ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for n in [-308, -309, -400, 1-2**31, -2**31, -2**31-1, -2**100]: 737ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(123.456, n), 0.0) 738ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(-123.456, n), -0.0) 739ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(1e300, n), 0.0) 740ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(1e-320, n), 0.0) 741ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 742ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_overflow(self): 743ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(OverflowError, round, 1.6e308, -308) 744ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(OverflowError, round, -1.7e308, -308) 745ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 746ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @unittest.skipUnless(getattr(sys, 'float_repr_style', '') == 'short', 747ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh "test applies only when using short float repr style") 748ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_previous_round_bugs(self): 749ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # particular cases that have occurred in bug reports 750ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(562949953421312.5, 1), 751ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 562949953421312.5) 752ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(56294995342131.5, 3), 753ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 56294995342131.5) 754ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 755ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @unittest.skipUnless(getattr(sys, 'float_repr_style', '') == 'short', 756ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh "test applies only when using short float repr style") 757ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_halfway_cases(self): 758ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Halfway cases need special attention, since the current 759ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # implementation has to deal with them specially. Note that 760ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # 2.x rounds halfway values up (i.e., away from zero) while 761ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # 3.x does round-half-to-even. 762ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertAlmostEqual(round(0.125, 2), 0.13) 763ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertAlmostEqual(round(0.375, 2), 0.38) 764ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertAlmostEqual(round(0.625, 2), 0.63) 765ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertAlmostEqual(round(0.875, 2), 0.88) 766ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertAlmostEqual(round(-0.125, 2), -0.13) 767ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertAlmostEqual(round(-0.375, 2), -0.38) 768ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertAlmostEqual(round(-0.625, 2), -0.63) 769ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertAlmostEqual(round(-0.875, 2), -0.88) 770ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 771ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertAlmostEqual(round(0.25, 1), 0.3) 772ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertAlmostEqual(round(0.75, 1), 0.8) 773ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertAlmostEqual(round(-0.25, 1), -0.3) 774ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertAlmostEqual(round(-0.75, 1), -0.8) 775ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 776ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(-6.5, 0), -7.0) 777ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(-5.5, 0), -6.0) 778ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(-1.5, 0), -2.0) 779ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(-0.5, 0), -1.0) 780ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(0.5, 0), 1.0) 781ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(1.5, 0), 2.0) 782ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(2.5, 0), 3.0) 783ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(3.5, 0), 4.0) 784ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(4.5, 0), 5.0) 785ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(5.5, 0), 6.0) 786ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(6.5, 0), 7.0) 787ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 788ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # same but without an explicit second argument; in 3.x these 789ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # will give integers 790ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(-6.5), -7.0) 791ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(-5.5), -6.0) 792ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(-1.5), -2.0) 793ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(-0.5), -1.0) 794ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(0.5), 1.0) 795ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(1.5), 2.0) 796ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(2.5), 3.0) 797ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(3.5), 4.0) 798ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(4.5), 5.0) 799ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(5.5), 6.0) 800ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(6.5), 7.0) 801ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 802ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(-25.0, -1), -30.0) 803ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(-15.0, -1), -20.0) 804ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(-5.0, -1), -10.0) 805ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(5.0, -1), 10.0) 806ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(15.0, -1), 20.0) 807ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(25.0, -1), 30.0) 808ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(35.0, -1), 40.0) 809ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(45.0, -1), 50.0) 810ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(55.0, -1), 60.0) 811ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(65.0, -1), 70.0) 812ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(75.0, -1), 80.0) 813ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(85.0, -1), 90.0) 814ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(95.0, -1), 100.0) 815ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(12325.0, -1), 12330.0) 816ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 817ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(350.0, -2), 400.0) 818ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(round(450.0, -2), 500.0) 819ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 820ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertAlmostEqual(round(0.5e21, -21), 1e21) 821ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertAlmostEqual(round(1.5e21, -21), 2e21) 822ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertAlmostEqual(round(2.5e21, -21), 3e21) 823ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertAlmostEqual(round(5.5e21, -21), 6e21) 824ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertAlmostEqual(round(8.5e21, -21), 9e21) 825ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 826ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertAlmostEqual(round(-1.5e22, -22), -2e22) 827ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertAlmostEqual(round(-0.5e22, -22), -1e22) 828ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertAlmostEqual(round(0.5e22, -22), 1e22) 829ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertAlmostEqual(round(1.5e22, -22), 2e22) 830ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 831ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 832ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh @requires_IEEE_754 833ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_format_specials(self): 834ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Test formatting of nans and infs. 835ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 836ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test(fmt, value, expected): 837ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Test with both % and format(). 838ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(fmt % value, expected, fmt) 839ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if not '#' in fmt: 840ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Until issue 7094 is implemented, format() for floats doesn't 841ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # support '#' formatting 842ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fmt = fmt[1:] # strip off the % 843ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(format(value, fmt), expected, fmt) 844ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 845ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for fmt in ['%e', '%f', '%g', '%.0e', '%.6f', '%.20g', 846ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '%#e', '%#f', '%#g', '%#.20e', '%#.15f', '%#.3g']: 847ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh pfmt = '%+' + fmt[1:] 848ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh sfmt = '% ' + fmt[1:] 849ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh test(fmt, INF, 'inf') 850ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh test(fmt, -INF, '-inf') 851ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh test(fmt, NAN, 'nan') 852ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh test(fmt, -NAN, 'nan') 853ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # When asking for a sign, it's always provided. nans are 854ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # always positive. 855ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh test(pfmt, INF, '+inf') 856ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh test(pfmt, -INF, '-inf') 857ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh test(pfmt, NAN, '+nan') 858ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh test(pfmt, -NAN, '+nan') 859ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # When using ' ' for a sign code, only infs can be negative. 860ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Others have a space. 861ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh test(sfmt, INF, ' inf') 862ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh test(sfmt, -INF, '-inf') 863ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh test(sfmt, NAN, ' nan') 864ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh test(sfmt, -NAN, ' nan') 865ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 866ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 867ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Beginning with Python 2.6 float has cross platform compatible 868ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ways to create and represent inf and nan 869ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass InfNanTest(unittest.TestCase): 870ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_inf_from_str(self): 871ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(isinf(float("inf"))) 872ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(isinf(float("+inf"))) 873ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(isinf(float("-inf"))) 874ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(isinf(float("infinity"))) 875ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(isinf(float("+infinity"))) 876ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(isinf(float("-infinity"))) 877ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 878ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(repr(float("inf")), "inf") 879ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(repr(float("+inf")), "inf") 880ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(repr(float("-inf")), "-inf") 881ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(repr(float("infinity")), "inf") 882ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(repr(float("+infinity")), "inf") 883ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(repr(float("-infinity")), "-inf") 884ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 885ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(repr(float("INF")), "inf") 886ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(repr(float("+Inf")), "inf") 887ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(repr(float("-iNF")), "-inf") 888ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(repr(float("Infinity")), "inf") 889ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(repr(float("+iNfInItY")), "inf") 890ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(repr(float("-INFINITY")), "-inf") 891ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 892ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(str(float("inf")), "inf") 893ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(str(float("+inf")), "inf") 894ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(str(float("-inf")), "-inf") 895ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(str(float("infinity")), "inf") 896ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(str(float("+infinity")), "inf") 897ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(str(float("-infinity")), "-inf") 898ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 899ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, float, "info") 900ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, float, "+info") 901ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, float, "-info") 902ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, float, "in") 903ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, float, "+in") 904ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, float, "-in") 905ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, float, "infinit") 906ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, float, "+Infin") 907ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, float, "-INFI") 908ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, float, "infinitys") 909ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 910ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_inf_as_str(self): 911ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(repr(1e300 * 1e300), "inf") 912ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(repr(-1e300 * 1e300), "-inf") 913ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 914ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(str(1e300 * 1e300), "inf") 915ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(str(-1e300 * 1e300), "-inf") 916ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 917ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_nan_from_str(self): 918ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(isnan(float("nan"))) 919ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(isnan(float("+nan"))) 920ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(isnan(float("-nan"))) 921ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 922ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(repr(float("nan")), "nan") 923ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(repr(float("+nan")), "nan") 924ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(repr(float("-nan")), "nan") 925ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 926ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(repr(float("NAN")), "nan") 927ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(repr(float("+NAn")), "nan") 928ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(repr(float("-NaN")), "nan") 929ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 930ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(str(float("nan")), "nan") 931ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(str(float("+nan")), "nan") 932ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(str(float("-nan")), "nan") 933ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 934ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, float, "nana") 935ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, float, "+nana") 936ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, float, "-nana") 937ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, float, "na") 938ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, float, "+na") 939ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(ValueError, float, "-na") 940ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 941ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_nan_as_str(self): 942ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(repr(1e300 * 1e300 * 0), "nan") 943ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(repr(-1e300 * 1e300 * 0), "nan") 944ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 945ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(str(1e300 * 1e300 * 0), "nan") 946ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(str(-1e300 * 1e300 * 0), "nan") 947ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 948ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def notest_float_nan(self): 949ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(NAN.is_nan()) 950ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertFalse(INF.is_nan()) 951ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertFalse((0.).is_nan()) 952ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 953ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def notest_float_inf(self): 954ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertTrue(INF.is_inf()) 955ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertFalse(NAN.is_inf()) 956ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertFalse((0.).is_inf()) 957ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 958ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_hash_inf(self): 959ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # the actual values here should be regarded as an 960ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # implementation detail, but they need to be 961ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # identical to those used in the Decimal module. 962ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(hash(float('inf')), 314159) 963ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(hash(float('-inf')), -271828) 964ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(hash(float('nan')), 0) 965ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 966ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 967ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehfromHex = float.fromhex 968ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehtoHex = float.hex 969ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass HexFloatTestCase(unittest.TestCase): 970ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh MAX = fromHex('0x.fffffffffffff8p+1024') # max normal 971ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh MIN = fromHex('0x1p-1022') # min normal 972ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh TINY = fromHex('0x0.0000000000001p-1022') # min subnormal 973ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh EPS = fromHex('0x0.0000000000001p0') # diff between 1.0 and next float up 974ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 975ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def identical(self, x, y): 976ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # check that floats x and y are identical, or that both 977ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # are NaNs 978ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if isnan(x) or isnan(y): 979ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if isnan(x) == isnan(y): 980ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return 981ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh elif x == y and (x != 0.0 or copysign(1.0, x) == copysign(1.0, y)): 982ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return 983ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.fail('%r not identical to %r' % (x, y)) 984ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 985ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_ends(self): 986ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(self.MIN, ldexp(1.0, -1022)) 987ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(self.TINY, ldexp(1.0, -1074)) 988ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(self.EPS, ldexp(1.0, -52)) 989ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(self.MAX, 2.*(ldexp(1.0, 1023) - ldexp(1.0, 970))) 990ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 991ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_invalid_inputs(self): 992ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh invalid_inputs = [ 993ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'infi', # misspelt infinities and nans 994ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '-Infinit', 995ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '++inf', 996ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '-+Inf', 997ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '--nan', 998ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '+-NaN', 999ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'snan', 1000ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'NaNs', 1001ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'nna', 1002ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'an', 1003ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'nf', 1004ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'nfinity', 1005ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'inity', 1006ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'iinity', 1007ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '0xnan', 1008ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '', 1009ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ' ', 1010ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'x1.0p0', 1011ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '0xX1.0p0', 1012ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '+ 0x1.0p0', # internal whitespace 1013ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '- 0x1.0p0', 1014ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '0 x1.0p0', 1015ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '0x 1.0p0', 1016ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '0x1 2.0p0', 1017ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '+0x1 .0p0', 1018ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '0x1. 0p0', 1019ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '-0x1.0 1p0', 1020ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '-0x1.0 p0', 1021ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '+0x1.0p +0', 1022ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '0x1.0p -0', 1023ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '0x1.0p 0', 1024ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '+0x1.0p+ 0', 1025ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '-0x1.0p- 0', 1026ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '++0x1.0p-0', # double signs 1027ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '--0x1.0p0', 1028ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '+-0x1.0p+0', 1029ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '-+0x1.0p0', 1030ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '0x1.0p++0', 1031ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '+0x1.0p+-0', 1032ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '-0x1.0p-+0', 1033ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '0x1.0p--0', 1034ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '0x1.0.p0', 1035ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '0x.p0', # no hex digits before or after point 1036ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '0x1,p0', # wrong decimal point character 1037ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '0x1pa', 1038ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh u'0x1p\uff10', # fullwidth Unicode digits 1039ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh u'\uff10x1p0', 1040ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh u'0x\uff11p0', 1041ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh u'0x1.\uff10p0', 1042ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '0x1p0 \n 0x2p0', 1043ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '0x1p0\0 0x1p0', # embedded null byte is not end of string 1044ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ] 1045ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for x in invalid_inputs: 1046ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 1047ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh result = fromHex(x) 1048ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except ValueError: 1049ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh pass 1050ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh else: 1051ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.fail('Expected float.fromhex(%r) to raise ValueError; ' 1052ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'got %r instead' % (x, result)) 1053ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1054ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1055ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_whitespace(self): 1056ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh value_pairs = [ 1057ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('inf', INF), 1058ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('-Infinity', -INF), 1059ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('nan', NAN), 1060ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('1.0', 1.0), 1061ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('-0x.2', -0.125), 1062ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ('-0.0', -0.0) 1063ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ] 1064ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh whitespace = [ 1065ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '', 1066ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ' ', 1067ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '\t', 1068ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '\n', 1069ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '\n \t', 1070ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '\f', 1071ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '\v', 1072ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh '\r' 1073ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ] 1074ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for inp, expected in value_pairs: 1075ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for lead in whitespace: 1076ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for trail in whitespace: 1077ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh got = fromHex(lead + inp + trail) 1078ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(got, expected) 1079ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1080ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1081ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_from_hex(self): 1082ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh MIN = self.MIN; 1083ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh MAX = self.MAX; 1084ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh TINY = self.TINY; 1085ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh EPS = self.EPS; 1086ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1087ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # two spellings of infinity, with optional signs; case-insensitive 1088ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('inf'), INF) 1089ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('+Inf'), INF) 1090ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('-INF'), -INF) 1091ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('iNf'), INF) 1092ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('Infinity'), INF) 1093ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('+INFINITY'), INF) 1094ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('-infinity'), -INF) 1095ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('-iNFiNitY'), -INF) 1096ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1097ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # nans with optional sign; case insensitive 1098ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('nan'), NAN) 1099ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('+NaN'), NAN) 1100ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('-NaN'), NAN) 1101ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('-nAN'), NAN) 1102ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1103ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # variations in input format 1104ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('1'), 1.0) 1105ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('+1'), 1.0) 1106ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('1.'), 1.0) 1107ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('1.0'), 1.0) 1108ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('1.0p0'), 1.0) 1109ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('01'), 1.0) 1110ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('01.'), 1.0) 1111ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1'), 1.0) 1112ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.'), 1.0) 1113ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.0'), 1.0) 1114ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('+0x1.0'), 1.0) 1115ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1p0'), 1.0) 1116ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0X1p0'), 1.0) 1117ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0X1P0'), 1.0) 1118ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1P0'), 1.0) 1119ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.p0'), 1.0) 1120ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.0p0'), 1.0) 1121ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x.1p4'), 1.0) 1122ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x.1p04'), 1.0) 1123ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x.1p004'), 1.0) 1124ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1p+0'), 1.0) 1125ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1P-0'), 1.0) 1126ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('+0x1p0'), 1.0) 1127ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x01p0'), 1.0) 1128ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1p00'), 1.0) 1129ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex(u'0x1p0'), 1.0) 1130ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex(' 0x1p0 '), 1.0) 1131ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('\n 0x1p0'), 1.0) 1132ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1p0 \t'), 1.0) 1133ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0xap0'), 10.0) 1134ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0xAp0'), 10.0) 1135ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0xaP0'), 10.0) 1136ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0xAP0'), 10.0) 1137ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0xbep0'), 190.0) 1138ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0xBep0'), 190.0) 1139ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0xbEp0'), 190.0) 1140ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0XBE0P-4'), 190.0) 1141ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0xBEp0'), 190.0) 1142ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0xB.Ep4'), 190.0) 1143ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x.BEp8'), 190.0) 1144ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x.0BEp12'), 190.0) 1145ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1146ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # moving the point around 1147ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh pi = fromHex('0x1.921fb54442d18p1') 1148ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x.006487ed5110b46p11'), pi) 1149ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x.00c90fdaa22168cp10'), pi) 1150ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x.01921fb54442d18p9'), pi) 1151ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x.03243f6a8885a3p8'), pi) 1152ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x.06487ed5110b46p7'), pi) 1153ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x.0c90fdaa22168cp6'), pi) 1154ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x.1921fb54442d18p5'), pi) 1155ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x.3243f6a8885a3p4'), pi) 1156ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x.6487ed5110b46p3'), pi) 1157ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x.c90fdaa22168cp2'), pi) 1158ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.921fb54442d18p1'), pi) 1159ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x3.243f6a8885a3p0'), pi) 1160ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x6.487ed5110b46p-1'), pi) 1161ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0xc.90fdaa22168cp-2'), pi) 1162ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x19.21fb54442d18p-3'), pi) 1163ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x32.43f6a8885a3p-4'), pi) 1164ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x64.87ed5110b46p-5'), pi) 1165ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0xc9.0fdaa22168cp-6'), pi) 1166ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x192.1fb54442d18p-7'), pi) 1167ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x324.3f6a8885a3p-8'), pi) 1168ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x648.7ed5110b46p-9'), pi) 1169ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0xc90.fdaa22168cp-10'), pi) 1170ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1921.fb54442d18p-11'), pi) 1171ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # ... 1172ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1921fb54442d1.8p-47'), pi) 1173ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x3243f6a8885a3p-48'), pi) 1174ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x6487ed5110b46p-49'), pi) 1175ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0xc90fdaa22168cp-50'), pi) 1176ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1921fb54442d18p-51'), pi) 1177ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x3243f6a8885a30p-52'), pi) 1178ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x6487ed5110b460p-53'), pi) 1179ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0xc90fdaa22168c0p-54'), pi) 1180ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1921fb54442d180p-55'), pi) 1181ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1182ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1183ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # results that should overflow... 1184ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(OverflowError, fromHex, '-0x1p1024') 1185ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(OverflowError, fromHex, '0x1p+1025') 1186ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(OverflowError, fromHex, '+0X1p1030') 1187ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(OverflowError, fromHex, '-0x1p+1100') 1188ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(OverflowError, fromHex, '0X1p123456789123456789') 1189ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(OverflowError, fromHex, '+0X.8p+1025') 1190ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(OverflowError, fromHex, '+0x0.8p1025') 1191ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(OverflowError, fromHex, '-0x0.4p1026') 1192ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(OverflowError, fromHex, '0X2p+1023') 1193ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(OverflowError, fromHex, '0x2.p1023') 1194ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(OverflowError, fromHex, '-0x2.0p+1023') 1195ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(OverflowError, fromHex, '+0X4p+1022') 1196ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(OverflowError, fromHex, '0x1.ffffffffffffffp+1023') 1197ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(OverflowError, fromHex, '-0X1.fffffffffffff9p1023') 1198ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(OverflowError, fromHex, '0X1.fffffffffffff8p1023') 1199ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(OverflowError, fromHex, '+0x3.fffffffffffffp1022') 1200ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(OverflowError, fromHex, '0x3fffffffffffffp+970') 1201ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(OverflowError, fromHex, '0x10000000000000000p960') 1202ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertRaises(OverflowError, fromHex, '-0Xffffffffffffffffp960') 1203ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1204ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # ...and those that round to +-max float 1205ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('+0x1.fffffffffffffp+1023'), MAX) 1206ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('-0X1.fffffffffffff7p1023'), -MAX) 1207ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0X1.fffffffffffff7fffffffffffffp1023'), MAX) 1208ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1209ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # zeros 1210ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x0p0'), 0.0) 1211ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x0p1000'), 0.0) 1212ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('-0x0p1023'), -0.0) 1213ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0X0p1024'), 0.0) 1214ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('-0x0p1025'), -0.0) 1215ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0X0p2000'), 0.0) 1216ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x0p123456789123456789'), 0.0) 1217ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('-0X0p-0'), -0.0) 1218ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('-0X0p-1000'), -0.0) 1219ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x0p-1023'), 0.0) 1220ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('-0X0p-1024'), -0.0) 1221ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('-0x0p-1025'), -0.0) 1222ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('-0x0p-1072'), -0.0) 1223ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0X0p-1073'), 0.0) 1224ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('-0x0p-1074'), -0.0) 1225ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x0p-1075'), 0.0) 1226ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0X0p-1076'), 0.0) 1227ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('-0X0p-2000'), -0.0) 1228ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('-0x0p-123456789123456789'), -0.0) 1229ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1230ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # values that should underflow to 0 1231ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0X1p-1075'), 0.0) 1232ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('-0X1p-1075'), -0.0) 1233ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('-0x1p-123456789123456789'), -0.0) 1234ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.00000000000000001p-1075'), TINY) 1235ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('-0x1.1p-1075'), -TINY) 1236ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.fffffffffffffffffp-1075'), TINY) 1237ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1238ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # check round-half-even is working correctly near 0 ... 1239ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1p-1076'), 0.0) 1240ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0X2p-1076'), 0.0) 1241ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0X3p-1076'), TINY) 1242ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x4p-1076'), TINY) 1243ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0X5p-1076'), TINY) 1244ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0X6p-1076'), 2*TINY) 1245ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x7p-1076'), 2*TINY) 1246ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0X8p-1076'), 2*TINY) 1247ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0X9p-1076'), 2*TINY) 1248ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0xap-1076'), 2*TINY) 1249ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0Xbp-1076'), 3*TINY) 1250ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0xcp-1076'), 3*TINY) 1251ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0Xdp-1076'), 3*TINY) 1252ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0Xep-1076'), 4*TINY) 1253ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0xfp-1076'), 4*TINY) 1254ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x10p-1076'), 4*TINY) 1255ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('-0x1p-1076'), -0.0) 1256ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('-0X2p-1076'), -0.0) 1257ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('-0x3p-1076'), -TINY) 1258ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('-0X4p-1076'), -TINY) 1259ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('-0x5p-1076'), -TINY) 1260ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('-0x6p-1076'), -2*TINY) 1261ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('-0X7p-1076'), -2*TINY) 1262ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('-0X8p-1076'), -2*TINY) 1263ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('-0X9p-1076'), -2*TINY) 1264ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('-0Xap-1076'), -2*TINY) 1265ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('-0xbp-1076'), -3*TINY) 1266ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('-0xcp-1076'), -3*TINY) 1267ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('-0Xdp-1076'), -3*TINY) 1268ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('-0xep-1076'), -4*TINY) 1269ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('-0Xfp-1076'), -4*TINY) 1270ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('-0X10p-1076'), -4*TINY) 1271ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1272ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # ... and near MIN ... 1273ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x0.ffffffffffffd6p-1022'), MIN-3*TINY) 1274ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x0.ffffffffffffd8p-1022'), MIN-2*TINY) 1275ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x0.ffffffffffffdap-1022'), MIN-2*TINY) 1276ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x0.ffffffffffffdcp-1022'), MIN-2*TINY) 1277ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x0.ffffffffffffdep-1022'), MIN-2*TINY) 1278ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x0.ffffffffffffe0p-1022'), MIN-2*TINY) 1279ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x0.ffffffffffffe2p-1022'), MIN-2*TINY) 1280ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x0.ffffffffffffe4p-1022'), MIN-2*TINY) 1281ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x0.ffffffffffffe6p-1022'), MIN-2*TINY) 1282ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x0.ffffffffffffe8p-1022'), MIN-2*TINY) 1283ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x0.ffffffffffffeap-1022'), MIN-TINY) 1284ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x0.ffffffffffffecp-1022'), MIN-TINY) 1285ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x0.ffffffffffffeep-1022'), MIN-TINY) 1286ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x0.fffffffffffff0p-1022'), MIN-TINY) 1287ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x0.fffffffffffff2p-1022'), MIN-TINY) 1288ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x0.fffffffffffff4p-1022'), MIN-TINY) 1289ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x0.fffffffffffff6p-1022'), MIN-TINY) 1290ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x0.fffffffffffff8p-1022'), MIN) 1291ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x0.fffffffffffffap-1022'), MIN) 1292ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x0.fffffffffffffcp-1022'), MIN) 1293ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x0.fffffffffffffep-1022'), MIN) 1294ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.00000000000000p-1022'), MIN) 1295ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.00000000000002p-1022'), MIN) 1296ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.00000000000004p-1022'), MIN) 1297ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.00000000000006p-1022'), MIN) 1298ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.00000000000008p-1022'), MIN) 1299ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.0000000000000ap-1022'), MIN+TINY) 1300ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.0000000000000cp-1022'), MIN+TINY) 1301ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.0000000000000ep-1022'), MIN+TINY) 1302ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.00000000000010p-1022'), MIN+TINY) 1303ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.00000000000012p-1022'), MIN+TINY) 1304ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.00000000000014p-1022'), MIN+TINY) 1305ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.00000000000016p-1022'), MIN+TINY) 1306ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.00000000000018p-1022'), MIN+2*TINY) 1307ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1308ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # ... and near 1.0. 1309ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x0.fffffffffffff0p0'), 1.0-EPS) 1310ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x0.fffffffffffff1p0'), 1.0-EPS) 1311ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0X0.fffffffffffff2p0'), 1.0-EPS) 1312ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x0.fffffffffffff3p0'), 1.0-EPS) 1313ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0X0.fffffffffffff4p0'), 1.0-EPS) 1314ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0X0.fffffffffffff5p0'), 1.0-EPS/2) 1315ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0X0.fffffffffffff6p0'), 1.0-EPS/2) 1316ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x0.fffffffffffff7p0'), 1.0-EPS/2) 1317ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x0.fffffffffffff8p0'), 1.0-EPS/2) 1318ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0X0.fffffffffffff9p0'), 1.0-EPS/2) 1319ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0X0.fffffffffffffap0'), 1.0-EPS/2) 1320ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x0.fffffffffffffbp0'), 1.0-EPS/2) 1321ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0X0.fffffffffffffcp0'), 1.0) 1322ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x0.fffffffffffffdp0'), 1.0) 1323ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0X0.fffffffffffffep0'), 1.0) 1324ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x0.ffffffffffffffp0'), 1.0) 1325ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0X1.00000000000000p0'), 1.0) 1326ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0X1.00000000000001p0'), 1.0) 1327ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.00000000000002p0'), 1.0) 1328ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0X1.00000000000003p0'), 1.0) 1329ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.00000000000004p0'), 1.0) 1330ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0X1.00000000000005p0'), 1.0) 1331ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0X1.00000000000006p0'), 1.0) 1332ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0X1.00000000000007p0'), 1.0) 1333ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.00000000000007ffffffffffffffffffffp0'), 1334ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1.0) 1335ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.00000000000008p0'), 1.0) 1336ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.00000000000008000000000000000001p0'), 1337ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1+EPS) 1338ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0X1.00000000000009p0'), 1.0+EPS) 1339ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.0000000000000ap0'), 1.0+EPS) 1340ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.0000000000000bp0'), 1.0+EPS) 1341ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0X1.0000000000000cp0'), 1.0+EPS) 1342ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.0000000000000dp0'), 1.0+EPS) 1343ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.0000000000000ep0'), 1.0+EPS) 1344ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0X1.0000000000000fp0'), 1.0+EPS) 1345ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.00000000000010p0'), 1.0+EPS) 1346ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0X1.00000000000011p0'), 1.0+EPS) 1347ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.00000000000012p0'), 1.0+EPS) 1348ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0X1.00000000000013p0'), 1.0+EPS) 1349ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0X1.00000000000014p0'), 1.0+EPS) 1350ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.00000000000015p0'), 1.0+EPS) 1351ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.00000000000016p0'), 1.0+EPS) 1352ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0X1.00000000000017p0'), 1.0+EPS) 1353ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.00000000000017ffffffffffffffffffffp0'), 1354ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1.0+EPS) 1355ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.00000000000018p0'), 1.0+2*EPS) 1356ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0X1.00000000000018000000000000000001p0'), 1357ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1.0+2*EPS) 1358ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.00000000000019p0'), 1.0+2*EPS) 1359ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0X1.0000000000001ap0'), 1.0+2*EPS) 1360ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0X1.0000000000001bp0'), 1.0+2*EPS) 1361ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.0000000000001cp0'), 1.0+2*EPS) 1362ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.0000000000001dp0'), 1.0+2*EPS) 1363ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.0000000000001ep0'), 1.0+2*EPS) 1364ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0X1.0000000000001fp0'), 1.0+2*EPS) 1365ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(fromHex('0x1.00000000000020p0'), 1.0+2*EPS) 1366ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1367ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_roundtrip(self): 1368ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def roundtrip(x): 1369ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return fromHex(toHex(x)) 1370ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1371ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for x in [NAN, INF, self.MAX, self.MIN, self.MIN-self.TINY, self.TINY, 0.0]: 1372ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(x, roundtrip(x)) 1373ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(-x, roundtrip(-x)) 1374ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1375ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # fromHex(toHex(x)) should exactly recover x, for any non-NaN float x. 1376ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh import random 1377ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh for i in xrange(10000): 1378ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh e = random.randrange(-1200, 1200) 1379ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh m = random.random() 1380ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh s = random.choice([1.0, -1.0]) 1381ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 1382ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh x = s*ldexp(m, e) 1383ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except OverflowError: 1384ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh pass 1385ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh else: 1386ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.identical(x, fromHex(toHex(x))) 1387ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1388ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1389ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef test_main(): 1390ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh test_support.run_unittest( 1391ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh GeneralFloatCases, 1392ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh FormatFunctionsTestCase, 1393ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh UnknownFormatTestCase, 1394ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh IEEEFormatTestCase, 1395ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ReprTestCase, 1396ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh RoundTestCase, 1397ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh InfNanTest, 1398ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh HexFloatTestCase, 1399ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ) 1400ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 1401ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehif __name__ == '__main__': 1402ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh test_main() 1403