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