blob: 58cfc3a2a334da26180fb8d8bff97b6368b39a79 [file] [log] [blame]
Walter Dörwalda0021592005-06-13 21:44:48 +00001import unittest
2from test import test_support
Benjamin Peterson979395b2008-05-03 21:35:18 +00003import sys
Walter Dörwalda0021592005-06-13 21:44:48 +00004
5import random
Mark Dickinson1a707982008-12-17 16:14:37 +00006import math
Walter Dörwalda0021592005-06-13 21:44:48 +00007
8# Used for lazy formatting of failure messages
9class Frm(object):
10 def __init__(self, format, *args):
11 self.format = format
12 self.args = args
13
14 def __str__(self):
15 return self.format % self.args
Guido van Rossum4365cab1998-08-13 14:20:17 +000016
17# SHIFT should match the value in longintrepr.h for best testing.
Mark Dickinsonefc82f72009-03-20 15:51:55 +000018SHIFT = sys.long_info.bits_per_digit
Guido van Rossum4365cab1998-08-13 14:20:17 +000019BASE = 2 ** SHIFT
20MASK = BASE - 1
Tim Petersdaec9612004-08-30 23:18:23 +000021KARATSUBA_CUTOFF = 70 # from longobject.c
Guido van Rossum4365cab1998-08-13 14:20:17 +000022
23# Max number of base BASE digits to use in test cases. Doubling
Tim Peters28b0e2a2002-08-13 02:17:11 +000024# this will more than double the runtime.
25MAXDIGITS = 15
Guido van Rossum4365cab1998-08-13 14:20:17 +000026
Guido van Rossum4581a0c1998-10-02 01:19:48 +000027# build some special values
28special = map(long, [0, 1, 2, BASE, BASE >> 1])
29special.append(0x5555555555555555L)
30special.append(0xaaaaaaaaaaaaaaaaL)
31# some solid strings of one bits
32p2 = 4L # 0 and 1 already added
33for i in range(2*SHIFT):
34 special.append(p2 - 1)
35 p2 = p2 << 1
36del p2
37# add complements & negations
38special = special + map(lambda x: ~x, special) + \
39 map(lambda x: -x, special)
40
Benjamin Peterson979395b2008-05-03 21:35:18 +000041L = [
42 ('0', 0),
43 ('1', 1),
44 ('9', 9),
45 ('10', 10),
46 ('99', 99),
47 ('100', 100),
48 ('314', 314),
49 (' 314', 314),
50 ('314 ', 314),
51 (' \t\t 314 \t\t ', 314),
52 (repr(sys.maxint), sys.maxint),
53 (' 1x', ValueError),
54 (' 1 ', 1),
55 (' 1\02 ', ValueError),
56 ('', ValueError),
57 (' ', ValueError),
58 (' \t\t ', ValueError)
59]
60if test_support.have_unicode:
61 L += [
62 (unicode('0'), 0),
63 (unicode('1'), 1),
64 (unicode('9'), 9),
65 (unicode('10'), 10),
66 (unicode('99'), 99),
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),
73 (unicode(' 1 '), 1),
74 (unicode(' 1\02 '), ValueError),
75 (unicode(''), ValueError),
76 (unicode(' '), ValueError),
77 (unicode(' \t\t '), ValueError),
78 (unichr(0x200), ValueError),
79]
80
Guido van Rossum4365cab1998-08-13 14:20:17 +000081
Walter Dörwalda0021592005-06-13 21:44:48 +000082class LongTest(unittest.TestCase):
Guido van Rossum4365cab1998-08-13 14:20:17 +000083
Walter Dörwalda0021592005-06-13 21:44:48 +000084 # 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.
Guido van Rossum4365cab1998-08-13 14:20:17 +000089
Walter Dörwalda0021592005-06-13 21:44:48 +000090 def getran(self, ndigits):
Benjamin Peterson5c8da862009-06-30 22:57:08 +000091 self.assertTrue(ndigits > 0)
Walter Dörwalda0021592005-06-13 21:44:48 +000092 nbits_hi = ndigits * SHIFT
93 nbits_lo = nbits_hi - SHIFT + 1
94 answer = 0L
95 nbits = 0
96 r = int(random.random() * (SHIFT * 2)) | 1 # force 1 bits to start
97 while nbits < nbits_lo:
98 bits = (r >> 1) + 1
99 bits = min(bits, nbits_hi - nbits)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000100 self.assertTrue(1 <= bits <= SHIFT)
Walter Dörwalda0021592005-06-13 21:44:48 +0000101 nbits = nbits + bits
102 answer = answer << bits
103 if r & 1:
104 answer = answer | ((1 << bits) - 1)
105 r = int(random.random() * (SHIFT * 2))
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000106 self.assertTrue(nbits_lo <= nbits <= nbits_hi)
Walter Dörwalda0021592005-06-13 21:44:48 +0000107 if random.random() < 0.5:
108 answer = -answer
109 return answer
Guido van Rossum4581a0c1998-10-02 01:19:48 +0000110
Walter Dörwalda0021592005-06-13 21:44:48 +0000111 # Get random long consisting of ndigits random digits (relative to base
112 # BASE). The sign bit is also random.
Guido van Rossum4581a0c1998-10-02 01:19:48 +0000113
Walter Dörwalda0021592005-06-13 21:44:48 +0000114 def getran2(ndigits):
115 answer = 0L
116 for i in xrange(ndigits):
117 answer = (answer << SHIFT) | random.randint(0, MASK)
118 if random.random() < 0.5:
119 answer = -answer
120 return answer
Guido van Rossum4365cab1998-08-13 14:20:17 +0000121
Walter Dörwalda0021592005-06-13 21:44:48 +0000122 def check_division(self, x, y):
123 eq = self.assertEqual
124 q, r = divmod(x, y)
125 q2, r2 = x//y, x%y
126 pab, pba = x*y, y*x
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))
131 if y > 0:
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000132 self.assertTrue(0 <= r < y, Frm("bad mod from divmod on %r and %r", x, y))
Walter Dörwalda0021592005-06-13 21:44:48 +0000133 else:
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000134 self.assertTrue(y < r <= 0, Frm("bad mod from divmod on %r and %r", x, y))
Guido van Rossum4365cab1998-08-13 14:20:17 +0000135
Walter Dörwalda0021592005-06-13 21:44:48 +0000136 def test_division(self):
137 digits = range(1, MAXDIGITS+1) + range(KARATSUBA_CUTOFF,
138 KARATSUBA_CUTOFF + 14)
139 digits.append(KARATSUBA_CUTOFF * 3)
140 for lenx in digits:
141 x = self.getran(lenx)
142 for leny in digits:
143 y = self.getran(leny) or 1L
144 self.check_division(x, y)
Guido van Rossum4365cab1998-08-13 14:20:17 +0000145
Mark Dickinsonefc82f72009-03-20 15:51:55 +0000146 # specific numbers chosen to exercise corner cases of the
147 # current long division implementation
148
149 # 30-bit cases involving a quotient digit estimate of BASE+1
150 self.check_division(1231948412290879395966702881L,
151 1147341367131428698L)
152 self.check_division(815427756481275430342312021515587883L,
153 707270836069027745L)
154 self.check_division(627976073697012820849443363563599041L,
155 643588798496057020L)
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)
163
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)
172
173
174
Walter Dörwalda0021592005-06-13 21:44:48 +0000175 def test_karatsuba(self):
176 digits = range(1, 5) + range(KARATSUBA_CUTOFF, KARATSUBA_CUTOFF + 10)
177 digits.extend([KARATSUBA_CUTOFF * 10, KARATSUBA_CUTOFF * 100])
Guido van Rossum4365cab1998-08-13 14:20:17 +0000178
Walter Dörwalda0021592005-06-13 21:44:48 +0000179 bits = [digit * SHIFT for digit in digits]
Guido van Rossum4365cab1998-08-13 14:20:17 +0000180
Walter Dörwalda0021592005-06-13 21:44:48 +0000181 # 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.
183 for abits in bits:
184 a = (1L << abits) - 1
185 for bbits in bits:
186 if bbits < abits:
187 continue
188 b = (1L << bbits) - 1
189 x = a * b
190 y = ((1L << (abits + bbits)) -
191 (1L << abits) -
192 (1L << bbits) +
193 1)
194 self.assertEqual(x, y,
195 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 +0000196
Walter Dörwalda0021592005-06-13 21:44:48 +0000197 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):
215 p2 = 2L ** n
216 eq(x << n >> n, x,
217 Frm("x << n >> n != x for x=%r, n=%r", (x, n)))
218 eq(x // p2, x >> n,
219 Frm("x // p2 != x >> n for x=%r n=%r p2=%r", (x, n, p2)))
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 << 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)))
Tim Peters7f270ba2002-08-13 21:06:55 +0000226
Walter Dörwalda0021592005-06-13 21:44:48 +0000227 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)))
Tim Peters7f270ba2002-08-13 21:06:55 +0000241
Walter Dörwalda0021592005-06-13 21:44:48 +0000242 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)))
Tim Peters7f270ba2002-08-13 21:06:55 +0000254
Walter Dörwalda0021592005-06-13 21:44:48 +0000255 def test_bitop_identities(self):
256 for x in special:
257 self.check_bitop_identities_1(x)
258 digits = xrange(1, MAXDIGITS+1)
259 for lenx in digits:
260 x = self.getran(lenx)
261 self.check_bitop_identities_1(x)
262 for leny in digits:
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))
Guido van Rossum4365cab1998-08-13 14:20:17 +0000266
Walter Dörwalda0021592005-06-13 21:44:48 +0000267 def slow_format(self, x, base):
268 if (x, base) == (0, 8):
269 # this is an oddball!
270 return "0L"
271 digits = []
272 sign = 0
273 if x < 0:
274 sign, x = 1, -x
275 while x:
276 x, r = divmod(x, base)
277 digits.append(int(r))
278 digits.reverse()
279 digits = digits or [0]
280 return '-'[:sign] + \
281 {8: '0', 10: '', 16: '0x'}[base] + \
Raymond Hettinger3296e692005-06-29 23:29:56 +0000282 "".join(map(lambda i: "0123456789abcdef"[i], digits)) + "L"
Guido van Rossum4365cab1998-08-13 14:20:17 +0000283
Walter Dörwalda0021592005-06-13 21:44:48 +0000284 def check_format_1(self, x):
285 for base, mapper in (8, oct), (10, repr), (16, hex):
286 got = mapper(x)
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
293 # trailing "L"
294 got = str(x)
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)
Guido van Rossum4365cab1998-08-13 14:20:17 +0000299
Walter Dörwalda0021592005-06-13 21:44:48 +0000300 def test_format(self):
301 for x in special:
302 self.check_format_1(x)
303 for i in xrange(10):
304 for lenx in xrange(1, MAXDIGITS+1):
305 x = self.getran(lenx)
306 self.check_format_1(x)
Guido van Rossum4365cab1998-08-13 14:20:17 +0000307
Benjamin Peterson979395b2008-05-03 21:35:18 +0000308 def test_long(self):
309 self.assertEqual(long(314), 314L)
310 self.assertEqual(long(3.14), 3L)
311 self.assertEqual(long(314L), 314L)
Amaury Forgeot d'Arcd3ffb892008-09-09 07:24:30 +0000312 # 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)
Benjamin Peterson979395b2008-05-03 21:35:18 +0000316 # 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)
Mark Dickinson20665592010-05-25 19:01:08 +0000323 self.assertEqual(long("0b10", 2), 2L)
324 self.assertEqual(long("0o10", 8), 8L)
325 self.assertEqual(long("0x10", 16), 16L)
Benjamin Peterson979395b2008-05-03 21:35:18 +0000326 if test_support.have_unicode:
327 self.assertEqual(long(unicode("-3")), -3L)
328 # Different base:
329 self.assertEqual(long("10",16), 16L)
330 if test_support.have_unicode:
331 self.assertEqual(long(unicode("10"),16), 16L)
332 # Check conversions from string (same test set as for int(), and then some)
333 LL = [
334 ('1' + '0'*20, 10L**20),
335 ('1' + '0'*100, 10L**100)
336 ]
337 L2 = L[:]
338 if test_support.have_unicode:
339 L2 += [
340 (unicode('1') + unicode('0')*20, 10L**20),
341 (unicode('1') + unicode('0')*100, 10L**100),
342 ]
343 for s, v in L2 + LL:
344 for sign in "", "+", "-":
345 for prefix in "", " ", "\t", " \t\t ":
346 ss = prefix + sign + s
347 vv = v
348 if sign == "-" and v is not ValueError:
349 vv = -v
350 try:
351 self.assertEqual(long(ss), long(vv))
352 except v:
353 pass
354
355 self.assertRaises(ValueError, long, '123\0')
356 self.assertRaises(ValueError, long, '53', 40)
357 self.assertRaises(TypeError, long, 1, 12)
358
Mark Dickinson784a47f2010-05-26 19:06:33 +0000359 # tests with base 0
360 self.assertEqual(long(' 0123 ', 0), 83)
361 self.assertEqual(long(' 0123 ', 0), 83)
362 self.assertEqual(long('000', 0), 0)
363 self.assertEqual(long('0o123', 0), 83)
364 self.assertEqual(long('0x123', 0), 291)
365 self.assertEqual(long('0b100', 0), 4)
366 self.assertEqual(long(' 0O123 ', 0), 83)
367 self.assertEqual(long(' 0X123 ', 0), 291)
368 self.assertEqual(long(' 0B100 ', 0), 4)
369 self.assertEqual(long('0', 0), 0)
370 self.assertEqual(long('+0', 0), 0)
371 self.assertEqual(long('-0', 0), 0)
372 self.assertEqual(long('00', 0), 0)
373 self.assertRaises(ValueError, long, '08', 0)
374 self.assertRaises(ValueError, long, '-012395', 0)
375
Benjamin Peterson979395b2008-05-03 21:35:18 +0000376 # SF patch #1638879: embedded NULs were not detected with
377 # explicit base
378 self.assertRaises(ValueError, long, '123\0', 10)
379 self.assertRaises(ValueError, long, '123\x00 245', 20)
380
381 self.assertEqual(long('100000000000000000000000000000000', 2),
382 4294967296)
383 self.assertEqual(long('102002022201221111211', 3), 4294967296)
384 self.assertEqual(long('10000000000000000', 4), 4294967296)
385 self.assertEqual(long('32244002423141', 5), 4294967296)
386 self.assertEqual(long('1550104015504', 6), 4294967296)
387 self.assertEqual(long('211301422354', 7), 4294967296)
388 self.assertEqual(long('40000000000', 8), 4294967296)
389 self.assertEqual(long('12068657454', 9), 4294967296)
390 self.assertEqual(long('4294967296', 10), 4294967296)
391 self.assertEqual(long('1904440554', 11), 4294967296)
392 self.assertEqual(long('9ba461594', 12), 4294967296)
393 self.assertEqual(long('535a79889', 13), 4294967296)
394 self.assertEqual(long('2ca5b7464', 14), 4294967296)
395 self.assertEqual(long('1a20dcd81', 15), 4294967296)
396 self.assertEqual(long('100000000', 16), 4294967296)
397 self.assertEqual(long('a7ffda91', 17), 4294967296)
398 self.assertEqual(long('704he7g4', 18), 4294967296)
399 self.assertEqual(long('4f5aff66', 19), 4294967296)
400 self.assertEqual(long('3723ai4g', 20), 4294967296)
401 self.assertEqual(long('281d55i4', 21), 4294967296)
402 self.assertEqual(long('1fj8b184', 22), 4294967296)
403 self.assertEqual(long('1606k7ic', 23), 4294967296)
404 self.assertEqual(long('mb994ag', 24), 4294967296)
405 self.assertEqual(long('hek2mgl', 25), 4294967296)
406 self.assertEqual(long('dnchbnm', 26), 4294967296)
407 self.assertEqual(long('b28jpdm', 27), 4294967296)
408 self.assertEqual(long('8pfgih4', 28), 4294967296)
409 self.assertEqual(long('76beigg', 29), 4294967296)
410 self.assertEqual(long('5qmcpqg', 30), 4294967296)
411 self.assertEqual(long('4q0jto4', 31), 4294967296)
412 self.assertEqual(long('4000000', 32), 4294967296)
413 self.assertEqual(long('3aokq94', 33), 4294967296)
414 self.assertEqual(long('2qhxjli', 34), 4294967296)
415 self.assertEqual(long('2br45qb', 35), 4294967296)
416 self.assertEqual(long('1z141z4', 36), 4294967296)
417
418 self.assertEqual(long('100000000000000000000000000000001', 2),
419 4294967297)
420 self.assertEqual(long('102002022201221111212', 3), 4294967297)
421 self.assertEqual(long('10000000000000001', 4), 4294967297)
422 self.assertEqual(long('32244002423142', 5), 4294967297)
423 self.assertEqual(long('1550104015505', 6), 4294967297)
424 self.assertEqual(long('211301422355', 7), 4294967297)
425 self.assertEqual(long('40000000001', 8), 4294967297)
426 self.assertEqual(long('12068657455', 9), 4294967297)
427 self.assertEqual(long('4294967297', 10), 4294967297)
428 self.assertEqual(long('1904440555', 11), 4294967297)
429 self.assertEqual(long('9ba461595', 12), 4294967297)
430 self.assertEqual(long('535a7988a', 13), 4294967297)
431 self.assertEqual(long('2ca5b7465', 14), 4294967297)
432 self.assertEqual(long('1a20dcd82', 15), 4294967297)
433 self.assertEqual(long('100000001', 16), 4294967297)
434 self.assertEqual(long('a7ffda92', 17), 4294967297)
435 self.assertEqual(long('704he7g5', 18), 4294967297)
436 self.assertEqual(long('4f5aff67', 19), 4294967297)
437 self.assertEqual(long('3723ai4h', 20), 4294967297)
438 self.assertEqual(long('281d55i5', 21), 4294967297)
439 self.assertEqual(long('1fj8b185', 22), 4294967297)
440 self.assertEqual(long('1606k7id', 23), 4294967297)
441 self.assertEqual(long('mb994ah', 24), 4294967297)
442 self.assertEqual(long('hek2mgm', 25), 4294967297)
443 self.assertEqual(long('dnchbnn', 26), 4294967297)
444 self.assertEqual(long('b28jpdn', 27), 4294967297)
445 self.assertEqual(long('8pfgih5', 28), 4294967297)
446 self.assertEqual(long('76beigh', 29), 4294967297)
447 self.assertEqual(long('5qmcpqh', 30), 4294967297)
448 self.assertEqual(long('4q0jto5', 31), 4294967297)
449 self.assertEqual(long('4000001', 32), 4294967297)
450 self.assertEqual(long('3aokq95', 33), 4294967297)
451 self.assertEqual(long('2qhxjlj', 34), 4294967297)
452 self.assertEqual(long('2br45qc', 35), 4294967297)
453 self.assertEqual(long('1z141z5', 36), 4294967297)
454
455
456 def test_conversion(self):
457 # Test __long__()
458 class ClassicMissingMethods:
459 pass
460 self.assertRaises(AttributeError, long, ClassicMissingMethods())
461
462 class MissingMethods(object):
463 pass
464 self.assertRaises(TypeError, long, MissingMethods())
465
466 class Foo0:
467 def __long__(self):
468 return 42L
469
470 class Foo1(object):
471 def __long__(self):
472 return 42L
473
474 class Foo2(long):
475 def __long__(self):
476 return 42L
477
478 class Foo3(long):
479 def __long__(self):
480 return self
481
482 class Foo4(long):
483 def __long__(self):
484 return 42
485
486 class Foo5(long):
487 def __long__(self):
488 return 42.
489
490 self.assertEqual(long(Foo0()), 42L)
491 self.assertEqual(long(Foo1()), 42L)
492 self.assertEqual(long(Foo2()), 42L)
493 self.assertEqual(long(Foo3()), 0)
494 self.assertEqual(long(Foo4()), 42)
495 self.assertRaises(TypeError, long, Foo5())
496
497 class Classic:
498 pass
499 for base in (object, Classic):
500 class LongOverridesTrunc(base):
501 def __long__(self):
502 return 42
503 def __trunc__(self):
504 return -12
505 self.assertEqual(long(LongOverridesTrunc()), 42)
506
507 class JustTrunc(base):
508 def __trunc__(self):
509 return 42
510 self.assertEqual(long(JustTrunc()), 42)
511
512 for trunc_result_base in (object, Classic):
513 class Integral(trunc_result_base):
514 def __int__(self):
515 return 42
516
517 class TruncReturnsNonLong(base):
518 def __trunc__(self):
519 return Integral()
520 self.assertEqual(long(TruncReturnsNonLong()), 42)
521
522 class NonIntegral(trunc_result_base):
523 def __trunc__(self):
524 # Check that we avoid infinite recursion.
525 return NonIntegral()
526
527 class TruncReturnsNonIntegral(base):
528 def __trunc__(self):
529 return NonIntegral()
530 try:
531 long(TruncReturnsNonIntegral())
532 except TypeError as e:
Ezio Melotti2623a372010-11-21 13:34:58 +0000533 self.assertEqual(str(e),
534 "__trunc__ returned non-Integral"
535 " (type NonIntegral)")
Benjamin Peterson979395b2008-05-03 21:35:18 +0000536 else:
537 self.fail("Failed to raise TypeError with %s" %
538 ((base, trunc_result_base),))
539
Walter Dörwalda0021592005-06-13 21:44:48 +0000540 def test_misc(self):
Guido van Rossum4365cab1998-08-13 14:20:17 +0000541
Walter Dörwalda0021592005-06-13 21:44:48 +0000542 # check the extremes in int<->long conversion
543 hugepos = sys.maxint
544 hugeneg = -hugepos - 1
545 hugepos_aslong = long(hugepos)
546 hugeneg_aslong = long(hugeneg)
547 self.assertEqual(hugepos, hugepos_aslong, "long(sys.maxint) != sys.maxint")
548 self.assertEqual(hugeneg, hugeneg_aslong,
549 "long(-sys.maxint-1) != -sys.maxint-1")
Guido van Rossum4365cab1998-08-13 14:20:17 +0000550
Walter Dörwalda0021592005-06-13 21:44:48 +0000551 # long -> int should not fail for hugepos_aslong or hugeneg_aslong
Armin Rigo7ccbca92006-10-04 12:17:45 +0000552 x = int(hugepos_aslong)
Walter Dörwalda0021592005-06-13 21:44:48 +0000553 try:
Armin Rigo7ccbca92006-10-04 12:17:45 +0000554 self.assertEqual(x, hugepos,
Walter Dörwalda0021592005-06-13 21:44:48 +0000555 "converting sys.maxint to long and back to int fails")
556 except OverflowError:
557 self.fail("int(long(sys.maxint)) overflowed!")
Armin Rigo7ccbca92006-10-04 12:17:45 +0000558 if not isinstance(x, int):
Georg Brandldf8a3032010-02-06 23:08:00 +0000559 self.fail("int(long(sys.maxint)) should have returned int")
Armin Rigo7ccbca92006-10-04 12:17:45 +0000560 x = int(hugeneg_aslong)
Walter Dörwalda0021592005-06-13 21:44:48 +0000561 try:
Armin Rigo7ccbca92006-10-04 12:17:45 +0000562 self.assertEqual(x, hugeneg,
Walter Dörwalda0021592005-06-13 21:44:48 +0000563 "converting -sys.maxint-1 to long and back to int fails")
564 except OverflowError:
565 self.fail("int(long(-sys.maxint-1)) overflowed!")
Armin Rigo7ccbca92006-10-04 12:17:45 +0000566 if not isinstance(x, int):
Georg Brandldf8a3032010-02-06 23:08:00 +0000567 self.fail("int(long(-sys.maxint-1)) should have returned int")
Walter Dörwalda0021592005-06-13 21:44:48 +0000568 # but long -> int should overflow for hugepos+1 and hugeneg-1
569 x = hugepos_aslong + 1
570 try:
571 y = int(x)
572 except OverflowError:
573 self.fail("int(long(sys.maxint) + 1) mustn't overflow")
Ezio Melottib0f5adc2010-01-24 16:58:36 +0000574 self.assertIsInstance(y, long,
Walter Dörwalda0021592005-06-13 21:44:48 +0000575 "int(long(sys.maxint) + 1) should have returned long")
Guido van Rossum4365cab1998-08-13 14:20:17 +0000576
Walter Dörwalda0021592005-06-13 21:44:48 +0000577 x = hugeneg_aslong - 1
578 try:
579 y = int(x)
580 except OverflowError:
581 self.fail("int(long(-sys.maxint-1) - 1) mustn't overflow")
Ezio Melottib0f5adc2010-01-24 16:58:36 +0000582 self.assertIsInstance(y, long,
Walter Dörwalda0021592005-06-13 21:44:48 +0000583 "int(long(-sys.maxint-1) - 1) should have returned long")
Guido van Rossum4365cab1998-08-13 14:20:17 +0000584
Walter Dörwalda0021592005-06-13 21:44:48 +0000585 class long2(long):
586 pass
587 x = long2(1L<<100)
Walter Dörwaldf1715402002-11-19 20:49:15 +0000588 y = int(x)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000589 self.assertTrue(type(y) is long,
Walter Dörwalda0021592005-06-13 21:44:48 +0000590 "overflowing int conversion must return long not long subtype")
Guido van Rossum4581a0c1998-10-02 01:19:48 +0000591
Armin Rigo7ccbca92006-10-04 12:17:45 +0000592 # long -> Py_ssize_t conversion
593 class X(object):
594 def __getslice__(self, i, j):
595 return i, j
596
Florent Xicluna07627882010-03-21 01:14:24 +0000597 with test_support.check_py3k_warnings():
598 self.assertEqual(X()[-5L:7L], (-5, 7))
599 # use the clamping effect to test the smallest and largest longs
600 # that fit a Py_ssize_t
601 slicemin, slicemax = X()[-2L**100:2L**100]
602 self.assertEqual(X()[slicemin:slicemax], (slicemin, slicemax))
Armin Rigo7ccbca92006-10-04 12:17:45 +0000603
Mark Dickinsoncb61e5d2010-09-26 10:37:12 +0000604 def test_issue9869(self):
605 # Issue 9869: Interpreter crash when initializing an instance
606 # of a long subclass from an object whose __long__ method returns
607 # a plain int.
608 class BadLong(object):
609 def __long__(self):
610 return 1000000
611
612 class MyLong(long):
613 pass
614
615 x = MyLong(BadLong())
616 self.assertIsInstance(x, long)
617 self.assertEqual(x, 1000000)
618
619
Tim Peters26c7fa32001-08-23 22:56:21 +0000620# ----------------------------------- tests of auto int->long conversion
621
Walter Dörwalda0021592005-06-13 21:44:48 +0000622 def test_auto_overflow(self):
Walter Dörwalda0021592005-06-13 21:44:48 +0000623 special = [0, 1, 2, 3, sys.maxint-1, sys.maxint, sys.maxint+1]
624 sqrt = int(math.sqrt(sys.maxint))
625 special.extend([sqrt-1, sqrt, sqrt+1])
626 special.extend([-i for i in special])
Tim Peters26c7fa32001-08-23 22:56:21 +0000627
Walter Dörwalda0021592005-06-13 21:44:48 +0000628 def checkit(*args):
629 # Heavy use of nested scopes here!
630 self.assertEqual(got, expected,
631 Frm("for %r expected %r got %r", args, expected, got))
Tim Peters26c7fa32001-08-23 22:56:21 +0000632
Walter Dörwalda0021592005-06-13 21:44:48 +0000633 for x in special:
634 longx = long(x)
Tim Peters26c7fa32001-08-23 22:56:21 +0000635
Walter Dörwalda0021592005-06-13 21:44:48 +0000636 expected = -longx
637 got = -x
638 checkit('-', x)
Tim Peters26c7fa32001-08-23 22:56:21 +0000639
Walter Dörwalda0021592005-06-13 21:44:48 +0000640 for y in special:
641 longy = long(y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000642
Walter Dörwalda0021592005-06-13 21:44:48 +0000643 expected = longx + longy
644 got = x + y
645 checkit(x, '+', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000646
Walter Dörwalda0021592005-06-13 21:44:48 +0000647 expected = longx - longy
648 got = x - y
649 checkit(x, '-', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000650
Walter Dörwalda0021592005-06-13 21:44:48 +0000651 expected = longx * longy
652 got = x * y
653 checkit(x, '*', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000654
Walter Dörwalda0021592005-06-13 21:44:48 +0000655 if y:
Florent Xicluna07627882010-03-21 01:14:24 +0000656 with test_support.check_py3k_warnings():
657 expected = longx / longy
658 got = x / y
Walter Dörwalda0021592005-06-13 21:44:48 +0000659 checkit(x, '/', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000660
Walter Dörwalda0021592005-06-13 21:44:48 +0000661 expected = longx // longy
662 got = x // y
663 checkit(x, '//', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000664
Walter Dörwalda0021592005-06-13 21:44:48 +0000665 expected = divmod(longx, longy)
666 got = divmod(longx, longy)
667 checkit(x, 'divmod', y)
Tim Petersa3653092001-08-23 23:02:57 +0000668
Walter Dörwalda0021592005-06-13 21:44:48 +0000669 if abs(y) < 5 and not (x == 0 and y < 0):
670 expected = longx ** longy
671 got = x ** y
672 checkit(x, '**', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000673
Walter Dörwalda0021592005-06-13 21:44:48 +0000674 for z in special:
675 if z != 0 :
676 if y >= 0:
677 expected = pow(longx, longy, long(z))
678 got = pow(x, y, z)
679 checkit('pow', x, y, '%', z)
Tim Peters32f453e2001-09-03 08:35:41 +0000680 else:
Walter Dörwalda0021592005-06-13 21:44:48 +0000681 self.assertRaises(TypeError, pow,longx, longy, long(z))
Tim Peters26c7fa32001-08-23 22:56:21 +0000682
Mark Dickinson6736cf82009-04-20 21:13:33 +0000683 @unittest.skipUnless(float.__getformat__("double").startswith("IEEE"),
684 "test requires IEEE 754 doubles")
685 def test_float_conversion(self):
686 import sys
687 DBL_MAX = sys.float_info.max
688 DBL_MAX_EXP = sys.float_info.max_exp
689 DBL_MANT_DIG = sys.float_info.mant_dig
690
691 exact_values = [0L, 1L, 2L,
692 long(2**53-3),
693 long(2**53-2),
694 long(2**53-1),
695 long(2**53),
696 long(2**53+2),
697 long(2**54-4),
698 long(2**54-2),
699 long(2**54),
700 long(2**54+4)]
701 for x in exact_values:
702 self.assertEqual(long(float(x)), x)
703 self.assertEqual(long(float(-x)), -x)
704
705 # test round-half-even
706 for x, y in [(1, 0), (2, 2), (3, 4), (4, 4), (5, 4), (6, 6), (7, 8)]:
707 for p in xrange(15):
708 self.assertEqual(long(float(2L**p*(2**53+x))), 2L**p*(2**53+y))
709
710 for x, y in [(0, 0), (1, 0), (2, 0), (3, 4), (4, 4), (5, 4), (6, 8),
711 (7, 8), (8, 8), (9, 8), (10, 8), (11, 12), (12, 12),
712 (13, 12), (14, 16), (15, 16)]:
713 for p in xrange(15):
714 self.assertEqual(long(float(2L**p*(2**54+x))), 2L**p*(2**54+y))
715
716 # behaviour near extremes of floating-point range
717 long_dbl_max = long(DBL_MAX)
718 top_power = 2**DBL_MAX_EXP
Mark Dickinsona7e734f2009-04-20 21:41:04 +0000719 halfway = (long_dbl_max + top_power)//2
Mark Dickinson6736cf82009-04-20 21:13:33 +0000720 self.assertEqual(float(long_dbl_max), DBL_MAX)
721 self.assertEqual(float(long_dbl_max+1), DBL_MAX)
722 self.assertEqual(float(halfway-1), DBL_MAX)
723 self.assertRaises(OverflowError, float, halfway)
724 self.assertEqual(float(1-halfway), -DBL_MAX)
725 self.assertRaises(OverflowError, float, -halfway)
726 self.assertRaises(OverflowError, float, top_power-1)
727 self.assertRaises(OverflowError, float, top_power)
728 self.assertRaises(OverflowError, float, top_power+1)
729 self.assertRaises(OverflowError, float, 2*top_power-1)
730 self.assertRaises(OverflowError, float, 2*top_power)
731 self.assertRaises(OverflowError, float, top_power*top_power)
732
733 for p in xrange(100):
734 x = long(2**p * (2**53 + 1) + 1)
735 y = long(2**p * (2**53+ 2))
736 self.assertEqual(long(float(x)), y)
737
738 x = long(2**p * (2**53 + 1))
739 y = long(2**p * 2**53)
740 self.assertEqual(long(float(x)), y)
741
Walter Dörwalda0021592005-06-13 21:44:48 +0000742 def test_float_overflow(self):
Walter Dörwalda0021592005-06-13 21:44:48 +0000743 for x in -2.0, -1.0, 0.0, 1.0, 2.0:
744 self.assertEqual(float(long(x)), x)
Tim Peters9fffa3e2001-09-04 05:14:19 +0000745
Walter Dörwalda0021592005-06-13 21:44:48 +0000746 shuge = '12345' * 120
747 huge = 1L << 30000
748 mhuge = -huge
749 namespace = {'huge': huge, 'mhuge': mhuge, 'shuge': shuge, 'math': math}
750 for test in ["float(huge)", "float(mhuge)",
751 "complex(huge)", "complex(mhuge)",
752 "complex(huge, 1)", "complex(mhuge, 1)",
753 "complex(1, huge)", "complex(1, mhuge)",
754 "1. + huge", "huge + 1.", "1. + mhuge", "mhuge + 1.",
755 "1. - huge", "huge - 1.", "1. - mhuge", "mhuge - 1.",
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 "math.sin(huge)", "math.sin(mhuge)",
761 "math.sqrt(huge)", "math.sqrt(mhuge)", # should do better
Jeffrey Yasskin9871d8f2008-01-05 08:47:13 +0000762 "math.floor(huge)", "math.floor(mhuge)"]:
Tim Peters9fffa3e2001-09-04 05:14:19 +0000763
Walter Dörwalda0021592005-06-13 21:44:48 +0000764 self.assertRaises(OverflowError, eval, test, namespace)
Tim Peters9fffa3e2001-09-04 05:14:19 +0000765
Walter Dörwalda0021592005-06-13 21:44:48 +0000766 # XXX Perhaps float(shuge) can raise OverflowError on some box?
767 # The comparison should not.
768 self.assertNotEqual(float(shuge), int(shuge),
769 "float(shuge) should not equal int(shuge)")
Tim Peters83e7ccc2001-09-04 06:37:28 +0000770
Walter Dörwalda0021592005-06-13 21:44:48 +0000771 def test_logs(self):
Walter Dörwalda0021592005-06-13 21:44:48 +0000772 LOG10E = math.log10(math.e)
Tim Peters307fa782004-09-23 08:06:40 +0000773
Walter Dörwalda0021592005-06-13 21:44:48 +0000774 for exp in range(10) + [100, 1000, 10000]:
775 value = 10 ** exp
776 log10 = math.log10(value)
777 self.assertAlmostEqual(log10, exp)
Tim Peters78526162001-09-05 00:53:45 +0000778
Walter Dörwalda0021592005-06-13 21:44:48 +0000779 # log10(value) == exp, so log(value) == log10(value)/log10(e) ==
780 # exp/LOG10E
781 expected = exp / LOG10E
782 log = math.log(value)
783 self.assertAlmostEqual(log, expected)
Tim Peters78526162001-09-05 00:53:45 +0000784
Walter Dörwalda0021592005-06-13 21:44:48 +0000785 for bad in -(1L << 10000), -2L, 0L:
786 self.assertRaises(ValueError, math.log, bad)
787 self.assertRaises(ValueError, math.log10, bad)
Tim Peters78526162001-09-05 00:53:45 +0000788
Walter Dörwalda0021592005-06-13 21:44:48 +0000789 def test_mixed_compares(self):
790 eq = self.assertEqual
Tim Peters78526162001-09-05 00:53:45 +0000791
Walter Dörwalda0021592005-06-13 21:44:48 +0000792 # We're mostly concerned with that mixing floats and longs does the
793 # right stuff, even when longs are too large to fit in a float.
794 # The safest way to check the results is to use an entirely different
795 # method, which we do here via a skeletal rational class (which
796 # represents all Python ints, longs and floats exactly).
797 class Rat:
798 def __init__(self, value):
799 if isinstance(value, (int, long)):
800 self.n = value
801 self.d = 1
802 elif isinstance(value, float):
803 # Convert to exact rational equivalent.
804 f, e = math.frexp(abs(value))
805 assert f == 0 or 0.5 <= f < 1.0
806 # |value| = f * 2**e exactly
Tim Peters78526162001-09-05 00:53:45 +0000807
Walter Dörwalda0021592005-06-13 21:44:48 +0000808 # Suck up CHUNK bits at a time; 28 is enough so that we suck
809 # up all bits in 2 iterations for all known binary double-
810 # precision formats, and small enough to fit in an int.
811 CHUNK = 28
812 top = 0
813 # invariant: |value| = (top + f) * 2**e exactly
814 while f:
815 f = math.ldexp(f, CHUNK)
816 digit = int(f)
817 assert digit >> CHUNK == 0
818 top = (top << CHUNK) | digit
819 f -= digit
820 assert 0.0 <= f < 1.0
821 e -= CHUNK
Tim Peters78526162001-09-05 00:53:45 +0000822
Walter Dörwalda0021592005-06-13 21:44:48 +0000823 # Now |value| = top * 2**e exactly.
824 if e >= 0:
825 n = top << e
826 d = 1
827 else:
828 n = top
829 d = 1 << -e
830 if value < 0:
831 n = -n
832 self.n = n
833 self.d = d
834 assert float(n) / float(d) == value
Tim Peters307fa782004-09-23 08:06:40 +0000835 else:
Georg Brandldf8a3032010-02-06 23:08:00 +0000836 raise TypeError("can't deal with %r" % value)
Tim Peters307fa782004-09-23 08:06:40 +0000837
Walter Dörwalda0021592005-06-13 21:44:48 +0000838 def __cmp__(self, other):
839 if not isinstance(other, Rat):
840 other = Rat(other)
841 return cmp(self.n * other.d, self.d * other.n)
Tim Peters307fa782004-09-23 08:06:40 +0000842
Walter Dörwalda0021592005-06-13 21:44:48 +0000843 cases = [0, 0.001, 0.99, 1.0, 1.5, 1e20, 1e200]
844 # 2**48 is an important boundary in the internals. 2**53 is an
845 # important boundary for IEEE double precision.
846 for t in 2.0**48, 2.0**50, 2.0**53:
847 cases.extend([t - 1.0, t - 0.3, t, t + 0.3, t + 1.0,
848 long(t-1), long(t), long(t+1)])
849 cases.extend([0, 1, 2, sys.maxint, float(sys.maxint)])
850 # 1L<<20000 should exceed all double formats. long(1e200) is to
851 # check that we get equality with 1e200 above.
852 t = long(1e200)
853 cases.extend([0L, 1L, 2L, 1L << 20000, t-1, t, t+1])
854 cases.extend([-x for x in cases])
855 for x in cases:
856 Rx = Rat(x)
857 for y in cases:
858 Ry = Rat(y)
859 Rcmp = cmp(Rx, Ry)
860 xycmp = cmp(x, y)
861 eq(Rcmp, xycmp, Frm("%r %r %d %d", x, y, Rcmp, xycmp))
862 eq(x == y, Rcmp == 0, Frm("%r == %r %d", x, y, Rcmp))
863 eq(x != y, Rcmp != 0, Frm("%r != %r %d", x, y, Rcmp))
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))
Tim Peters307fa782004-09-23 08:06:40 +0000868
Christian Heimes8267d1d2008-01-04 00:37:34 +0000869 def test_nan_inf(self):
870 self.assertRaises(OverflowError, long, float('inf'))
Mark Dickinsonb6467572008-08-04 21:30:09 +0000871 self.assertRaises(OverflowError, long, float('-inf'))
872 self.assertRaises(ValueError, long, float('nan'))
Christian Heimes8267d1d2008-01-04 00:37:34 +0000873
Mark Dickinson1a707982008-12-17 16:14:37 +0000874 def test_bit_length(self):
875 tiny = 1e-10
876 for x in xrange(-65000, 65000):
877 x = long(x)
878 k = x.bit_length()
879 # Check equivalence with Python version
880 self.assertEqual(k, len(bin(x).lstrip('-0b')))
881 # Behaviour as specified in the docs
882 if x != 0:
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000883 self.assertTrue(2**(k-1) <= abs(x) < 2**k)
Mark Dickinson1a707982008-12-17 16:14:37 +0000884 else:
885 self.assertEqual(k, 0)
886 # Alternative definition: x.bit_length() == 1 + floor(log_2(x))
887 if x != 0:
888 # When x is an exact power of 2, numeric errors can
889 # cause floor(log(x)/log(2)) to be one too small; for
890 # small x this can be fixed by adding a small quantity
891 # to the quotient before taking the floor.
892 self.assertEqual(k, 1 + math.floor(
893 math.log(abs(x))/math.log(2) + tiny))
894
895 self.assertEqual((0L).bit_length(), 0)
896 self.assertEqual((1L).bit_length(), 1)
897 self.assertEqual((-1L).bit_length(), 1)
898 self.assertEqual((2L).bit_length(), 2)
899 self.assertEqual((-2L).bit_length(), 2)
900 for i in [2, 3, 15, 16, 17, 31, 32, 33, 63, 64, 234]:
901 a = 2L**i
902 self.assertEqual((a-1).bit_length(), i)
903 self.assertEqual((1-a).bit_length(), i)
904 self.assertEqual((a).bit_length(), i+1)
905 self.assertEqual((-a).bit_length(), i+1)
906 self.assertEqual((a+1).bit_length(), i+1)
907 self.assertEqual((-a-1).bit_length(), i+1)
908
909
Walter Dörwalda0021592005-06-13 21:44:48 +0000910def test_main():
911 test_support.run_unittest(LongTest)
Tim Peters307fa782004-09-23 08:06:40 +0000912
Walter Dörwalda0021592005-06-13 21:44:48 +0000913if __name__ == "__main__":
914 test_main()