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