2 from test
import test_support
8 # Used for lazy formatting of failure messages
10 def __init__(self
, format
, *args
):
15 return self
.format
% self
.args
17 # SHIFT should match the value in longintrepr.h for best testing.
18 SHIFT
= sys
.long_info
.bits_per_digit
21 KARATSUBA_CUTOFF
= 70 # from longobject.c
23 # Max number of base BASE digits to use in test cases. Doubling
24 # this will more than double the runtime.
27 # build some special values
28 special
= map(long, [0, 1, 2, BASE
, BASE
>> 1])
29 special
.append(0x5555555555555555L
)
30 special
.append(0xaaaaaaaaaaaaaaaaL
)
31 # some solid strings of one bits
32 p2
= 4L # 0 and 1 already added
33 for i
in range(2*SHIFT
):
34 special
.append(p2
- 1)
37 # add complements & negations
38 special
= special
+ map(lambda x
: ~x
, special
) + \
39 map(lambda x
: -x
, special
)
51 (' \t\t 314 \t\t ', 314),
52 (repr(sys
.maxint
), sys
.maxint
),
55 (' 1\02 ', ValueError),
58 (' \t\t ', ValueError)
60 if test_support
.have_unicode
:
67 (unicode('100'), 100),
68 (unicode('314'), 314),
69 (unicode(' 314'), 314),
70 (unicode('\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
71 (unicode(' \t\t 314 \t\t '), 314),
72 (unicode(' 1x'), ValueError),
74 (unicode(' 1\02 '), ValueError),
75 (unicode(''), ValueError),
76 (unicode(' '), ValueError),
77 (unicode(' \t\t '), ValueError),
78 (unichr(0x200), ValueError),
82 class LongTest(unittest
.TestCase
):
84 # Get quasi-random long consisting of ndigits digits (in base BASE).
85 # quasi == the most-significant digit will not be 0, and the number
86 # is constructed to contain long strings of 0 and 1 bits. These are
87 # more likely than random bits to provoke digit-boundary errors.
88 # The sign of the number is also random.
90 def getran(self
, ndigits
):
91 self
.assertTrue(ndigits
> 0)
92 nbits_hi
= ndigits
* SHIFT
93 nbits_lo
= nbits_hi
- SHIFT
+ 1
96 r
= int(random
.random() * (SHIFT
* 2)) |
1 # force 1 bits to start
97 while nbits
< nbits_lo
:
99 bits
= min(bits
, nbits_hi
- nbits
)
100 self
.assertTrue(1 <= bits
<= SHIFT
)
102 answer
= answer
<< bits
104 answer
= answer |
((1 << bits
) - 1)
105 r
= int(random
.random() * (SHIFT
* 2))
106 self
.assertTrue(nbits_lo
<= nbits
<= nbits_hi
)
107 if random
.random() < 0.5:
111 # Get random long consisting of ndigits random digits (relative to base
112 # BASE). The sign bit is also random.
114 def getran2(ndigits
):
116 for i
in xrange(ndigits
):
117 answer
= (answer
<< SHIFT
) | random
.randint(0, MASK
)
118 if random
.random() < 0.5:
122 def check_division(self
, x
, y
):
123 eq
= self
.assertEqual
127 eq(pab
, pba
, Frm("multiplication does not commute for %r and %r", x
, y
))
128 eq(q
, q2
, Frm("divmod returns different quotient than / for %r and %r", x
, y
))
129 eq(r
, r2
, Frm("divmod returns different mod than %% for %r and %r", x
, y
))
130 eq(x
, q
*y
+ r
, Frm("x != q*y + r after divmod on x=%r, y=%r", x
, y
))
132 self
.assertTrue(0 <= r
< y
, Frm("bad mod from divmod on %r and %r", x
, y
))
134 self
.assertTrue(y
< r
<= 0, Frm("bad mod from divmod on %r and %r", x
, y
))
136 def test_division(self
):
137 digits
= range(1, MAXDIGITS
+1) + range(KARATSUBA_CUTOFF
,
138 KARATSUBA_CUTOFF
+ 14)
139 digits
.append(KARATSUBA_CUTOFF
* 3)
141 x
= self
.getran(lenx
)
143 y
= self
.getran(leny
) or 1L
144 self
.check_division(x
, y
)
146 # specific numbers chosen to exercise corner cases of the
147 # current long division implementation
149 # 30-bit cases involving a quotient digit estimate of BASE+1
150 self
.check_division(1231948412290879395966702881L,
151 1147341367131428698L)
152 self
.check_division(815427756481275430342312021515587883L,
154 self
.check_division(627976073697012820849443363563599041L,
156 self
.check_division(1115141373653752303710932756325578065L,
157 1038556335171453937726882627L)
158 # 30-bit cases that require the post-subtraction correction step
159 self
.check_division(922498905405436751940989320930368494L,
160 949985870686786135626943396L)
161 self
.check_division(768235853328091167204009652174031844L,
162 1091555541180371554426545266L)
164 # 15-bit cases involving a quotient digit estimate of BASE+1
165 self
.check_division(20172188947443L, 615611397L)
166 self
.check_division(1020908530270155025L, 950795710L)
167 self
.check_division(128589565723112408L, 736393718L)
168 self
.check_division(609919780285761575L, 18613274546784L)
169 # 15-bit cases that require the post-subtraction correction step
170 self
.check_division(710031681576388032L, 26769404391308L)
171 self
.check_division(1933622614268221L, 30212853348836L)
175 def test_karatsuba(self
):
176 digits
= range(1, 5) + range(KARATSUBA_CUTOFF
, KARATSUBA_CUTOFF
+ 10)
177 digits
.extend([KARATSUBA_CUTOFF
* 10, KARATSUBA_CUTOFF
* 100])
179 bits
= [digit
* SHIFT
for digit
in digits
]
181 # Test products of long strings of 1 bits -- (2**x-1)*(2**y-1) ==
182 # 2**(x+y) - 2**x - 2**y + 1, so the proper result is easy to check.
184 a
= (1L << abits
) - 1
188 b
= (1L << bbits
) - 1
190 y
= ((1L << (abits
+ bbits
)) -
194 self
.assertEqual(x
, y
,
195 Frm("bad result for a*b: a=%r, b=%r, x=%r, y=%r", a
, b
, x
, y
))
197 def check_bitop_identities_1(self
, x
):
198 eq
= self
.assertEqual
199 eq(x
& 0, 0, Frm("x & 0 != 0 for x=%r", x
))
200 eq(x |
0, x
, Frm("x | 0 != x for x=%r", x
))
201 eq(x ^
0, x
, Frm("x ^ 0 != x for x=%r", x
))
202 eq(x
& -1, x
, Frm("x & -1 != x for x=%r", x
))
203 eq(x |
-1, -1, Frm("x | -1 != -1 for x=%r", x
))
204 eq(x ^
-1, ~x
, Frm("x ^ -1 != ~x for x=%r", x
))
205 eq(x
, ~~x
, Frm("x != ~~x for x=%r", x
))
206 eq(x
& x
, x
, Frm("x & x != x for x=%r", x
))
207 eq(x | x
, x
, Frm("x | x != x for x=%r", x
))
208 eq(x ^ x
, 0, Frm("x ^ x != 0 for x=%r", x
))
209 eq(x
& ~x
, 0, Frm("x & ~x != 0 for x=%r", x
))
210 eq(x | ~x
, -1, Frm("x | ~x != -1 for x=%r", x
))
211 eq(x ^ ~x
, -1, Frm("x ^ ~x != -1 for x=%r", x
))
212 eq(-x
, 1 + ~x
, Frm("not -x == 1 + ~x for x=%r", x
))
213 eq(-x
, ~
(x
-1), Frm("not -x == ~(x-1) forx =%r", x
))
214 for n
in xrange(2*SHIFT
):
217 Frm("x << n >> n != x for x=%r, n=%r", (x
, n
)))
219 Frm("x // p2 != x >> n for x=%r n=%r p2=%r", (x
, n
, p2
)))
221 Frm("x * p2 != x << n for x=%r n=%r p2=%r", (x
, n
, p2
)))
222 eq(x
& -p2
, x
>> n
<< n
,
223 Frm("not x & -p2 == x >> n << n for x=%r n=%r p2=%r", (x
, n
, p2
)))
224 eq(x
& -p2
, x
& ~
(p2
- 1),
225 Frm("not x & -p2 == x & ~(p2 - 1) for x=%r n=%r p2=%r", (x
, n
, p2
)))
227 def check_bitop_identities_2(self
, x
, y
):
228 eq
= self
.assertEqual
229 eq(x
& y
, y
& x
, Frm("x & y != y & x for x=%r, y=%r", (x
, y
)))
230 eq(x | y
, y | x
, Frm("x | y != y | x for x=%r, y=%r", (x
, y
)))
231 eq(x ^ y
, y ^ x
, Frm("x ^ y != y ^ x for x=%r, y=%r", (x
, y
)))
232 eq(x ^ y ^ x
, y
, Frm("x ^ y ^ x != y for x=%r, y=%r", (x
, y
)))
233 eq(x
& y
, ~
(~x | ~y
), Frm("x & y != ~(~x | ~y) for x=%r, y=%r", (x
, y
)))
234 eq(x | y
, ~
(~x
& ~y
), Frm("x | y != ~(~x & ~y) for x=%r, y=%r", (x
, y
)))
235 eq(x ^ y
, (x | y
) & ~
(x
& y
),
236 Frm("x ^ y != (x | y) & ~(x & y) for x=%r, y=%r", (x
, y
)))
237 eq(x ^ y
, (x
& ~y
) |
(~x
& y
),
238 Frm("x ^ y == (x & ~y) | (~x & y) for x=%r, y=%r", (x
, y
)))
239 eq(x ^ y
, (x | y
) & (~x | ~y
),
240 Frm("x ^ y == (x | y) & (~x | ~y) for x=%r, y=%r", (x
, y
)))
242 def check_bitop_identities_3(self
, x
, y
, z
):
243 eq
= self
.assertEqual
244 eq((x
& y
) & z
, x
& (y
& z
),
245 Frm("(x & y) & z != x & (y & z) for x=%r, y=%r, z=%r", (x
, y
, z
)))
246 eq((x | y
) | z
, x |
(y | z
),
247 Frm("(x | y) | z != x | (y | z) for x=%r, y=%r, z=%r", (x
, y
, z
)))
248 eq((x ^ y
) ^ z
, x ^
(y ^ z
),
249 Frm("(x ^ y) ^ z != x ^ (y ^ z) for x=%r, y=%r, z=%r", (x
, y
, z
)))
250 eq(x
& (y | z
), (x
& y
) |
(x
& z
),
251 Frm("x & (y | z) != (x & y) | (x & z) for x=%r, y=%r, z=%r", (x
, y
, z
)))
252 eq(x |
(y
& z
), (x | y
) & (x | z
),
253 Frm("x | (y & z) != (x | y) & (x | z) for x=%r, y=%r, z=%r", (x
, y
, z
)))
255 def test_bitop_identities(self
):
257 self
.check_bitop_identities_1(x
)
258 digits
= xrange(1, MAXDIGITS
+1)
260 x
= self
.getran(lenx
)
261 self
.check_bitop_identities_1(x
)
263 y
= self
.getran(leny
)
264 self
.check_bitop_identities_2(x
, y
)
265 self
.check_bitop_identities_3(x
, y
, self
.getran((lenx
+ leny
)//2))
267 def slow_format(self
, x
, base
):
268 if (x
, base
) == (0, 8):
269 # this is an oddball!
276 x
, r
= divmod(x
, base
)
277 digits
.append(int(r
))
279 digits
= digits
or [0]
280 return '-'[:sign
] + \
281 {8: '0', 10: '', 16: '0x'}[base
] + \
282 "".join(map(lambda i
: "0123456789abcdef"[i
], digits
)) + "L"
284 def check_format_1(self
, x
):
285 for base
, mapper
in (8, oct), (10, repr), (16, hex):
287 expected
= self
.slow_format(x
, base
)
288 msg
= Frm("%s returned %r but expected %r for %r",
289 mapper
.__name
__, got
, expected
, x
)
290 self
.assertEqual(got
, expected
, msg
)
291 self
.assertEqual(long(got
, 0), x
, Frm('long("%s", 0) != %r', got
, x
))
292 # str() has to be checked a little differently since there's no
295 expected
= self
.slow_format(x
, 10)[:-1]
296 msg
= Frm("%s returned %r but expected %r for %r",
297 mapper
.__name
__, got
, expected
, x
)
298 self
.assertEqual(got
, expected
, msg
)
300 def test_format(self
):
302 self
.check_format_1(x
)
304 for lenx
in xrange(1, MAXDIGITS
+1):
305 x
= self
.getran(lenx
)
306 self
.check_format_1(x
)
309 self
.assertEqual(long(314), 314L)
310 self
.assertEqual(long(3.14), 3L)
311 self
.assertEqual(long(314L), 314L)
312 # Check that long() of basic types actually returns a long
313 self
.assertEqual(type(long(314)), long)
314 self
.assertEqual(type(long(3.14)), long)
315 self
.assertEqual(type(long(314L)), long)
316 # Check that conversion from float truncates towards zero
317 self
.assertEqual(long(-3.14), -3L)
318 self
.assertEqual(long(3.9), 3L)
319 self
.assertEqual(long(-3.9), -3L)
320 self
.assertEqual(long(3.5), 3L)
321 self
.assertEqual(long(-3.5), -3L)
322 self
.assertEqual(long("-3"), -3L)
323 if test_support
.have_unicode
:
324 self
.assertEqual(long(unicode("-3")), -3L)
326 self
.assertEqual(long("10",16), 16L)
327 if test_support
.have_unicode
:
328 self
.assertEqual(long(unicode("10"),16), 16L)
329 # Check conversions from string (same test set as for int(), and then some)
331 ('1' + '0'*20, 10L**20),
332 ('1' + '0'*100, 10L**100)
335 if test_support
.have_unicode
:
337 (unicode('1') + unicode('0')*20, 10L**20),
338 (unicode('1') + unicode('0')*100, 10L**100),
341 for sign
in "", "+", "-":
342 for prefix
in "", " ", "\t", " \t\t ":
343 ss
= prefix
+ sign
+ s
345 if sign
== "-" and v
is not ValueError:
348 self
.assertEqual(long(ss
), long(vv
))
352 self
.assertRaises(ValueError, long, '123\0')
353 self
.assertRaises(ValueError, long, '53', 40)
354 self
.assertRaises(TypeError, long, 1, 12)
356 # SF patch #1638879: embedded NULs were not detected with
358 self
.assertRaises(ValueError, long, '123\0', 10)
359 self
.assertRaises(ValueError, long, '123\x00 245', 20)
361 self
.assertEqual(long('100000000000000000000000000000000', 2),
363 self
.assertEqual(long('102002022201221111211', 3), 4294967296)
364 self
.assertEqual(long('10000000000000000', 4), 4294967296)
365 self
.assertEqual(long('32244002423141', 5), 4294967296)
366 self
.assertEqual(long('1550104015504', 6), 4294967296)
367 self
.assertEqual(long('211301422354', 7), 4294967296)
368 self
.assertEqual(long('40000000000', 8), 4294967296)
369 self
.assertEqual(long('12068657454', 9), 4294967296)
370 self
.assertEqual(long('4294967296', 10), 4294967296)
371 self
.assertEqual(long('1904440554', 11), 4294967296)
372 self
.assertEqual(long('9ba461594', 12), 4294967296)
373 self
.assertEqual(long('535a79889', 13), 4294967296)
374 self
.assertEqual(long('2ca5b7464', 14), 4294967296)
375 self
.assertEqual(long('1a20dcd81', 15), 4294967296)
376 self
.assertEqual(long('100000000', 16), 4294967296)
377 self
.assertEqual(long('a7ffda91', 17), 4294967296)
378 self
.assertEqual(long('704he7g4', 18), 4294967296)
379 self
.assertEqual(long('4f5aff66', 19), 4294967296)
380 self
.assertEqual(long('3723ai4g', 20), 4294967296)
381 self
.assertEqual(long('281d55i4', 21), 4294967296)
382 self
.assertEqual(long('1fj8b184', 22), 4294967296)
383 self
.assertEqual(long('1606k7ic', 23), 4294967296)
384 self
.assertEqual(long('mb994ag', 24), 4294967296)
385 self
.assertEqual(long('hek2mgl', 25), 4294967296)
386 self
.assertEqual(long('dnchbnm', 26), 4294967296)
387 self
.assertEqual(long('b28jpdm', 27), 4294967296)
388 self
.assertEqual(long('8pfgih4', 28), 4294967296)
389 self
.assertEqual(long('76beigg', 29), 4294967296)
390 self
.assertEqual(long('5qmcpqg', 30), 4294967296)
391 self
.assertEqual(long('4q0jto4', 31), 4294967296)
392 self
.assertEqual(long('4000000', 32), 4294967296)
393 self
.assertEqual(long('3aokq94', 33), 4294967296)
394 self
.assertEqual(long('2qhxjli', 34), 4294967296)
395 self
.assertEqual(long('2br45qb', 35), 4294967296)
396 self
.assertEqual(long('1z141z4', 36), 4294967296)
398 self
.assertEqual(long('100000000000000000000000000000001', 2),
400 self
.assertEqual(long('102002022201221111212', 3), 4294967297)
401 self
.assertEqual(long('10000000000000001', 4), 4294967297)
402 self
.assertEqual(long('32244002423142', 5), 4294967297)
403 self
.assertEqual(long('1550104015505', 6), 4294967297)
404 self
.assertEqual(long('211301422355', 7), 4294967297)
405 self
.assertEqual(long('40000000001', 8), 4294967297)
406 self
.assertEqual(long('12068657455', 9), 4294967297)
407 self
.assertEqual(long('4294967297', 10), 4294967297)
408 self
.assertEqual(long('1904440555', 11), 4294967297)
409 self
.assertEqual(long('9ba461595', 12), 4294967297)
410 self
.assertEqual(long('535a7988a', 13), 4294967297)
411 self
.assertEqual(long('2ca5b7465', 14), 4294967297)
412 self
.assertEqual(long('1a20dcd82', 15), 4294967297)
413 self
.assertEqual(long('100000001', 16), 4294967297)
414 self
.assertEqual(long('a7ffda92', 17), 4294967297)
415 self
.assertEqual(long('704he7g5', 18), 4294967297)
416 self
.assertEqual(long('4f5aff67', 19), 4294967297)
417 self
.assertEqual(long('3723ai4h', 20), 4294967297)
418 self
.assertEqual(long('281d55i5', 21), 4294967297)
419 self
.assertEqual(long('1fj8b185', 22), 4294967297)
420 self
.assertEqual(long('1606k7id', 23), 4294967297)
421 self
.assertEqual(long('mb994ah', 24), 4294967297)
422 self
.assertEqual(long('hek2mgm', 25), 4294967297)
423 self
.assertEqual(long('dnchbnn', 26), 4294967297)
424 self
.assertEqual(long('b28jpdn', 27), 4294967297)
425 self
.assertEqual(long('8pfgih5', 28), 4294967297)
426 self
.assertEqual(long('76beigh', 29), 4294967297)
427 self
.assertEqual(long('5qmcpqh', 30), 4294967297)
428 self
.assertEqual(long('4q0jto5', 31), 4294967297)
429 self
.assertEqual(long('4000001', 32), 4294967297)
430 self
.assertEqual(long('3aokq95', 33), 4294967297)
431 self
.assertEqual(long('2qhxjlj', 34), 4294967297)
432 self
.assertEqual(long('2br45qc', 35), 4294967297)
433 self
.assertEqual(long('1z141z5', 36), 4294967297)
436 def test_conversion(self
):
438 class ClassicMissingMethods
:
440 self
.assertRaises(AttributeError, long, ClassicMissingMethods())
442 class MissingMethods(object):
444 self
.assertRaises(TypeError, long, MissingMethods())
470 self
.assertEqual(long(Foo0()), 42L)
471 self
.assertEqual(long(Foo1()), 42L)
472 self
.assertEqual(long(Foo2()), 42L)
473 self
.assertEqual(long(Foo3()), 0)
474 self
.assertEqual(long(Foo4()), 42)
475 self
.assertRaises(TypeError, long, Foo5())
479 for base
in (object, Classic
):
480 class LongOverridesTrunc(base
):
485 self
.assertEqual(long(LongOverridesTrunc()), 42)
487 class JustTrunc(base
):
490 self
.assertEqual(long(JustTrunc()), 42)
492 for trunc_result_base
in (object, Classic
):
493 class Integral(trunc_result_base
):
497 class TruncReturnsNonLong(base
):
500 self
.assertEqual(long(TruncReturnsNonLong()), 42)
502 class NonIntegral(trunc_result_base
):
504 # Check that we avoid infinite recursion.
507 class TruncReturnsNonIntegral(base
):
511 long(TruncReturnsNonIntegral())
512 except TypeError as e
:
513 self
.assertEquals(str(e
),
514 "__trunc__ returned non-Integral"
515 " (type NonIntegral)")
517 self
.fail("Failed to raise TypeError with %s" %
518 ((base
, trunc_result_base
),))
522 # check the extremes in int<->long conversion
524 hugeneg
= -hugepos
- 1
525 hugepos_aslong
= long(hugepos
)
526 hugeneg_aslong
= long(hugeneg
)
527 self
.assertEqual(hugepos
, hugepos_aslong
, "long(sys.maxint) != sys.maxint")
528 self
.assertEqual(hugeneg
, hugeneg_aslong
,
529 "long(-sys.maxint-1) != -sys.maxint-1")
531 # long -> int should not fail for hugepos_aslong or hugeneg_aslong
532 x
= int(hugepos_aslong
)
534 self
.assertEqual(x
, hugepos
,
535 "converting sys.maxint to long and back to int fails")
536 except OverflowError:
537 self
.fail("int(long(sys.maxint)) overflowed!")
538 if not isinstance(x
, int):
539 raise TestFailed("int(long(sys.maxint)) should have returned int")
540 x
= int(hugeneg_aslong
)
542 self
.assertEqual(x
, hugeneg
,
543 "converting -sys.maxint-1 to long and back to int fails")
544 except OverflowError:
545 self
.fail("int(long(-sys.maxint-1)) overflowed!")
546 if not isinstance(x
, int):
547 raise TestFailed("int(long(-sys.maxint-1)) should have "
549 # but long -> int should overflow for hugepos+1 and hugeneg-1
550 x
= hugepos_aslong
+ 1
553 except OverflowError:
554 self
.fail("int(long(sys.maxint) + 1) mustn't overflow")
555 self
.assertTrue(isinstance(y
, long),
556 "int(long(sys.maxint) + 1) should have returned long")
558 x
= hugeneg_aslong
- 1
561 except OverflowError:
562 self
.fail("int(long(-sys.maxint-1) - 1) mustn't overflow")
563 self
.assertTrue(isinstance(y
, long),
564 "int(long(-sys.maxint-1) - 1) should have returned long")
570 self
.assertTrue(type(y
) is long,
571 "overflowing int conversion must return long not long subtype")
573 # long -> Py_ssize_t conversion
575 def __getslice__(self
, i
, j
):
578 self
.assertEqual(X()[-5L:7L], (-5, 7))
579 # use the clamping effect to test the smallest and largest longs
580 # that fit a Py_ssize_t
581 slicemin
, slicemax
= X()[-2L**100:2L**100]
582 self
.assertEqual(X()[slicemin
:slicemax
], (slicemin
, slicemax
))
584 # ----------------------------------- tests of auto int->long conversion
586 def test_auto_overflow(self
):
589 special
= [0, 1, 2, 3, sys
.maxint
-1, sys
.maxint
, sys
.maxint
+1]
590 sqrt
= int(math
.sqrt(sys
.maxint
))
591 special
.extend([sqrt
-1, sqrt
, sqrt
+1])
592 special
.extend([-i
for i
in special
])
595 # Heavy use of nested scopes here!
596 self
.assertEqual(got
, expected
,
597 Frm("for %r expected %r got %r", args
, expected
, got
))
609 expected
= longx
+ longy
613 expected
= longx
- longy
617 expected
= longx
* longy
622 expected
= longx
/ longy
626 expected
= longx
// longy
630 expected
= divmod(longx
, longy
)
631 got
= divmod(longx
, longy
)
632 checkit(x
, 'divmod', y
)
634 if abs(y
) < 5 and not (x
== 0 and y
< 0):
635 expected
= longx
** longy
642 expected
= pow(longx
, longy
, long(z
))
644 checkit('pow', x
, y
, '%', z
)
646 self
.assertRaises(TypeError, pow,longx
, longy
, long(z
))
648 @unittest.skipUnless(float.__getformat
__("double").startswith("IEEE"),
649 "test requires IEEE 754 doubles")
650 def test_float_conversion(self
):
652 DBL_MAX
= sys
.float_info
.max
653 DBL_MAX_EXP
= sys
.float_info
.max_exp
654 DBL_MANT_DIG
= sys
.float_info
.mant_dig
656 exact_values
= [0L, 1L, 2L,
666 for x
in exact_values
:
667 self
.assertEqual(long(float(x
)), x
)
668 self
.assertEqual(long(float(-x
)), -x
)
670 # test round-half-even
671 for x
, y
in [(1, 0), (2, 2), (3, 4), (4, 4), (5, 4), (6, 6), (7, 8)]:
673 self
.assertEqual(long(float(2L**p
*(2**53+x
))), 2L**p
*(2**53+y
))
675 for x
, y
in [(0, 0), (1, 0), (2, 0), (3, 4), (4, 4), (5, 4), (6, 8),
676 (7, 8), (8, 8), (9, 8), (10, 8), (11, 12), (12, 12),
677 (13, 12), (14, 16), (15, 16)]:
679 self
.assertEqual(long(float(2L**p
*(2**54+x
))), 2L**p
*(2**54+y
))
681 # behaviour near extremes of floating-point range
682 long_dbl_max
= long(DBL_MAX
)
683 top_power
= 2**DBL_MAX_EXP
684 halfway
= (long_dbl_max
+ top_power
)//2
685 self
.assertEqual(float(long_dbl_max
), DBL_MAX
)
686 self
.assertEqual(float(long_dbl_max
+1), DBL_MAX
)
687 self
.assertEqual(float(halfway
-1), DBL_MAX
)
688 self
.assertRaises(OverflowError, float, halfway
)
689 self
.assertEqual(float(1-halfway
), -DBL_MAX
)
690 self
.assertRaises(OverflowError, float, -halfway
)
691 self
.assertRaises(OverflowError, float, top_power
-1)
692 self
.assertRaises(OverflowError, float, top_power
)
693 self
.assertRaises(OverflowError, float, top_power
+1)
694 self
.assertRaises(OverflowError, float, 2*top_power
-1)
695 self
.assertRaises(OverflowError, float, 2*top_power
)
696 self
.assertRaises(OverflowError, float, top_power
*top_power
)
698 for p
in xrange(100):
699 x
= long(2**p
* (2**53 + 1) + 1)
700 y
= long(2**p
* (2**53+ 2))
701 self
.assertEqual(long(float(x
)), y
)
703 x
= long(2**p
* (2**53 + 1))
704 y
= long(2**p
* 2**53)
705 self
.assertEqual(long(float(x
)), y
)
707 def test_float_overflow(self
):
710 for x
in -2.0, -1.0, 0.0, 1.0, 2.0:
711 self
.assertEqual(float(long(x
)), x
)
713 shuge
= '12345' * 120
716 namespace
= {'huge': huge
, 'mhuge': mhuge
, 'shuge': shuge
, 'math': math
}
717 for test
in ["float(huge)", "float(mhuge)",
718 "complex(huge)", "complex(mhuge)",
719 "complex(huge, 1)", "complex(mhuge, 1)",
720 "complex(1, huge)", "complex(1, mhuge)",
721 "1. + huge", "huge + 1.", "1. + mhuge", "mhuge + 1.",
722 "1. - huge", "huge - 1.", "1. - mhuge", "mhuge - 1.",
723 "1. * huge", "huge * 1.", "1. * mhuge", "mhuge * 1.",
724 "1. // huge", "huge // 1.", "1. // mhuge", "mhuge // 1.",
725 "1. / huge", "huge / 1.", "1. / mhuge", "mhuge / 1.",
726 "1. ** huge", "huge ** 1.", "1. ** mhuge", "mhuge ** 1.",
727 "math.sin(huge)", "math.sin(mhuge)",
728 "math.sqrt(huge)", "math.sqrt(mhuge)", # should do better
729 "math.floor(huge)", "math.floor(mhuge)"]:
731 self
.assertRaises(OverflowError, eval, test
, namespace
)
733 # XXX Perhaps float(shuge) can raise OverflowError on some box?
734 # The comparison should not.
735 self
.assertNotEqual(float(shuge
), int(shuge
),
736 "float(shuge) should not equal int(shuge)")
741 LOG10E
= math
.log10(math
.e
)
743 for exp
in range(10) + [100, 1000, 10000]:
745 log10
= math
.log10(value
)
746 self
.assertAlmostEqual(log10
, exp
)
748 # log10(value) == exp, so log(value) == log10(value)/log10(e) ==
750 expected
= exp
/ LOG10E
751 log
= math
.log(value
)
752 self
.assertAlmostEqual(log
, expected
)
754 for bad
in -(1L << 10000), -2L, 0L:
755 self
.assertRaises(ValueError, math
.log
, bad
)
756 self
.assertRaises(ValueError, math
.log10
, bad
)
758 def test_mixed_compares(self
):
759 eq
= self
.assertEqual
762 # We're mostly concerned with that mixing floats and longs does the
763 # right stuff, even when longs are too large to fit in a float.
764 # The safest way to check the results is to use an entirely different
765 # method, which we do here via a skeletal rational class (which
766 # represents all Python ints, longs and floats exactly).
768 def __init__(self
, value
):
769 if isinstance(value
, (int, long)):
772 elif isinstance(value
, float):
773 # Convert to exact rational equivalent.
774 f
, e
= math
.frexp(abs(value
))
775 assert f
== 0 or 0.5 <= f
< 1.0
776 # |value| = f * 2**e exactly
778 # Suck up CHUNK bits at a time; 28 is enough so that we suck
779 # up all bits in 2 iterations for all known binary double-
780 # precision formats, and small enough to fit in an int.
783 # invariant: |value| = (top + f) * 2**e exactly
785 f
= math
.ldexp(f
, CHUNK
)
787 assert digit
>> CHUNK
== 0
788 top
= (top
<< CHUNK
) | digit
790 assert 0.0 <= f
< 1.0
793 # Now |value| = top * 2**e exactly.
804 assert float(n
) / float(d
) == value
806 raise TypeError("can't deal with %r" % val
)
808 def __cmp__(self
, other
):
809 if not isinstance(other
, Rat
):
811 return cmp(self
.n
* other
.d
, self
.d
* other
.n
)
813 cases
= [0, 0.001, 0.99, 1.0, 1.5, 1e20
, 1e200
]
814 # 2**48 is an important boundary in the internals. 2**53 is an
815 # important boundary for IEEE double precision.
816 for t
in 2.0**48, 2.0**50, 2.0**53:
817 cases
.extend([t
- 1.0, t
- 0.3, t
, t
+ 0.3, t
+ 1.0,
818 long(t
-1), long(t
), long(t
+1)])
819 cases
.extend([0, 1, 2, sys
.maxint
, float(sys
.maxint
)])
820 # 1L<<20000 should exceed all double formats. long(1e200) is to
821 # check that we get equality with 1e200 above.
823 cases
.extend([0L, 1L, 2L, 1L << 20000, t
-1, t
, t
+1])
824 cases
.extend([-x
for x
in cases
])
831 eq(Rcmp
, xycmp
, Frm("%r %r %d %d", x
, y
, Rcmp
, xycmp
))
832 eq(x
== y
, Rcmp
== 0, Frm("%r == %r %d", x
, y
, Rcmp
))
833 eq(x
!= y
, Rcmp
!= 0, Frm("%r != %r %d", x
, y
, Rcmp
))
834 eq(x
< y
, Rcmp
< 0, Frm("%r < %r %d", x
, y
, Rcmp
))
835 eq(x
<= y
, Rcmp
<= 0, Frm("%r <= %r %d", x
, y
, Rcmp
))
836 eq(x
> y
, Rcmp
> 0, Frm("%r > %r %d", x
, y
, Rcmp
))
837 eq(x
>= y
, Rcmp
>= 0, Frm("%r >= %r %d", x
, y
, Rcmp
))
839 def test_nan_inf(self
):
840 self
.assertRaises(OverflowError, long, float('inf'))
841 self
.assertRaises(OverflowError, long, float('-inf'))
842 self
.assertRaises(ValueError, long, float('nan'))
844 def test_bit_length(self
):
846 for x
in xrange(-65000, 65000):
849 # Check equivalence with Python version
850 self
.assertEqual(k
, len(bin(x
).lstrip('-0b')))
851 # Behaviour as specified in the docs
853 self
.assertTrue(2**(k
-1) <= abs(x
) < 2**k
)
855 self
.assertEqual(k
, 0)
856 # Alternative definition: x.bit_length() == 1 + floor(log_2(x))
858 # When x is an exact power of 2, numeric errors can
859 # cause floor(log(x)/log(2)) to be one too small; for
860 # small x this can be fixed by adding a small quantity
861 # to the quotient before taking the floor.
862 self
.assertEqual(k
, 1 + math
.floor(
863 math
.log(abs(x
))/math
.log(2) + tiny
))
865 self
.assertEqual((0L).bit_length(), 0)
866 self
.assertEqual((1L).bit_length(), 1)
867 self
.assertEqual((-1L).bit_length(), 1)
868 self
.assertEqual((2L).bit_length(), 2)
869 self
.assertEqual((-2L).bit_length(), 2)
870 for i
in [2, 3, 15, 16, 17, 31, 32, 33, 63, 64, 234]:
872 self
.assertEqual((a
-1).bit_length(), i
)
873 self
.assertEqual((1-a
).bit_length(), i
)
874 self
.assertEqual((a
).bit_length(), i
+1)
875 self
.assertEqual((-a
).bit_length(), i
+1)
876 self
.assertEqual((a
+1).bit_length(), i
+1)
877 self
.assertEqual((-a
-1).bit_length(), i
+1)
881 test_support
.run_unittest(LongTest
)
883 if __name__
== "__main__":