blob: 8d16bb03875c1f10f06bd8e153050162c01abc6d [file] [log] [blame]
Walter Dörwalda0021592005-06-13 21:44:48 +00001import unittest
Benjamin Peterson979395b2008-05-03 21:35:18 +00002import sys
Walter Dörwalda0021592005-06-13 21:44:48 +00003
4import random
Mark Dickinson1a707982008-12-17 16:14:37 +00005import math
Walter Dörwalda0021592005-06-13 21:44:48 +00006
Chris Jerdonek6f70fe82012-12-27 12:53:29 -08007from test import test_int, test_support
8
Walter Dörwalda0021592005-06-13 21:44:48 +00009# Used for lazy formatting of failure messages
10class Frm(object):
11 def __init__(self, format, *args):
12 self.format = format
13 self.args = args
14
15 def __str__(self):
16 return self.format % self.args
Guido van Rossum4365cab1998-08-13 14:20:17 +000017
18# SHIFT should match the value in longintrepr.h for best testing.
Mark Dickinsonefc82f72009-03-20 15:51:55 +000019SHIFT = sys.long_info.bits_per_digit
Guido van Rossum4365cab1998-08-13 14:20:17 +000020BASE = 2 ** SHIFT
21MASK = BASE - 1
Tim Petersdaec9612004-08-30 23:18:23 +000022KARATSUBA_CUTOFF = 70 # from longobject.c
Guido van Rossum4365cab1998-08-13 14:20:17 +000023
24# Max number of base BASE digits to use in test cases. Doubling
Tim Peters28b0e2a2002-08-13 02:17:11 +000025# this will more than double the runtime.
26MAXDIGITS = 15
Guido van Rossum4365cab1998-08-13 14:20:17 +000027
Guido van Rossum4581a0c1998-10-02 01:19:48 +000028# build some special values
29special = map(long, [0, 1, 2, BASE, BASE >> 1])
30special.append(0x5555555555555555L)
31special.append(0xaaaaaaaaaaaaaaaaL)
32# some solid strings of one bits
33p2 = 4L # 0 and 1 already added
34for i in range(2*SHIFT):
35 special.append(p2 - 1)
36 p2 = p2 << 1
37del p2
38# add complements & negations
39special = special + map(lambda x: ~x, special) + \
40 map(lambda x: -x, special)
41
Benjamin Peterson979395b2008-05-03 21:35:18 +000042L = [
43 ('0', 0),
44 ('1', 1),
45 ('9', 9),
46 ('10', 10),
47 ('99', 99),
48 ('100', 100),
49 ('314', 314),
50 (' 314', 314),
51 ('314 ', 314),
52 (' \t\t 314 \t\t ', 314),
53 (repr(sys.maxint), sys.maxint),
54 (' 1x', ValueError),
55 (' 1 ', 1),
56 (' 1\02 ', ValueError),
57 ('', ValueError),
58 (' ', ValueError),
59 (' \t\t ', ValueError)
60]
61if test_support.have_unicode:
62 L += [
63 (unicode('0'), 0),
64 (unicode('1'), 1),
65 (unicode('9'), 9),
66 (unicode('10'), 10),
67 (unicode('99'), 99),
68 (unicode('100'), 100),
69 (unicode('314'), 314),
70 (unicode(' 314'), 314),
71 (unicode('\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
72 (unicode(' \t\t 314 \t\t '), 314),
73 (unicode(' 1x'), ValueError),
74 (unicode(' 1 '), 1),
75 (unicode(' 1\02 '), ValueError),
76 (unicode(''), ValueError),
77 (unicode(' '), ValueError),
78 (unicode(' \t\t '), ValueError),
79 (unichr(0x200), ValueError),
80]
81
Chris Jerdonek6f70fe82012-12-27 12:53:29 -080082class LongTest(test_int.IntLongCommonTests, unittest.TestCase):
Guido van Rossum4365cab1998-08-13 14:20:17 +000083
Chris Jerdonek6f70fe82012-12-27 12:53:29 -080084 ntype = long
Guido van Rossum4365cab1998-08-13 14:20:17 +000085
Walter Dörwalda0021592005-06-13 21:44:48 +000086 # Get quasi-random long consisting of ndigits digits (in base BASE).
87 # quasi == the most-significant digit will not be 0, and the number
88 # is constructed to contain long strings of 0 and 1 bits. These are
89 # more likely than random bits to provoke digit-boundary errors.
90 # The sign of the number is also random.
Guido van Rossum4365cab1998-08-13 14:20:17 +000091
Walter Dörwalda0021592005-06-13 21:44:48 +000092 def getran(self, ndigits):
Serhiy Storchaka708a5ea2014-02-08 14:28:20 +020093 self.assertGreater(ndigits, 0)
Walter Dörwalda0021592005-06-13 21:44:48 +000094 nbits_hi = ndigits * SHIFT
95 nbits_lo = nbits_hi - SHIFT + 1
96 answer = 0L
97 nbits = 0
98 r = int(random.random() * (SHIFT * 2)) | 1 # force 1 bits to start
99 while nbits < nbits_lo:
100 bits = (r >> 1) + 1
101 bits = min(bits, nbits_hi - nbits)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000102 self.assertTrue(1 <= bits <= SHIFT)
Walter Dörwalda0021592005-06-13 21:44:48 +0000103 nbits = nbits + bits
104 answer = answer << bits
105 if r & 1:
106 answer = answer | ((1 << bits) - 1)
107 r = int(random.random() * (SHIFT * 2))
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000108 self.assertTrue(nbits_lo <= nbits <= nbits_hi)
Walter Dörwalda0021592005-06-13 21:44:48 +0000109 if random.random() < 0.5:
110 answer = -answer
111 return answer
Guido van Rossum4581a0c1998-10-02 01:19:48 +0000112
Walter Dörwalda0021592005-06-13 21:44:48 +0000113 # Get random long consisting of ndigits random digits (relative to base
114 # BASE). The sign bit is also random.
Guido van Rossum4581a0c1998-10-02 01:19:48 +0000115
Walter Dörwalda0021592005-06-13 21:44:48 +0000116 def getran2(ndigits):
117 answer = 0L
118 for i in xrange(ndigits):
119 answer = (answer << SHIFT) | random.randint(0, MASK)
120 if random.random() < 0.5:
121 answer = -answer
122 return answer
Guido van Rossum4365cab1998-08-13 14:20:17 +0000123
Walter Dörwalda0021592005-06-13 21:44:48 +0000124 def check_division(self, x, y):
125 eq = self.assertEqual
126 q, r = divmod(x, y)
127 q2, r2 = x//y, x%y
128 pab, pba = x*y, y*x
129 eq(pab, pba, Frm("multiplication does not commute for %r and %r", x, y))
130 eq(q, q2, Frm("divmod returns different quotient than / for %r and %r", x, y))
131 eq(r, r2, Frm("divmod returns different mod than %% for %r and %r", x, y))
132 eq(x, q*y + r, Frm("x != q*y + r after divmod on x=%r, y=%r", x, y))
133 if y > 0:
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000134 self.assertTrue(0 <= r < y, Frm("bad mod from divmod on %r and %r", x, y))
Walter Dörwalda0021592005-06-13 21:44:48 +0000135 else:
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000136 self.assertTrue(y < r <= 0, Frm("bad mod from divmod on %r and %r", x, y))
Guido van Rossum4365cab1998-08-13 14:20:17 +0000137
Walter Dörwalda0021592005-06-13 21:44:48 +0000138 def test_division(self):
139 digits = range(1, MAXDIGITS+1) + range(KARATSUBA_CUTOFF,
140 KARATSUBA_CUTOFF + 14)
141 digits.append(KARATSUBA_CUTOFF * 3)
142 for lenx in digits:
143 x = self.getran(lenx)
144 for leny in digits:
145 y = self.getran(leny) or 1L
146 self.check_division(x, y)
Guido van Rossum4365cab1998-08-13 14:20:17 +0000147
Mark Dickinsonefc82f72009-03-20 15:51:55 +0000148 # specific numbers chosen to exercise corner cases of the
149 # current long division implementation
150
151 # 30-bit cases involving a quotient digit estimate of BASE+1
152 self.check_division(1231948412290879395966702881L,
153 1147341367131428698L)
154 self.check_division(815427756481275430342312021515587883L,
155 707270836069027745L)
156 self.check_division(627976073697012820849443363563599041L,
157 643588798496057020L)
158 self.check_division(1115141373653752303710932756325578065L,
159 1038556335171453937726882627L)
160 # 30-bit cases that require the post-subtraction correction step
161 self.check_division(922498905405436751940989320930368494L,
162 949985870686786135626943396L)
163 self.check_division(768235853328091167204009652174031844L,
164 1091555541180371554426545266L)
165
166 # 15-bit cases involving a quotient digit estimate of BASE+1
167 self.check_division(20172188947443L, 615611397L)
168 self.check_division(1020908530270155025L, 950795710L)
169 self.check_division(128589565723112408L, 736393718L)
170 self.check_division(609919780285761575L, 18613274546784L)
171 # 15-bit cases that require the post-subtraction correction step
172 self.check_division(710031681576388032L, 26769404391308L)
173 self.check_division(1933622614268221L, 30212853348836L)
174
175
176
Walter Dörwalda0021592005-06-13 21:44:48 +0000177 def test_karatsuba(self):
178 digits = range(1, 5) + range(KARATSUBA_CUTOFF, KARATSUBA_CUTOFF + 10)
179 digits.extend([KARATSUBA_CUTOFF * 10, KARATSUBA_CUTOFF * 100])
Guido van Rossum4365cab1998-08-13 14:20:17 +0000180
Walter Dörwalda0021592005-06-13 21:44:48 +0000181 bits = [digit * SHIFT for digit in digits]
Guido van Rossum4365cab1998-08-13 14:20:17 +0000182
Walter Dörwalda0021592005-06-13 21:44:48 +0000183 # Test products of long strings of 1 bits -- (2**x-1)*(2**y-1) ==
184 # 2**(x+y) - 2**x - 2**y + 1, so the proper result is easy to check.
185 for abits in bits:
186 a = (1L << abits) - 1
187 for bbits in bits:
188 if bbits < abits:
189 continue
190 b = (1L << bbits) - 1
191 x = a * b
192 y = ((1L << (abits + bbits)) -
193 (1L << abits) -
194 (1L << bbits) +
195 1)
196 self.assertEqual(x, y,
197 Frm("bad result for a*b: a=%r, b=%r, x=%r, y=%r", a, b, x, y))
Tim Peters7f270ba2002-08-13 21:06:55 +0000198
Walter Dörwalda0021592005-06-13 21:44:48 +0000199 def check_bitop_identities_1(self, x):
200 eq = self.assertEqual
201 eq(x & 0, 0, Frm("x & 0 != 0 for x=%r", x))
202 eq(x | 0, x, Frm("x | 0 != x for x=%r", x))
203 eq(x ^ 0, x, Frm("x ^ 0 != x for x=%r", x))
204 eq(x & -1, x, Frm("x & -1 != x for x=%r", x))
205 eq(x | -1, -1, Frm("x | -1 != -1 for x=%r", x))
206 eq(x ^ -1, ~x, Frm("x ^ -1 != ~x for x=%r", x))
207 eq(x, ~~x, Frm("x != ~~x for x=%r", x))
208 eq(x & x, x, Frm("x & x != x for x=%r", x))
209 eq(x | x, x, Frm("x | x != x for x=%r", x))
210 eq(x ^ x, 0, Frm("x ^ x != 0 for x=%r", x))
211 eq(x & ~x, 0, Frm("x & ~x != 0 for x=%r", x))
212 eq(x | ~x, -1, Frm("x | ~x != -1 for x=%r", x))
213 eq(x ^ ~x, -1, Frm("x ^ ~x != -1 for x=%r", x))
214 eq(-x, 1 + ~x, Frm("not -x == 1 + ~x for x=%r", x))
215 eq(-x, ~(x-1), Frm("not -x == ~(x-1) forx =%r", x))
216 for n in xrange(2*SHIFT):
217 p2 = 2L ** n
218 eq(x << n >> n, x,
219 Frm("x << n >> n != x for x=%r, n=%r", (x, n)))
220 eq(x // p2, x >> n,
221 Frm("x // p2 != x >> n for x=%r n=%r p2=%r", (x, n, p2)))
222 eq(x * p2, x << n,
223 Frm("x * p2 != x << n for x=%r n=%r p2=%r", (x, n, p2)))
224 eq(x & -p2, x >> n << n,
225 Frm("not x & -p2 == x >> n << n for x=%r n=%r p2=%r", (x, n, p2)))
226 eq(x & -p2, x & ~(p2 - 1),
227 Frm("not x & -p2 == x & ~(p2 - 1) for x=%r n=%r p2=%r", (x, n, p2)))
Tim Peters7f270ba2002-08-13 21:06:55 +0000228
Walter Dörwalda0021592005-06-13 21:44:48 +0000229 def check_bitop_identities_2(self, x, y):
230 eq = self.assertEqual
231 eq(x & y, y & x, Frm("x & y != y & x for x=%r, y=%r", (x, y)))
232 eq(x | y, y | x, Frm("x | y != y | x for x=%r, y=%r", (x, y)))
233 eq(x ^ y, y ^ x, Frm("x ^ y != y ^ x 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), Frm("x & y != ~(~x | ~y) for x=%r, y=%r", (x, y)))
236 eq(x | y, ~(~x & ~y), Frm("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)))
241 eq(x ^ y, (x | y) & (~x | ~y),
242 Frm("x ^ y == (x | y) & (~x | ~y) for x=%r, y=%r", (x, y)))
Tim Peters7f270ba2002-08-13 21:06:55 +0000243
Walter Dörwalda0021592005-06-13 21:44:48 +0000244 def check_bitop_identities_3(self, x, y, z):
245 eq = self.assertEqual
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 ^ z),
251 Frm("(x ^ y) ^ z != x ^ (y ^ 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)))
254 eq(x | (y & z), (x | y) & (x | z),
255 Frm("x | (y & z) != (x | y) & (x | z) for x=%r, y=%r, z=%r", (x, y, z)))
Tim Peters7f270ba2002-08-13 21:06:55 +0000256
Walter Dörwalda0021592005-06-13 21:44:48 +0000257 def test_bitop_identities(self):
258 for x in special:
259 self.check_bitop_identities_1(x)
260 digits = xrange(1, MAXDIGITS+1)
261 for lenx in digits:
262 x = self.getran(lenx)
263 self.check_bitop_identities_1(x)
264 for leny in digits:
265 y = self.getran(leny)
266 self.check_bitop_identities_2(x, y)
267 self.check_bitop_identities_3(x, y, self.getran((lenx + leny)//2))
Guido van Rossum4365cab1998-08-13 14:20:17 +0000268
Walter Dörwalda0021592005-06-13 21:44:48 +0000269 def slow_format(self, x, base):
270 if (x, base) == (0, 8):
271 # this is an oddball!
272 return "0L"
273 digits = []
274 sign = 0
275 if x < 0:
276 sign, x = 1, -x
277 while x:
278 x, r = divmod(x, base)
279 digits.append(int(r))
280 digits.reverse()
281 digits = digits or [0]
282 return '-'[:sign] + \
283 {8: '0', 10: '', 16: '0x'}[base] + \
Raymond Hettinger3296e692005-06-29 23:29:56 +0000284 "".join(map(lambda i: "0123456789abcdef"[i], digits)) + "L"
Guido van Rossum4365cab1998-08-13 14:20:17 +0000285
Walter Dörwalda0021592005-06-13 21:44:48 +0000286 def check_format_1(self, x):
287 for base, mapper in (8, oct), (10, repr), (16, hex):
288 got = mapper(x)
289 expected = self.slow_format(x, base)
290 msg = Frm("%s returned %r but expected %r for %r",
291 mapper.__name__, got, expected, x)
292 self.assertEqual(got, expected, msg)
293 self.assertEqual(long(got, 0), x, Frm('long("%s", 0) != %r', got, x))
294 # str() has to be checked a little differently since there's no
295 # trailing "L"
296 got = str(x)
297 expected = self.slow_format(x, 10)[:-1]
298 msg = Frm("%s returned %r but expected %r for %r",
299 mapper.__name__, got, expected, x)
300 self.assertEqual(got, expected, msg)
Guido van Rossum4365cab1998-08-13 14:20:17 +0000301
Walter Dörwalda0021592005-06-13 21:44:48 +0000302 def test_format(self):
303 for x in special:
304 self.check_format_1(x)
305 for i in xrange(10):
306 for lenx in xrange(1, MAXDIGITS+1):
307 x = self.getran(lenx)
308 self.check_format_1(x)
Guido van Rossum4365cab1998-08-13 14:20:17 +0000309
Benjamin Peterson979395b2008-05-03 21:35:18 +0000310 def test_long(self):
311 self.assertEqual(long(314), 314L)
312 self.assertEqual(long(3.14), 3L)
313 self.assertEqual(long(314L), 314L)
Amaury Forgeot d'Arcd3ffb892008-09-09 07:24:30 +0000314 # Check that long() of basic types actually returns a long
315 self.assertEqual(type(long(314)), long)
316 self.assertEqual(type(long(3.14)), long)
317 self.assertEqual(type(long(314L)), long)
Benjamin Peterson979395b2008-05-03 21:35:18 +0000318 # Check that conversion from float truncates towards zero
319 self.assertEqual(long(-3.14), -3L)
320 self.assertEqual(long(3.9), 3L)
321 self.assertEqual(long(-3.9), -3L)
322 self.assertEqual(long(3.5), 3L)
323 self.assertEqual(long(-3.5), -3L)
324 self.assertEqual(long("-3"), -3L)
Mark Dickinson20665592010-05-25 19:01:08 +0000325 self.assertEqual(long("0b10", 2), 2L)
326 self.assertEqual(long("0o10", 8), 8L)
327 self.assertEqual(long("0x10", 16), 16L)
Benjamin Peterson979395b2008-05-03 21:35:18 +0000328 if test_support.have_unicode:
329 self.assertEqual(long(unicode("-3")), -3L)
330 # Different base:
331 self.assertEqual(long("10",16), 16L)
332 if test_support.have_unicode:
333 self.assertEqual(long(unicode("10"),16), 16L)
334 # Check conversions from string (same test set as for int(), and then some)
335 LL = [
336 ('1' + '0'*20, 10L**20),
337 ('1' + '0'*100, 10L**100)
338 ]
339 L2 = L[:]
340 if test_support.have_unicode:
341 L2 += [
342 (unicode('1') + unicode('0')*20, 10L**20),
343 (unicode('1') + unicode('0')*100, 10L**100),
344 ]
345 for s, v in L2 + LL:
346 for sign in "", "+", "-":
347 for prefix in "", " ", "\t", " \t\t ":
348 ss = prefix + sign + s
349 vv = v
350 if sign == "-" and v is not ValueError:
351 vv = -v
352 try:
353 self.assertEqual(long(ss), long(vv))
354 except v:
355 pass
356
357 self.assertRaises(ValueError, long, '123\0')
358 self.assertRaises(ValueError, long, '53', 40)
359 self.assertRaises(TypeError, long, 1, 12)
360
Mark Dickinson784a47f2010-05-26 19:06:33 +0000361 # tests with base 0
362 self.assertEqual(long(' 0123 ', 0), 83)
363 self.assertEqual(long(' 0123 ', 0), 83)
364 self.assertEqual(long('000', 0), 0)
365 self.assertEqual(long('0o123', 0), 83)
366 self.assertEqual(long('0x123', 0), 291)
367 self.assertEqual(long('0b100', 0), 4)
368 self.assertEqual(long(' 0O123 ', 0), 83)
369 self.assertEqual(long(' 0X123 ', 0), 291)
370 self.assertEqual(long(' 0B100 ', 0), 4)
371 self.assertEqual(long('0', 0), 0)
372 self.assertEqual(long('+0', 0), 0)
373 self.assertEqual(long('-0', 0), 0)
374 self.assertEqual(long('00', 0), 0)
375 self.assertRaises(ValueError, long, '08', 0)
376 self.assertRaises(ValueError, long, '-012395', 0)
377
Benjamin Peterson979395b2008-05-03 21:35:18 +0000378 # SF patch #1638879: embedded NULs were not detected with
379 # explicit base
380 self.assertRaises(ValueError, long, '123\0', 10)
381 self.assertRaises(ValueError, long, '123\x00 245', 20)
382
383 self.assertEqual(long('100000000000000000000000000000000', 2),
384 4294967296)
385 self.assertEqual(long('102002022201221111211', 3), 4294967296)
386 self.assertEqual(long('10000000000000000', 4), 4294967296)
387 self.assertEqual(long('32244002423141', 5), 4294967296)
388 self.assertEqual(long('1550104015504', 6), 4294967296)
389 self.assertEqual(long('211301422354', 7), 4294967296)
390 self.assertEqual(long('40000000000', 8), 4294967296)
391 self.assertEqual(long('12068657454', 9), 4294967296)
392 self.assertEqual(long('4294967296', 10), 4294967296)
393 self.assertEqual(long('1904440554', 11), 4294967296)
394 self.assertEqual(long('9ba461594', 12), 4294967296)
395 self.assertEqual(long('535a79889', 13), 4294967296)
396 self.assertEqual(long('2ca5b7464', 14), 4294967296)
397 self.assertEqual(long('1a20dcd81', 15), 4294967296)
398 self.assertEqual(long('100000000', 16), 4294967296)
399 self.assertEqual(long('a7ffda91', 17), 4294967296)
400 self.assertEqual(long('704he7g4', 18), 4294967296)
401 self.assertEqual(long('4f5aff66', 19), 4294967296)
402 self.assertEqual(long('3723ai4g', 20), 4294967296)
403 self.assertEqual(long('281d55i4', 21), 4294967296)
404 self.assertEqual(long('1fj8b184', 22), 4294967296)
405 self.assertEqual(long('1606k7ic', 23), 4294967296)
406 self.assertEqual(long('mb994ag', 24), 4294967296)
407 self.assertEqual(long('hek2mgl', 25), 4294967296)
408 self.assertEqual(long('dnchbnm', 26), 4294967296)
409 self.assertEqual(long('b28jpdm', 27), 4294967296)
410 self.assertEqual(long('8pfgih4', 28), 4294967296)
411 self.assertEqual(long('76beigg', 29), 4294967296)
412 self.assertEqual(long('5qmcpqg', 30), 4294967296)
413 self.assertEqual(long('4q0jto4', 31), 4294967296)
414 self.assertEqual(long('4000000', 32), 4294967296)
415 self.assertEqual(long('3aokq94', 33), 4294967296)
416 self.assertEqual(long('2qhxjli', 34), 4294967296)
417 self.assertEqual(long('2br45qb', 35), 4294967296)
418 self.assertEqual(long('1z141z4', 36), 4294967296)
419
420 self.assertEqual(long('100000000000000000000000000000001', 2),
421 4294967297)
422 self.assertEqual(long('102002022201221111212', 3), 4294967297)
423 self.assertEqual(long('10000000000000001', 4), 4294967297)
424 self.assertEqual(long('32244002423142', 5), 4294967297)
425 self.assertEqual(long('1550104015505', 6), 4294967297)
426 self.assertEqual(long('211301422355', 7), 4294967297)
427 self.assertEqual(long('40000000001', 8), 4294967297)
428 self.assertEqual(long('12068657455', 9), 4294967297)
429 self.assertEqual(long('4294967297', 10), 4294967297)
430 self.assertEqual(long('1904440555', 11), 4294967297)
431 self.assertEqual(long('9ba461595', 12), 4294967297)
432 self.assertEqual(long('535a7988a', 13), 4294967297)
433 self.assertEqual(long('2ca5b7465', 14), 4294967297)
434 self.assertEqual(long('1a20dcd82', 15), 4294967297)
435 self.assertEqual(long('100000001', 16), 4294967297)
436 self.assertEqual(long('a7ffda92', 17), 4294967297)
437 self.assertEqual(long('704he7g5', 18), 4294967297)
438 self.assertEqual(long('4f5aff67', 19), 4294967297)
439 self.assertEqual(long('3723ai4h', 20), 4294967297)
440 self.assertEqual(long('281d55i5', 21), 4294967297)
441 self.assertEqual(long('1fj8b185', 22), 4294967297)
442 self.assertEqual(long('1606k7id', 23), 4294967297)
443 self.assertEqual(long('mb994ah', 24), 4294967297)
444 self.assertEqual(long('hek2mgm', 25), 4294967297)
445 self.assertEqual(long('dnchbnn', 26), 4294967297)
446 self.assertEqual(long('b28jpdn', 27), 4294967297)
447 self.assertEqual(long('8pfgih5', 28), 4294967297)
448 self.assertEqual(long('76beigh', 29), 4294967297)
449 self.assertEqual(long('5qmcpqh', 30), 4294967297)
450 self.assertEqual(long('4q0jto5', 31), 4294967297)
451 self.assertEqual(long('4000001', 32), 4294967297)
452 self.assertEqual(long('3aokq95', 33), 4294967297)
453 self.assertEqual(long('2qhxjlj', 34), 4294967297)
454 self.assertEqual(long('2br45qc', 35), 4294967297)
455 self.assertEqual(long('1z141z5', 36), 4294967297)
456
457
458 def test_conversion(self):
459 # Test __long__()
460 class ClassicMissingMethods:
461 pass
462 self.assertRaises(AttributeError, long, ClassicMissingMethods())
463
464 class MissingMethods(object):
465 pass
466 self.assertRaises(TypeError, long, MissingMethods())
467
468 class Foo0:
469 def __long__(self):
470 return 42L
471
472 class Foo1(object):
473 def __long__(self):
474 return 42L
475
476 class Foo2(long):
477 def __long__(self):
478 return 42L
479
480 class Foo3(long):
481 def __long__(self):
482 return self
483
484 class Foo4(long):
485 def __long__(self):
486 return 42
487
488 class Foo5(long):
489 def __long__(self):
490 return 42.
491
492 self.assertEqual(long(Foo0()), 42L)
493 self.assertEqual(long(Foo1()), 42L)
494 self.assertEqual(long(Foo2()), 42L)
495 self.assertEqual(long(Foo3()), 0)
496 self.assertEqual(long(Foo4()), 42)
497 self.assertRaises(TypeError, long, Foo5())
498
499 class Classic:
500 pass
501 for base in (object, Classic):
502 class LongOverridesTrunc(base):
503 def __long__(self):
504 return 42
505 def __trunc__(self):
506 return -12
507 self.assertEqual(long(LongOverridesTrunc()), 42)
508
509 class JustTrunc(base):
510 def __trunc__(self):
511 return 42
512 self.assertEqual(long(JustTrunc()), 42)
513
514 for trunc_result_base in (object, Classic):
515 class Integral(trunc_result_base):
516 def __int__(self):
517 return 42
518
519 class TruncReturnsNonLong(base):
520 def __trunc__(self):
521 return Integral()
522 self.assertEqual(long(TruncReturnsNonLong()), 42)
523
524 class NonIntegral(trunc_result_base):
525 def __trunc__(self):
526 # Check that we avoid infinite recursion.
527 return NonIntegral()
528
529 class TruncReturnsNonIntegral(base):
530 def __trunc__(self):
531 return NonIntegral()
532 try:
533 long(TruncReturnsNonIntegral())
534 except TypeError as e:
Ezio Melotti2623a372010-11-21 13:34:58 +0000535 self.assertEqual(str(e),
536 "__trunc__ returned non-Integral"
537 " (type NonIntegral)")
Benjamin Peterson979395b2008-05-03 21:35:18 +0000538 else:
539 self.fail("Failed to raise TypeError with %s" %
540 ((base, trunc_result_base),))
541
Walter Dörwalda0021592005-06-13 21:44:48 +0000542 def test_misc(self):
Guido van Rossum4365cab1998-08-13 14:20:17 +0000543
Walter Dörwalda0021592005-06-13 21:44:48 +0000544 # check the extremes in int<->long conversion
545 hugepos = sys.maxint
546 hugeneg = -hugepos - 1
547 hugepos_aslong = long(hugepos)
548 hugeneg_aslong = long(hugeneg)
549 self.assertEqual(hugepos, hugepos_aslong, "long(sys.maxint) != sys.maxint")
550 self.assertEqual(hugeneg, hugeneg_aslong,
551 "long(-sys.maxint-1) != -sys.maxint-1")
Guido van Rossum4365cab1998-08-13 14:20:17 +0000552
Walter Dörwalda0021592005-06-13 21:44:48 +0000553 # long -> int should not fail for hugepos_aslong or hugeneg_aslong
Armin Rigo7ccbca92006-10-04 12:17:45 +0000554 x = int(hugepos_aslong)
Walter Dörwalda0021592005-06-13 21:44:48 +0000555 try:
Armin Rigo7ccbca92006-10-04 12:17:45 +0000556 self.assertEqual(x, hugepos,
Walter Dörwalda0021592005-06-13 21:44:48 +0000557 "converting sys.maxint to long and back to int fails")
558 except OverflowError:
559 self.fail("int(long(sys.maxint)) overflowed!")
Armin Rigo7ccbca92006-10-04 12:17:45 +0000560 if not isinstance(x, int):
Georg Brandldf8a3032010-02-06 23:08:00 +0000561 self.fail("int(long(sys.maxint)) should have returned int")
Armin Rigo7ccbca92006-10-04 12:17:45 +0000562 x = int(hugeneg_aslong)
Walter Dörwalda0021592005-06-13 21:44:48 +0000563 try:
Armin Rigo7ccbca92006-10-04 12:17:45 +0000564 self.assertEqual(x, hugeneg,
Walter Dörwalda0021592005-06-13 21:44:48 +0000565 "converting -sys.maxint-1 to long and back to int fails")
566 except OverflowError:
567 self.fail("int(long(-sys.maxint-1)) overflowed!")
Armin Rigo7ccbca92006-10-04 12:17:45 +0000568 if not isinstance(x, int):
Georg Brandldf8a3032010-02-06 23:08:00 +0000569 self.fail("int(long(-sys.maxint-1)) should have returned int")
Walter Dörwalda0021592005-06-13 21:44:48 +0000570 # but long -> int should overflow for hugepos+1 and hugeneg-1
571 x = hugepos_aslong + 1
572 try:
573 y = int(x)
574 except OverflowError:
575 self.fail("int(long(sys.maxint) + 1) mustn't overflow")
Ezio Melottib0f5adc2010-01-24 16:58:36 +0000576 self.assertIsInstance(y, long,
Walter Dörwalda0021592005-06-13 21:44:48 +0000577 "int(long(sys.maxint) + 1) should have returned long")
Guido van Rossum4365cab1998-08-13 14:20:17 +0000578
Walter Dörwalda0021592005-06-13 21:44:48 +0000579 x = hugeneg_aslong - 1
580 try:
581 y = int(x)
582 except OverflowError:
583 self.fail("int(long(-sys.maxint-1) - 1) mustn't overflow")
Ezio Melottib0f5adc2010-01-24 16:58:36 +0000584 self.assertIsInstance(y, long,
Walter Dörwalda0021592005-06-13 21:44:48 +0000585 "int(long(-sys.maxint-1) - 1) should have returned long")
Guido van Rossum4365cab1998-08-13 14:20:17 +0000586
Walter Dörwalda0021592005-06-13 21:44:48 +0000587 class long2(long):
588 pass
589 x = long2(1L<<100)
Walter Dörwaldf1715402002-11-19 20:49:15 +0000590 y = int(x)
Serhiy Storchaka708a5ea2014-02-08 14:28:20 +0200591 self.assertIs(type(y), long,
Walter Dörwalda0021592005-06-13 21:44:48 +0000592 "overflowing int conversion must return long not long subtype")
Guido van Rossum4581a0c1998-10-02 01:19:48 +0000593
Armin Rigo7ccbca92006-10-04 12:17:45 +0000594 # long -> Py_ssize_t conversion
595 class X(object):
596 def __getslice__(self, i, j):
597 return i, j
598
Florent Xicluna07627882010-03-21 01:14:24 +0000599 with test_support.check_py3k_warnings():
600 self.assertEqual(X()[-5L:7L], (-5, 7))
601 # use the clamping effect to test the smallest and largest longs
602 # that fit a Py_ssize_t
603 slicemin, slicemax = X()[-2L**100:2L**100]
604 self.assertEqual(X()[slicemin:slicemax], (slicemin, slicemax))
Armin Rigo7ccbca92006-10-04 12:17:45 +0000605
Mark Dickinsoncb61e5d2010-09-26 10:37:12 +0000606 def test_issue9869(self):
607 # Issue 9869: Interpreter crash when initializing an instance
608 # of a long subclass from an object whose __long__ method returns
609 # a plain int.
610 class BadLong(object):
611 def __long__(self):
612 return 1000000
613
614 class MyLong(long):
615 pass
616
617 x = MyLong(BadLong())
618 self.assertIsInstance(x, long)
619 self.assertEqual(x, 1000000)
620
621
Tim Peters26c7fa32001-08-23 22:56:21 +0000622# ----------------------------------- tests of auto int->long conversion
623
Walter Dörwalda0021592005-06-13 21:44:48 +0000624 def test_auto_overflow(self):
Walter Dörwalda0021592005-06-13 21:44:48 +0000625 special = [0, 1, 2, 3, sys.maxint-1, sys.maxint, sys.maxint+1]
626 sqrt = int(math.sqrt(sys.maxint))
627 special.extend([sqrt-1, sqrt, sqrt+1])
628 special.extend([-i for i in special])
Tim Peters26c7fa32001-08-23 22:56:21 +0000629
Walter Dörwalda0021592005-06-13 21:44:48 +0000630 def checkit(*args):
631 # Heavy use of nested scopes here!
632 self.assertEqual(got, expected,
633 Frm("for %r expected %r got %r", args, expected, got))
Tim Peters26c7fa32001-08-23 22:56:21 +0000634
Walter Dörwalda0021592005-06-13 21:44:48 +0000635 for x in special:
636 longx = long(x)
Tim Peters26c7fa32001-08-23 22:56:21 +0000637
Walter Dörwalda0021592005-06-13 21:44:48 +0000638 expected = -longx
639 got = -x
640 checkit('-', x)
Tim Peters26c7fa32001-08-23 22:56:21 +0000641
Walter Dörwalda0021592005-06-13 21:44:48 +0000642 for y in special:
643 longy = long(y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000644
Walter Dörwalda0021592005-06-13 21:44:48 +0000645 expected = longx + longy
646 got = x + y
647 checkit(x, '+', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000648
Walter Dörwalda0021592005-06-13 21:44:48 +0000649 expected = longx - longy
650 got = x - y
651 checkit(x, '-', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000652
Walter Dörwalda0021592005-06-13 21:44:48 +0000653 expected = longx * longy
654 got = x * y
655 checkit(x, '*', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000656
Walter Dörwalda0021592005-06-13 21:44:48 +0000657 if y:
Florent Xicluna07627882010-03-21 01:14:24 +0000658 with test_support.check_py3k_warnings():
659 expected = longx / longy
660 got = x / y
Walter Dörwalda0021592005-06-13 21:44:48 +0000661 checkit(x, '/', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000662
Walter Dörwalda0021592005-06-13 21:44:48 +0000663 expected = longx // longy
664 got = x // y
665 checkit(x, '//', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000666
Walter Dörwalda0021592005-06-13 21:44:48 +0000667 expected = divmod(longx, longy)
668 got = divmod(longx, longy)
669 checkit(x, 'divmod', y)
Tim Petersa3653092001-08-23 23:02:57 +0000670
Walter Dörwalda0021592005-06-13 21:44:48 +0000671 if abs(y) < 5 and not (x == 0 and y < 0):
672 expected = longx ** longy
673 got = x ** y
674 checkit(x, '**', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000675
Walter Dörwalda0021592005-06-13 21:44:48 +0000676 for z in special:
677 if z != 0 :
678 if y >= 0:
679 expected = pow(longx, longy, long(z))
680 got = pow(x, y, z)
681 checkit('pow', x, y, '%', z)
Tim Peters32f453e2001-09-03 08:35:41 +0000682 else:
Walter Dörwalda0021592005-06-13 21:44:48 +0000683 self.assertRaises(TypeError, pow,longx, longy, long(z))
Tim Peters26c7fa32001-08-23 22:56:21 +0000684
Mark Dickinson6736cf82009-04-20 21:13:33 +0000685 @unittest.skipUnless(float.__getformat__("double").startswith("IEEE"),
686 "test requires IEEE 754 doubles")
687 def test_float_conversion(self):
688 import sys
689 DBL_MAX = sys.float_info.max
690 DBL_MAX_EXP = sys.float_info.max_exp
691 DBL_MANT_DIG = sys.float_info.mant_dig
692
693 exact_values = [0L, 1L, 2L,
694 long(2**53-3),
695 long(2**53-2),
696 long(2**53-1),
697 long(2**53),
698 long(2**53+2),
699 long(2**54-4),
700 long(2**54-2),
701 long(2**54),
702 long(2**54+4)]
703 for x in exact_values:
704 self.assertEqual(long(float(x)), x)
705 self.assertEqual(long(float(-x)), -x)
706
707 # test round-half-even
708 for x, y in [(1, 0), (2, 2), (3, 4), (4, 4), (5, 4), (6, 6), (7, 8)]:
709 for p in xrange(15):
710 self.assertEqual(long(float(2L**p*(2**53+x))), 2L**p*(2**53+y))
711
712 for x, y in [(0, 0), (1, 0), (2, 0), (3, 4), (4, 4), (5, 4), (6, 8),
713 (7, 8), (8, 8), (9, 8), (10, 8), (11, 12), (12, 12),
714 (13, 12), (14, 16), (15, 16)]:
715 for p in xrange(15):
716 self.assertEqual(long(float(2L**p*(2**54+x))), 2L**p*(2**54+y))
717
718 # behaviour near extremes of floating-point range
719 long_dbl_max = long(DBL_MAX)
720 top_power = 2**DBL_MAX_EXP
Mark Dickinsona7e734f2009-04-20 21:41:04 +0000721 halfway = (long_dbl_max + top_power)//2
Mark Dickinson6736cf82009-04-20 21:13:33 +0000722 self.assertEqual(float(long_dbl_max), DBL_MAX)
723 self.assertEqual(float(long_dbl_max+1), DBL_MAX)
724 self.assertEqual(float(halfway-1), DBL_MAX)
725 self.assertRaises(OverflowError, float, halfway)
726 self.assertEqual(float(1-halfway), -DBL_MAX)
727 self.assertRaises(OverflowError, float, -halfway)
728 self.assertRaises(OverflowError, float, top_power-1)
729 self.assertRaises(OverflowError, float, top_power)
730 self.assertRaises(OverflowError, float, top_power+1)
731 self.assertRaises(OverflowError, float, 2*top_power-1)
732 self.assertRaises(OverflowError, float, 2*top_power)
733 self.assertRaises(OverflowError, float, top_power*top_power)
734
735 for p in xrange(100):
736 x = long(2**p * (2**53 + 1) + 1)
737 y = long(2**p * (2**53+ 2))
738 self.assertEqual(long(float(x)), y)
739
740 x = long(2**p * (2**53 + 1))
741 y = long(2**p * 2**53)
742 self.assertEqual(long(float(x)), y)
743
Walter Dörwalda0021592005-06-13 21:44:48 +0000744 def test_float_overflow(self):
Walter Dörwalda0021592005-06-13 21:44:48 +0000745 for x in -2.0, -1.0, 0.0, 1.0, 2.0:
746 self.assertEqual(float(long(x)), x)
Tim Peters9fffa3e2001-09-04 05:14:19 +0000747
Walter Dörwalda0021592005-06-13 21:44:48 +0000748 shuge = '12345' * 120
749 huge = 1L << 30000
750 mhuge = -huge
751 namespace = {'huge': huge, 'mhuge': mhuge, 'shuge': shuge, 'math': math}
752 for test in ["float(huge)", "float(mhuge)",
753 "complex(huge)", "complex(mhuge)",
754 "complex(huge, 1)", "complex(mhuge, 1)",
755 "complex(1, huge)", "complex(1, mhuge)",
756 "1. + huge", "huge + 1.", "1. + mhuge", "mhuge + 1.",
757 "1. - huge", "huge - 1.", "1. - mhuge", "mhuge - 1.",
758 "1. * huge", "huge * 1.", "1. * mhuge", "mhuge * 1.",
759 "1. // huge", "huge // 1.", "1. // mhuge", "mhuge // 1.",
760 "1. / huge", "huge / 1.", "1. / mhuge", "mhuge / 1.",
761 "1. ** huge", "huge ** 1.", "1. ** mhuge", "mhuge ** 1.",
762 "math.sin(huge)", "math.sin(mhuge)",
763 "math.sqrt(huge)", "math.sqrt(mhuge)", # should do better
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +0000764 "math.floor(huge)", "math.floor(mhuge)"]:
Tim Peters9fffa3e2001-09-04 05:14:19 +0000765
Walter Dörwalda0021592005-06-13 21:44:48 +0000766 self.assertRaises(OverflowError, eval, test, namespace)
Tim Peters9fffa3e2001-09-04 05:14:19 +0000767
Walter Dörwalda0021592005-06-13 21:44:48 +0000768 # XXX Perhaps float(shuge) can raise OverflowError on some box?
769 # The comparison should not.
770 self.assertNotEqual(float(shuge), int(shuge),
771 "float(shuge) should not equal int(shuge)")
Tim Peters83e7ccc2001-09-04 06:37:28 +0000772
Walter Dörwalda0021592005-06-13 21:44:48 +0000773 def test_logs(self):
Walter Dörwalda0021592005-06-13 21:44:48 +0000774 LOG10E = math.log10(math.e)
Tim Peters307fa782004-09-23 08:06:40 +0000775
Walter Dörwalda0021592005-06-13 21:44:48 +0000776 for exp in range(10) + [100, 1000, 10000]:
777 value = 10 ** exp
778 log10 = math.log10(value)
779 self.assertAlmostEqual(log10, exp)
Tim Peters78526162001-09-05 00:53:45 +0000780
Walter Dörwalda0021592005-06-13 21:44:48 +0000781 # log10(value) == exp, so log(value) == log10(value)/log10(e) ==
782 # exp/LOG10E
783 expected = exp / LOG10E
784 log = math.log(value)
785 self.assertAlmostEqual(log, expected)
Tim Peters78526162001-09-05 00:53:45 +0000786
Walter Dörwalda0021592005-06-13 21:44:48 +0000787 for bad in -(1L << 10000), -2L, 0L:
788 self.assertRaises(ValueError, math.log, bad)
789 self.assertRaises(ValueError, math.log10, bad)
Tim Peters78526162001-09-05 00:53:45 +0000790
Walter Dörwalda0021592005-06-13 21:44:48 +0000791 def test_mixed_compares(self):
792 eq = self.assertEqual
Tim Peters78526162001-09-05 00:53:45 +0000793
Walter Dörwalda0021592005-06-13 21:44:48 +0000794 # We're mostly concerned with that mixing floats and longs does the
795 # right stuff, even when longs are too large to fit in a float.
796 # The safest way to check the results is to use an entirely different
797 # method, which we do here via a skeletal rational class (which
798 # represents all Python ints, longs and floats exactly).
799 class Rat:
800 def __init__(self, value):
801 if isinstance(value, (int, long)):
802 self.n = value
803 self.d = 1
804 elif isinstance(value, float):
805 # Convert to exact rational equivalent.
806 f, e = math.frexp(abs(value))
807 assert f == 0 or 0.5 <= f < 1.0
808 # |value| = f * 2**e exactly
Tim Peters78526162001-09-05 00:53:45 +0000809
Walter Dörwalda0021592005-06-13 21:44:48 +0000810 # Suck up CHUNK bits at a time; 28 is enough so that we suck
811 # up all bits in 2 iterations for all known binary double-
812 # precision formats, and small enough to fit in an int.
813 CHUNK = 28
814 top = 0
815 # invariant: |value| = (top + f) * 2**e exactly
816 while f:
817 f = math.ldexp(f, CHUNK)
818 digit = int(f)
819 assert digit >> CHUNK == 0
820 top = (top << CHUNK) | digit
821 f -= digit
822 assert 0.0 <= f < 1.0
823 e -= CHUNK
Tim Peters78526162001-09-05 00:53:45 +0000824
Walter Dörwalda0021592005-06-13 21:44:48 +0000825 # Now |value| = top * 2**e exactly.
826 if e >= 0:
827 n = top << e
828 d = 1
829 else:
830 n = top
831 d = 1 << -e
832 if value < 0:
833 n = -n
834 self.n = n
835 self.d = d
836 assert float(n) / float(d) == value
Tim Peters307fa782004-09-23 08:06:40 +0000837 else:
Georg Brandldf8a3032010-02-06 23:08:00 +0000838 raise TypeError("can't deal with %r" % value)
Tim Peters307fa782004-09-23 08:06:40 +0000839
Walter Dörwalda0021592005-06-13 21:44:48 +0000840 def __cmp__(self, other):
841 if not isinstance(other, Rat):
842 other = Rat(other)
843 return cmp(self.n * other.d, self.d * other.n)
Tim Peters307fa782004-09-23 08:06:40 +0000844
Walter Dörwalda0021592005-06-13 21:44:48 +0000845 cases = [0, 0.001, 0.99, 1.0, 1.5, 1e20, 1e200]
846 # 2**48 is an important boundary in the internals. 2**53 is an
847 # important boundary for IEEE double precision.
848 for t in 2.0**48, 2.0**50, 2.0**53:
849 cases.extend([t - 1.0, t - 0.3, t, t + 0.3, t + 1.0,
850 long(t-1), long(t), long(t+1)])
851 cases.extend([0, 1, 2, sys.maxint, float(sys.maxint)])
852 # 1L<<20000 should exceed all double formats. long(1e200) is to
853 # check that we get equality with 1e200 above.
854 t = long(1e200)
855 cases.extend([0L, 1L, 2L, 1L << 20000, t-1, t, t+1])
856 cases.extend([-x for x in cases])
857 for x in cases:
858 Rx = Rat(x)
859 for y in cases:
860 Ry = Rat(y)
861 Rcmp = cmp(Rx, Ry)
862 xycmp = cmp(x, y)
863 eq(Rcmp, xycmp, Frm("%r %r %d %d", x, y, Rcmp, xycmp))
864 eq(x == y, Rcmp == 0, Frm("%r == %r %d", x, y, Rcmp))
865 eq(x != y, Rcmp != 0, Frm("%r != %r %d", x, y, Rcmp))
866 eq(x < y, Rcmp < 0, Frm("%r < %r %d", x, y, Rcmp))
867 eq(x <= y, Rcmp <= 0, Frm("%r <= %r %d", x, y, Rcmp))
868 eq(x > y, Rcmp > 0, Frm("%r > %r %d", x, y, Rcmp))
869 eq(x >= y, Rcmp >= 0, Frm("%r >= %r %d", x, y, Rcmp))
Tim Peters307fa782004-09-23 08:06:40 +0000870
Christian Heimes8267d1d2008-01-04 00:37:34 +0000871 def test_nan_inf(self):
872 self.assertRaises(OverflowError, long, float('inf'))
Mark Dickinsonb6467572008-08-04 21:30:09 +0000873 self.assertRaises(OverflowError, long, float('-inf'))
874 self.assertRaises(ValueError, long, float('nan'))
Christian Heimes8267d1d2008-01-04 00:37:34 +0000875
Mark Dickinson1a707982008-12-17 16:14:37 +0000876 def test_bit_length(self):
877 tiny = 1e-10
878 for x in xrange(-65000, 65000):
879 x = long(x)
880 k = x.bit_length()
881 # Check equivalence with Python version
882 self.assertEqual(k, len(bin(x).lstrip('-0b')))
883 # Behaviour as specified in the docs
884 if x != 0:
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000885 self.assertTrue(2**(k-1) <= abs(x) < 2**k)
Mark Dickinson1a707982008-12-17 16:14:37 +0000886 else:
887 self.assertEqual(k, 0)
888 # Alternative definition: x.bit_length() == 1 + floor(log_2(x))
889 if x != 0:
890 # When x is an exact power of 2, numeric errors can
891 # cause floor(log(x)/log(2)) to be one too small; for
892 # small x this can be fixed by adding a small quantity
893 # to the quotient before taking the floor.
894 self.assertEqual(k, 1 + math.floor(
895 math.log(abs(x))/math.log(2) + tiny))
896
897 self.assertEqual((0L).bit_length(), 0)
898 self.assertEqual((1L).bit_length(), 1)
899 self.assertEqual((-1L).bit_length(), 1)
900 self.assertEqual((2L).bit_length(), 2)
901 self.assertEqual((-2L).bit_length(), 2)
902 for i in [2, 3, 15, 16, 17, 31, 32, 33, 63, 64, 234]:
903 a = 2L**i
904 self.assertEqual((a-1).bit_length(), i)
905 self.assertEqual((1-a).bit_length(), i)
906 self.assertEqual((a).bit_length(), i+1)
907 self.assertEqual((-a).bit_length(), i+1)
908 self.assertEqual((a+1).bit_length(), i+1)
909 self.assertEqual((-a-1).bit_length(), i+1)
910
911
Walter Dörwalda0021592005-06-13 21:44:48 +0000912def test_main():
913 test_support.run_unittest(LongTest)
Tim Peters307fa782004-09-23 08:06:40 +0000914
Walter Dörwalda0021592005-06-13 21:44:48 +0000915if __name__ == "__main__":
916 test_main()