blob: a596cf84eae664670f98da622fe80f6cea09c757 [file] [log] [blame]
Walter Dörwalda0021592005-06-13 21:44:48 +00001import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002from test import support
Christian Heimes81ee3ef2008-05-04 22:42:01 +00003import sys
Walter Dörwalda0021592005-06-13 21:44:48 +00004
5import random
Mark Dickinson54bc1ec2008-12-17 16:19:07 +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 Dickinsonbd792642009-03-18 20:06:12 +000018SHIFT = sys.int_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
Guido van Rossumc1f779c2007-07-03 08:25:58 +000028special = [0, 1, 2, BASE, BASE >> 1, 0x5555555555555555, 0xaaaaaaaaaaaaaaaa]
Guido van Rossum4581a0c1998-10-02 01:19:48 +000029# some solid strings of one bits
Guido van Rossume2a383d2007-01-15 16:59:06 +000030p2 = 4 # 0 and 1 already added
Guido van Rossum4581a0c1998-10-02 01:19:48 +000031for i in range(2*SHIFT):
32 special.append(p2 - 1)
33 p2 = p2 << 1
34del p2
35# add complements & negations
Guido van Rossumc1f779c2007-07-03 08:25:58 +000036special += [~x for x in special] + [-x for x in special]
Guido van Rossum4581a0c1998-10-02 01:19:48 +000037
Christian Heimes81ee3ef2008-05-04 22:42:01 +000038L = [
39 ('0', 0),
40 ('1', 1),
41 ('9', 9),
42 ('10', 10),
43 ('99', 99),
44 ('100', 100),
45 ('314', 314),
46 (' 314', 314),
47 ('314 ', 314),
48 (' \t\t 314 \t\t ', 314),
49 (repr(sys.maxsize), sys.maxsize),
50 (' 1x', ValueError),
51 (' 1 ', 1),
52 (' 1\02 ', ValueError),
53 ('', ValueError),
54 (' ', ValueError),
55 (' \t\t ', ValueError)
56]
57
Guido van Rossum4365cab1998-08-13 14:20:17 +000058
Walter Dörwalda0021592005-06-13 21:44:48 +000059class LongTest(unittest.TestCase):
Guido van Rossum4365cab1998-08-13 14:20:17 +000060
Walter Dörwalda0021592005-06-13 21:44:48 +000061 # Get quasi-random long consisting of ndigits digits (in base BASE).
62 # quasi == the most-significant digit will not be 0, and the number
63 # is constructed to contain long strings of 0 and 1 bits. These are
64 # more likely than random bits to provoke digit-boundary errors.
65 # The sign of the number is also random.
Guido van Rossum4365cab1998-08-13 14:20:17 +000066
Walter Dörwalda0021592005-06-13 21:44:48 +000067 def getran(self, ndigits):
Georg Brandlab91fde2009-08-13 08:51:18 +000068 self.assertTrue(ndigits > 0)
Walter Dörwalda0021592005-06-13 21:44:48 +000069 nbits_hi = ndigits * SHIFT
70 nbits_lo = nbits_hi - SHIFT + 1
Guido van Rossume2a383d2007-01-15 16:59:06 +000071 answer = 0
Walter Dörwalda0021592005-06-13 21:44:48 +000072 nbits = 0
73 r = int(random.random() * (SHIFT * 2)) | 1 # force 1 bits to start
74 while nbits < nbits_lo:
75 bits = (r >> 1) + 1
76 bits = min(bits, nbits_hi - nbits)
Georg Brandlab91fde2009-08-13 08:51:18 +000077 self.assertTrue(1 <= bits <= SHIFT)
Walter Dörwalda0021592005-06-13 21:44:48 +000078 nbits = nbits + bits
79 answer = answer << bits
80 if r & 1:
81 answer = answer | ((1 << bits) - 1)
82 r = int(random.random() * (SHIFT * 2))
Georg Brandlab91fde2009-08-13 08:51:18 +000083 self.assertTrue(nbits_lo <= nbits <= nbits_hi)
Walter Dörwalda0021592005-06-13 21:44:48 +000084 if random.random() < 0.5:
85 answer = -answer
86 return answer
Guido van Rossum4581a0c1998-10-02 01:19:48 +000087
Walter Dörwalda0021592005-06-13 21:44:48 +000088 # Get random long consisting of ndigits random digits (relative to base
89 # BASE). The sign bit is also random.
Guido van Rossum4581a0c1998-10-02 01:19:48 +000090
Walter Dörwalda0021592005-06-13 21:44:48 +000091 def getran2(ndigits):
Guido van Rossume2a383d2007-01-15 16:59:06 +000092 answer = 0
Guido van Rossum805365e2007-05-07 22:24:25 +000093 for i in range(ndigits):
Walter Dörwalda0021592005-06-13 21:44:48 +000094 answer = (answer << SHIFT) | random.randint(0, MASK)
95 if random.random() < 0.5:
96 answer = -answer
97 return answer
Guido van Rossum4365cab1998-08-13 14:20:17 +000098
Walter Dörwalda0021592005-06-13 21:44:48 +000099 def check_division(self, x, y):
100 eq = self.assertEqual
101 q, r = divmod(x, y)
102 q2, r2 = x//y, x%y
103 pab, pba = x*y, y*x
104 eq(pab, pba, Frm("multiplication does not commute for %r and %r", x, y))
105 eq(q, q2, Frm("divmod returns different quotient than / for %r and %r", x, y))
106 eq(r, r2, Frm("divmod returns different mod than %% for %r and %r", x, y))
107 eq(x, q*y + r, Frm("x != q*y + r after divmod on x=%r, y=%r", x, y))
108 if y > 0:
Georg Brandlab91fde2009-08-13 08:51:18 +0000109 self.assertTrue(0 <= r < y, Frm("bad mod from divmod on %r and %r", x, y))
Walter Dörwalda0021592005-06-13 21:44:48 +0000110 else:
Georg Brandlab91fde2009-08-13 08:51:18 +0000111 self.assertTrue(y < r <= 0, Frm("bad mod from divmod on %r and %r", x, y))
Guido van Rossum4365cab1998-08-13 14:20:17 +0000112
Walter Dörwalda0021592005-06-13 21:44:48 +0000113 def test_division(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000114 digits = list(range(1, MAXDIGITS+1)) + list(range(KARATSUBA_CUTOFF,
115 KARATSUBA_CUTOFF + 14))
Walter Dörwalda0021592005-06-13 21:44:48 +0000116 digits.append(KARATSUBA_CUTOFF * 3)
117 for lenx in digits:
118 x = self.getran(lenx)
119 for leny in digits:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000120 y = self.getran(leny) or 1
Walter Dörwalda0021592005-06-13 21:44:48 +0000121 self.check_division(x, y)
Guido van Rossum4365cab1998-08-13 14:20:17 +0000122
Mark Dickinsonbd792642009-03-18 20:06:12 +0000123 # specific numbers chosen to exercise corner cases of the
124 # current long division implementation
125
126 # 30-bit cases involving a quotient digit estimate of BASE+1
127 self.check_division(1231948412290879395966702881,
128 1147341367131428698)
129 self.check_division(815427756481275430342312021515587883,
130 707270836069027745)
131 self.check_division(627976073697012820849443363563599041,
132 643588798496057020)
133 self.check_division(1115141373653752303710932756325578065,
134 1038556335171453937726882627)
135 # 30-bit cases that require the post-subtraction correction step
136 self.check_division(922498905405436751940989320930368494,
137 949985870686786135626943396)
138 self.check_division(768235853328091167204009652174031844,
139 1091555541180371554426545266)
140
141 # 15-bit cases involving a quotient digit estimate of BASE+1
142 self.check_division(20172188947443, 615611397)
143 self.check_division(1020908530270155025, 950795710)
144 self.check_division(128589565723112408, 736393718)
145 self.check_division(609919780285761575, 18613274546784)
146 # 15-bit cases that require the post-subtraction correction step
147 self.check_division(710031681576388032, 26769404391308)
148 self.check_division(1933622614268221, 30212853348836)
149
150
151
Walter Dörwalda0021592005-06-13 21:44:48 +0000152 def test_karatsuba(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000153 digits = list(range(1, 5)) + list(range(KARATSUBA_CUTOFF,
154 KARATSUBA_CUTOFF + 10))
Walter Dörwalda0021592005-06-13 21:44:48 +0000155 digits.extend([KARATSUBA_CUTOFF * 10, KARATSUBA_CUTOFF * 100])
Guido van Rossum4365cab1998-08-13 14:20:17 +0000156
Walter Dörwalda0021592005-06-13 21:44:48 +0000157 bits = [digit * SHIFT for digit in digits]
Guido van Rossum4365cab1998-08-13 14:20:17 +0000158
Walter Dörwalda0021592005-06-13 21:44:48 +0000159 # Test products of long strings of 1 bits -- (2**x-1)*(2**y-1) ==
160 # 2**(x+y) - 2**x - 2**y + 1, so the proper result is easy to check.
161 for abits in bits:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000162 a = (1 << abits) - 1
Walter Dörwalda0021592005-06-13 21:44:48 +0000163 for bbits in bits:
164 if bbits < abits:
165 continue
Guido van Rossume2a383d2007-01-15 16:59:06 +0000166 b = (1 << bbits) - 1
Walter Dörwalda0021592005-06-13 21:44:48 +0000167 x = a * b
Guido van Rossume2a383d2007-01-15 16:59:06 +0000168 y = ((1 << (abits + bbits)) -
169 (1 << abits) -
170 (1 << bbits) +
Walter Dörwalda0021592005-06-13 21:44:48 +0000171 1)
172 self.assertEqual(x, y,
173 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 +0000174
Walter Dörwalda0021592005-06-13 21:44:48 +0000175 def check_bitop_identities_1(self, x):
176 eq = self.assertEqual
177 eq(x & 0, 0, Frm("x & 0 != 0 for x=%r", x))
178 eq(x | 0, x, Frm("x | 0 != x for x=%r", x))
179 eq(x ^ 0, x, Frm("x ^ 0 != x for x=%r", x))
180 eq(x & -1, x, Frm("x & -1 != x for x=%r", x))
181 eq(x | -1, -1, Frm("x | -1 != -1 for x=%r", x))
182 eq(x ^ -1, ~x, Frm("x ^ -1 != ~x for x=%r", x))
183 eq(x, ~~x, Frm("x != ~~x for x=%r", x))
184 eq(x & x, x, Frm("x & x != x for x=%r", x))
185 eq(x | x, x, Frm("x | x != x for x=%r", x))
186 eq(x ^ x, 0, Frm("x ^ x != 0 for x=%r", x))
187 eq(x & ~x, 0, Frm("x & ~x != 0 for x=%r", x))
188 eq(x | ~x, -1, Frm("x | ~x != -1 for x=%r", x))
189 eq(x ^ ~x, -1, Frm("x ^ ~x != -1 for x=%r", x))
190 eq(-x, 1 + ~x, Frm("not -x == 1 + ~x for x=%r", x))
191 eq(-x, ~(x-1), Frm("not -x == ~(x-1) forx =%r", x))
Guido van Rossum805365e2007-05-07 22:24:25 +0000192 for n in range(2*SHIFT):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000193 p2 = 2 ** n
Walter Dörwalda0021592005-06-13 21:44:48 +0000194 eq(x << n >> n, x,
195 Frm("x << n >> n != x for x=%r, n=%r", (x, n)))
196 eq(x // p2, x >> n,
197 Frm("x // p2 != x >> n for x=%r n=%r p2=%r", (x, n, p2)))
198 eq(x * p2, x << n,
199 Frm("x * p2 != x << n for x=%r n=%r p2=%r", (x, n, p2)))
200 eq(x & -p2, x >> n << n,
201 Frm("not x & -p2 == x >> n << n for x=%r n=%r p2=%r", (x, n, p2)))
202 eq(x & -p2, x & ~(p2 - 1),
203 Frm("not x & -p2 == x & ~(p2 - 1) for x=%r n=%r p2=%r", (x, n, p2)))
Tim Peters7f270ba2002-08-13 21:06:55 +0000204
Walter Dörwalda0021592005-06-13 21:44:48 +0000205 def check_bitop_identities_2(self, x, y):
206 eq = self.assertEqual
207 eq(x & y, y & x, Frm("x & y != y & x for x=%r, y=%r", (x, y)))
208 eq(x | y, y | x, Frm("x | y != y | x for x=%r, y=%r", (x, y)))
209 eq(x ^ y, y ^ x, Frm("x ^ y != y ^ x for x=%r, y=%r", (x, y)))
210 eq(x ^ y ^ x, y, Frm("x ^ y ^ x != y for x=%r, y=%r", (x, y)))
211 eq(x & y, ~(~x | ~y), Frm("x & y != ~(~x | ~y) for x=%r, y=%r", (x, y)))
212 eq(x | y, ~(~x & ~y), Frm("x | y != ~(~x & ~y) for x=%r, y=%r", (x, y)))
213 eq(x ^ y, (x | y) & ~(x & y),
214 Frm("x ^ y != (x | y) & ~(x & y) for x=%r, y=%r", (x, y)))
215 eq(x ^ y, (x & ~y) | (~x & y),
216 Frm("x ^ y == (x & ~y) | (~x & y) for x=%r, y=%r", (x, y)))
217 eq(x ^ y, (x | y) & (~x | ~y),
218 Frm("x ^ y == (x | y) & (~x | ~y) for x=%r, y=%r", (x, y)))
Tim Peters7f270ba2002-08-13 21:06:55 +0000219
Walter Dörwalda0021592005-06-13 21:44:48 +0000220 def check_bitop_identities_3(self, x, y, z):
221 eq = self.assertEqual
222 eq((x & y) & z, x & (y & z),
223 Frm("(x & y) & z != x & (y & z) for x=%r, y=%r, z=%r", (x, y, z)))
224 eq((x | y) | z, x | (y | z),
225 Frm("(x | y) | z != x | (y | z) for x=%r, y=%r, z=%r", (x, y, z)))
226 eq((x ^ y) ^ z, x ^ (y ^ z),
227 Frm("(x ^ y) ^ z != x ^ (y ^ z) for x=%r, y=%r, z=%r", (x, y, z)))
228 eq(x & (y | z), (x & y) | (x & z),
229 Frm("x & (y | z) != (x & y) | (x & z) for x=%r, y=%r, z=%r", (x, y, z)))
230 eq(x | (y & z), (x | y) & (x | z),
231 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 +0000232
Walter Dörwalda0021592005-06-13 21:44:48 +0000233 def test_bitop_identities(self):
234 for x in special:
235 self.check_bitop_identities_1(x)
Guido van Rossum805365e2007-05-07 22:24:25 +0000236 digits = range(1, MAXDIGITS+1)
Walter Dörwalda0021592005-06-13 21:44:48 +0000237 for lenx in digits:
238 x = self.getran(lenx)
239 self.check_bitop_identities_1(x)
240 for leny in digits:
241 y = self.getran(leny)
242 self.check_bitop_identities_2(x, y)
243 self.check_bitop_identities_3(x, y, self.getran((lenx + leny)//2))
Guido van Rossum4365cab1998-08-13 14:20:17 +0000244
Walter Dörwalda0021592005-06-13 21:44:48 +0000245 def slow_format(self, x, base):
Walter Dörwalda0021592005-06-13 21:44:48 +0000246 digits = []
247 sign = 0
248 if x < 0:
249 sign, x = 1, -x
250 while x:
251 x, r = divmod(x, base)
252 digits.append(int(r))
253 digits.reverse()
254 digits = digits or [0]
255 return '-'[:sign] + \
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000256 {2: '0b', 8: '0o', 10: '', 16: '0x'}[base] + \
Guido van Rossumd2dbecb2006-08-18 16:29:54 +0000257 "".join(map(lambda i: "0123456789abcdef"[i], digits))
Guido van Rossum4365cab1998-08-13 14:20:17 +0000258
Walter Dörwalda0021592005-06-13 21:44:48 +0000259 def check_format_1(self, x):
260 for base, mapper in (8, oct), (10, repr), (16, hex):
261 got = mapper(x)
262 expected = self.slow_format(x, base)
263 msg = Frm("%s returned %r but expected %r for %r",
264 mapper.__name__, got, expected, x)
265 self.assertEqual(got, expected, msg)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000266 self.assertEqual(int(got, 0), x, Frm('long("%s", 0) != %r', got, x))
Walter Dörwalda0021592005-06-13 21:44:48 +0000267 # str() has to be checked a little differently since there's no
268 # trailing "L"
269 got = str(x)
Guido van Rossumd2dbecb2006-08-18 16:29:54 +0000270 expected = self.slow_format(x, 10)
Walter Dörwalda0021592005-06-13 21:44:48 +0000271 msg = Frm("%s returned %r but expected %r for %r",
272 mapper.__name__, got, expected, x)
273 self.assertEqual(got, expected, msg)
Guido van Rossum4365cab1998-08-13 14:20:17 +0000274
Walter Dörwalda0021592005-06-13 21:44:48 +0000275 def test_format(self):
276 for x in special:
277 self.check_format_1(x)
Guido van Rossum805365e2007-05-07 22:24:25 +0000278 for i in range(10):
279 for lenx in range(1, MAXDIGITS+1):
Walter Dörwalda0021592005-06-13 21:44:48 +0000280 x = self.getran(lenx)
281 self.check_format_1(x)
Guido van Rossum4365cab1998-08-13 14:20:17 +0000282
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000283 def test_long(self):
284 self.assertEqual(int(314), 314)
285 self.assertEqual(int(3.14), 3)
286 self.assertEqual(int(314), 314)
287 # Check that conversion from float truncates towards zero
288 self.assertEqual(int(-3.14), -3)
289 self.assertEqual(int(3.9), 3)
290 self.assertEqual(int(-3.9), -3)
291 self.assertEqual(int(3.5), 3)
292 self.assertEqual(int(-3.5), -3)
293 self.assertEqual(int("-3"), -3)
294 # Different base:
295 self.assertEqual(int("10",16), 16)
296 # Check conversions from string (same test set as for int(), and then some)
297 LL = [
298 ('1' + '0'*20, 10**20),
299 ('1' + '0'*100, 10**100)
300 ]
301 L2 = L[:]
302 for s, v in L2 + LL:
303 for sign in "", "+", "-":
304 for prefix in "", " ", "\t", " \t\t ":
305 ss = prefix + sign + s
306 vv = v
307 if sign == "-" and v is not ValueError:
308 vv = -v
309 try:
310 self.assertEqual(int(ss), int(vv))
311 except ValueError:
312 pass
313
314 self.assertRaises(ValueError, int, '123\0')
315 self.assertRaises(ValueError, int, '53', 40)
Mark Dickinson9ffc0202009-01-20 20:45:53 +0000316 # trailing L should no longer be accepted...
317 self.assertRaises(ValueError, int, '123L')
318 self.assertRaises(ValueError, int, '123l')
319 self.assertRaises(ValueError, int, '0L')
320 self.assertRaises(ValueError, int, '-37L')
321 self.assertRaises(ValueError, int, '0x32L', 16)
322 self.assertRaises(ValueError, int, '1L', 21)
323 # ... but it's just a normal digit if base >= 22
324 self.assertEqual(int('1L', 22), 43)
325
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000326 self.assertRaises(TypeError, int, 1, 12)
327
328 # SF patch #1638879: embedded NULs were not detected with
329 # explicit base
330 self.assertRaises(ValueError, int, '123\0', 10)
331 self.assertRaises(ValueError, int, '123\x00 245', 20)
332
333 self.assertEqual(int('100000000000000000000000000000000', 2),
334 4294967296)
335 self.assertEqual(int('102002022201221111211', 3), 4294967296)
336 self.assertEqual(int('10000000000000000', 4), 4294967296)
337 self.assertEqual(int('32244002423141', 5), 4294967296)
338 self.assertEqual(int('1550104015504', 6), 4294967296)
339 self.assertEqual(int('211301422354', 7), 4294967296)
340 self.assertEqual(int('40000000000', 8), 4294967296)
341 self.assertEqual(int('12068657454', 9), 4294967296)
342 self.assertEqual(int('4294967296', 10), 4294967296)
343 self.assertEqual(int('1904440554', 11), 4294967296)
344 self.assertEqual(int('9ba461594', 12), 4294967296)
345 self.assertEqual(int('535a79889', 13), 4294967296)
346 self.assertEqual(int('2ca5b7464', 14), 4294967296)
347 self.assertEqual(int('1a20dcd81', 15), 4294967296)
348 self.assertEqual(int('100000000', 16), 4294967296)
349 self.assertEqual(int('a7ffda91', 17), 4294967296)
350 self.assertEqual(int('704he7g4', 18), 4294967296)
351 self.assertEqual(int('4f5aff66', 19), 4294967296)
352 self.assertEqual(int('3723ai4g', 20), 4294967296)
353 self.assertEqual(int('281d55i4', 21), 4294967296)
354 self.assertEqual(int('1fj8b184', 22), 4294967296)
355 self.assertEqual(int('1606k7ic', 23), 4294967296)
356 self.assertEqual(int('mb994ag', 24), 4294967296)
357 self.assertEqual(int('hek2mgl', 25), 4294967296)
358 self.assertEqual(int('dnchbnm', 26), 4294967296)
359 self.assertEqual(int('b28jpdm', 27), 4294967296)
360 self.assertEqual(int('8pfgih4', 28), 4294967296)
361 self.assertEqual(int('76beigg', 29), 4294967296)
362 self.assertEqual(int('5qmcpqg', 30), 4294967296)
363 self.assertEqual(int('4q0jto4', 31), 4294967296)
364 self.assertEqual(int('4000000', 32), 4294967296)
365 self.assertEqual(int('3aokq94', 33), 4294967296)
366 self.assertEqual(int('2qhxjli', 34), 4294967296)
367 self.assertEqual(int('2br45qb', 35), 4294967296)
368 self.assertEqual(int('1z141z4', 36), 4294967296)
369
370 self.assertEqual(int('100000000000000000000000000000001', 2),
371 4294967297)
372 self.assertEqual(int('102002022201221111212', 3), 4294967297)
373 self.assertEqual(int('10000000000000001', 4), 4294967297)
374 self.assertEqual(int('32244002423142', 5), 4294967297)
375 self.assertEqual(int('1550104015505', 6), 4294967297)
376 self.assertEqual(int('211301422355', 7), 4294967297)
377 self.assertEqual(int('40000000001', 8), 4294967297)
378 self.assertEqual(int('12068657455', 9), 4294967297)
379 self.assertEqual(int('4294967297', 10), 4294967297)
380 self.assertEqual(int('1904440555', 11), 4294967297)
381 self.assertEqual(int('9ba461595', 12), 4294967297)
382 self.assertEqual(int('535a7988a', 13), 4294967297)
383 self.assertEqual(int('2ca5b7465', 14), 4294967297)
384 self.assertEqual(int('1a20dcd82', 15), 4294967297)
385 self.assertEqual(int('100000001', 16), 4294967297)
386 self.assertEqual(int('a7ffda92', 17), 4294967297)
387 self.assertEqual(int('704he7g5', 18), 4294967297)
388 self.assertEqual(int('4f5aff67', 19), 4294967297)
389 self.assertEqual(int('3723ai4h', 20), 4294967297)
390 self.assertEqual(int('281d55i5', 21), 4294967297)
391 self.assertEqual(int('1fj8b185', 22), 4294967297)
392 self.assertEqual(int('1606k7id', 23), 4294967297)
393 self.assertEqual(int('mb994ah', 24), 4294967297)
394 self.assertEqual(int('hek2mgm', 25), 4294967297)
395 self.assertEqual(int('dnchbnn', 26), 4294967297)
396 self.assertEqual(int('b28jpdn', 27), 4294967297)
397 self.assertEqual(int('8pfgih5', 28), 4294967297)
398 self.assertEqual(int('76beigh', 29), 4294967297)
399 self.assertEqual(int('5qmcpqh', 30), 4294967297)
400 self.assertEqual(int('4q0jto5', 31), 4294967297)
401 self.assertEqual(int('4000001', 32), 4294967297)
402 self.assertEqual(int('3aokq95', 33), 4294967297)
403 self.assertEqual(int('2qhxjlj', 34), 4294967297)
404 self.assertEqual(int('2br45qc', 35), 4294967297)
405 self.assertEqual(int('1z141z5', 36), 4294967297)
406
Mark Dickinson66f07ce2010-05-26 19:18:28 +0000407 # tests with base 0
408 self.assertEqual(int('000', 0), 0)
409 self.assertEqual(int('0o123', 0), 83)
410 self.assertEqual(int('0x123', 0), 291)
411 self.assertEqual(int('0b100', 0), 4)
412 self.assertEqual(int(' 0O123 ', 0), 83)
413 self.assertEqual(int(' 0X123 ', 0), 291)
414 self.assertEqual(int(' 0B100 ', 0), 4)
415 self.assertEqual(int('0', 0), 0)
416 self.assertEqual(int('+0', 0), 0)
417 self.assertEqual(int('-0', 0), 0)
418 self.assertEqual(int('00', 0), 0)
419 self.assertRaises(ValueError, int, '08', 0)
420 self.assertRaises(ValueError, int, '-012395', 0)
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000421
422 def test_conversion(self):
Mark Dickinsone5e298f2009-01-12 20:49:19 +0000423 # Test __int__()
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000424 class ClassicMissingMethods:
425 pass
426 self.assertRaises(TypeError, int, ClassicMissingMethods())
427
428 class MissingMethods(object):
429 pass
430 self.assertRaises(TypeError, int, MissingMethods())
431
432 class Foo0:
433 def __int__(self):
434 return 42
435
436 class Foo1(object):
437 def __int__(self):
438 return 42
439
440 class Foo2(int):
441 def __int__(self):
442 return 42
443
444 class Foo3(int):
445 def __int__(self):
446 return self
447
448 class Foo4(int):
449 def __int__(self):
450 return 42
451
452 class Foo5(int):
453 def __int__(self):
454 return 42.
455
456 self.assertEqual(int(Foo0()), 42)
457 self.assertEqual(int(Foo1()), 42)
458 self.assertEqual(int(Foo2()), 42)
459 self.assertEqual(int(Foo3()), 0)
460 self.assertEqual(int(Foo4()), 42)
461 self.assertRaises(TypeError, int, Foo5())
462
463 class Classic:
464 pass
465 for base in (object, Classic):
Mark Dickinsone5e298f2009-01-12 20:49:19 +0000466 class IntOverridesTrunc(base):
467 def __int__(self):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000468 return 42
469 def __trunc__(self):
470 return -12
Mark Dickinsone5e298f2009-01-12 20:49:19 +0000471 self.assertEqual(int(IntOverridesTrunc()), 42)
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000472
473 class JustTrunc(base):
474 def __trunc__(self):
475 return 42
476 self.assertEqual(int(JustTrunc()), 42)
477
Mark Dickinsone5e298f2009-01-12 20:49:19 +0000478 class JustLong(base):
479 # test that __long__ no longer used in 3.x
480 def __long__(self):
481 return 42
482 self.assertRaises(TypeError, int, JustLong())
483
484 class LongTrunc(base):
485 # __long__ should be ignored in 3.x
486 def __long__(self):
487 return 42
488 def __trunc__(self):
489 return 1729
490 self.assertEqual(int(LongTrunc()), 1729)
491
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000492 for trunc_result_base in (object, Classic):
493 class Integral(trunc_result_base):
494 def __int__(self):
495 return 42
496
497 class TruncReturnsNonLong(base):
498 def __trunc__(self):
499 return Integral()
500 self.assertEqual(int(TruncReturnsNonLong()), 42)
501
502 class NonIntegral(trunc_result_base):
503 def __trunc__(self):
504 # Check that we avoid infinite recursion.
505 return NonIntegral()
506
507 class TruncReturnsNonIntegral(base):
508 def __trunc__(self):
509 return NonIntegral()
510 try:
511 int(TruncReturnsNonIntegral())
512 except TypeError as e:
513 self.assertEquals(str(e),
514 "__trunc__ returned non-Integral"
515 " (type NonIntegral)")
516 else:
517 self.fail("Failed to raise TypeError with %s" %
518 ((base, trunc_result_base),))
519
Walter Dörwalda0021592005-06-13 21:44:48 +0000520 def test_misc(self):
Guido van Rossum4365cab1998-08-13 14:20:17 +0000521
Walter Dörwalda0021592005-06-13 21:44:48 +0000522 # check the extremes in int<->long conversion
Christian Heimesa37d4c62007-12-04 23:02:19 +0000523 hugepos = sys.maxsize
Walter Dörwalda0021592005-06-13 21:44:48 +0000524 hugeneg = -hugepos - 1
Guido van Rossume2a383d2007-01-15 16:59:06 +0000525 hugepos_aslong = int(hugepos)
526 hugeneg_aslong = int(hugeneg)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000527 self.assertEqual(hugepos, hugepos_aslong, "long(sys.maxsize) != sys.maxsize")
Walter Dörwalda0021592005-06-13 21:44:48 +0000528 self.assertEqual(hugeneg, hugeneg_aslong,
Christian Heimesa37d4c62007-12-04 23:02:19 +0000529 "long(-sys.maxsize-1) != -sys.maxsize-1")
Guido van Rossum4365cab1998-08-13 14:20:17 +0000530
Walter Dörwalda0021592005-06-13 21:44:48 +0000531 # long -> int should not fail for hugepos_aslong or hugeneg_aslong
Thomas Wouters89f507f2006-12-13 04:49:30 +0000532 x = int(hugepos_aslong)
Walter Dörwalda0021592005-06-13 21:44:48 +0000533 try:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000534 self.assertEqual(x, hugepos,
Christian Heimesa37d4c62007-12-04 23:02:19 +0000535 "converting sys.maxsize to long and back to int fails")
Walter Dörwalda0021592005-06-13 21:44:48 +0000536 except OverflowError:
Christian Heimesa37d4c62007-12-04 23:02:19 +0000537 self.fail("int(long(sys.maxsize)) overflowed!")
Thomas Wouters89f507f2006-12-13 04:49:30 +0000538 if not isinstance(x, int):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000539 raise TestFailed("int(long(sys.maxsize)) should have returned int")
Thomas Wouters89f507f2006-12-13 04:49:30 +0000540 x = int(hugeneg_aslong)
Walter Dörwalda0021592005-06-13 21:44:48 +0000541 try:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000542 self.assertEqual(x, hugeneg,
Christian Heimesa37d4c62007-12-04 23:02:19 +0000543 "converting -sys.maxsize-1 to long and back to int fails")
Walter Dörwalda0021592005-06-13 21:44:48 +0000544 except OverflowError:
Christian Heimesa37d4c62007-12-04 23:02:19 +0000545 self.fail("int(long(-sys.maxsize-1)) overflowed!")
Thomas Wouters89f507f2006-12-13 04:49:30 +0000546 if not isinstance(x, int):
Christian Heimesa37d4c62007-12-04 23:02:19 +0000547 raise TestFailed("int(long(-sys.maxsize-1)) should have "
Thomas Wouters89f507f2006-12-13 04:49:30 +0000548 "returned int")
Walter Dörwalda0021592005-06-13 21:44:48 +0000549 # but long -> int should overflow for hugepos+1 and hugeneg-1
550 x = hugepos_aslong + 1
551 try:
552 y = int(x)
553 except OverflowError:
Christian Heimesa37d4c62007-12-04 23:02:19 +0000554 self.fail("int(long(sys.maxsize) + 1) mustn't overflow")
Georg Brandlab91fde2009-08-13 08:51:18 +0000555 self.assertTrue(isinstance(y, int),
Christian Heimesa37d4c62007-12-04 23:02:19 +0000556 "int(long(sys.maxsize) + 1) should have returned long")
Guido van Rossum4365cab1998-08-13 14:20:17 +0000557
Walter Dörwalda0021592005-06-13 21:44:48 +0000558 x = hugeneg_aslong - 1
559 try:
560 y = int(x)
561 except OverflowError:
Christian Heimesa37d4c62007-12-04 23:02:19 +0000562 self.fail("int(long(-sys.maxsize-1) - 1) mustn't overflow")
Georg Brandlab91fde2009-08-13 08:51:18 +0000563 self.assertTrue(isinstance(y, int),
Christian Heimesa37d4c62007-12-04 23:02:19 +0000564 "int(long(-sys.maxsize-1) - 1) should have returned long")
Guido van Rossum4365cab1998-08-13 14:20:17 +0000565
Guido van Rossume2a383d2007-01-15 16:59:06 +0000566 class long2(int):
Walter Dörwalda0021592005-06-13 21:44:48 +0000567 pass
Guido van Rossume2a383d2007-01-15 16:59:06 +0000568 x = long2(1<<100)
Walter Dörwaldf1715402002-11-19 20:49:15 +0000569 y = int(x)
Georg Brandlab91fde2009-08-13 08:51:18 +0000570 self.assertTrue(type(y) is int,
Walter Dörwalda0021592005-06-13 21:44:48 +0000571 "overflowing int conversion must return long not long subtype")
Guido van Rossum4581a0c1998-10-02 01:19:48 +0000572
Tim Peters26c7fa32001-08-23 22:56:21 +0000573# ----------------------------------- tests of auto int->long conversion
574
Walter Dörwalda0021592005-06-13 21:44:48 +0000575 def test_auto_overflow(self):
576 import math, sys
Tim Peters26c7fa32001-08-23 22:56:21 +0000577
Christian Heimesa37d4c62007-12-04 23:02:19 +0000578 special = [0, 1, 2, 3, sys.maxsize-1, sys.maxsize, sys.maxsize+1]
579 sqrt = int(math.sqrt(sys.maxsize))
Walter Dörwalda0021592005-06-13 21:44:48 +0000580 special.extend([sqrt-1, sqrt, sqrt+1])
581 special.extend([-i for i in special])
Tim Peters26c7fa32001-08-23 22:56:21 +0000582
Walter Dörwalda0021592005-06-13 21:44:48 +0000583 def checkit(*args):
584 # Heavy use of nested scopes here!
585 self.assertEqual(got, expected,
586 Frm("for %r expected %r got %r", args, expected, got))
Tim Peters26c7fa32001-08-23 22:56:21 +0000587
Walter Dörwalda0021592005-06-13 21:44:48 +0000588 for x in special:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000589 longx = int(x)
Tim Peters26c7fa32001-08-23 22:56:21 +0000590
Walter Dörwalda0021592005-06-13 21:44:48 +0000591 expected = -longx
592 got = -x
593 checkit('-', x)
Tim Peters26c7fa32001-08-23 22:56:21 +0000594
Walter Dörwalda0021592005-06-13 21:44:48 +0000595 for y in special:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000596 longy = int(y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000597
Walter Dörwalda0021592005-06-13 21:44:48 +0000598 expected = longx + longy
599 got = x + y
600 checkit(x, '+', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000601
Walter Dörwalda0021592005-06-13 21:44:48 +0000602 expected = longx - longy
603 got = x - y
604 checkit(x, '-', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000605
Walter Dörwalda0021592005-06-13 21:44:48 +0000606 expected = longx * longy
607 got = x * y
608 checkit(x, '*', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000609
Walter Dörwalda0021592005-06-13 21:44:48 +0000610 if y:
611 expected = longx / longy
612 got = x / y
613 checkit(x, '/', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000614
Walter Dörwalda0021592005-06-13 21:44:48 +0000615 expected = longx // longy
616 got = x // y
617 checkit(x, '//', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000618
Walter Dörwalda0021592005-06-13 21:44:48 +0000619 expected = divmod(longx, longy)
620 got = divmod(longx, longy)
621 checkit(x, 'divmod', y)
Tim Petersa3653092001-08-23 23:02:57 +0000622
Walter Dörwalda0021592005-06-13 21:44:48 +0000623 if abs(y) < 5 and not (x == 0 and y < 0):
624 expected = longx ** longy
625 got = x ** y
626 checkit(x, '**', y)
Tim Peters26c7fa32001-08-23 22:56:21 +0000627
Walter Dörwalda0021592005-06-13 21:44:48 +0000628 for z in special:
629 if z != 0 :
630 if y >= 0:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000631 expected = pow(longx, longy, int(z))
Walter Dörwalda0021592005-06-13 21:44:48 +0000632 got = pow(x, y, z)
633 checkit('pow', x, y, '%', z)
Tim Peters32f453e2001-09-03 08:35:41 +0000634 else:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000635 self.assertRaises(TypeError, pow,longx, longy, int(z))
Tim Peters26c7fa32001-08-23 22:56:21 +0000636
Mark Dickinsonc6300392009-04-20 21:38:00 +0000637 @unittest.skipUnless(float.__getformat__("double").startswith("IEEE"),
638 "test requires IEEE 754 doubles")
639 def test_float_conversion(self):
640 import sys
641 DBL_MAX = sys.float_info.max
642 DBL_MAX_EXP = sys.float_info.max_exp
643 DBL_MANT_DIG = sys.float_info.mant_dig
644
645 exact_values = [0, 1, 2,
646 2**53-3,
647 2**53-2,
648 2**53-1,
649 2**53,
650 2**53+2,
651 2**54-4,
652 2**54-2,
653 2**54,
654 2**54+4]
655 for x in exact_values:
656 self.assertEqual(float(x), x)
657 self.assertEqual(float(-x), -x)
658
659 # test round-half-even
660 for x, y in [(1, 0), (2, 2), (3, 4), (4, 4), (5, 4), (6, 6), (7, 8)]:
661 for p in range(15):
662 self.assertEqual(int(float(2**p*(2**53+x))), 2**p*(2**53+y))
663
664 for x, y in [(0, 0), (1, 0), (2, 0), (3, 4), (4, 4), (5, 4), (6, 8),
665 (7, 8), (8, 8), (9, 8), (10, 8), (11, 12), (12, 12),
666 (13, 12), (14, 16), (15, 16)]:
667 for p in range(15):
668 self.assertEqual(int(float(2**p*(2**54+x))), 2**p*(2**54+y))
669
670 # behaviour near extremes of floating-point range
671 int_dbl_max = int(DBL_MAX)
672 top_power = 2**DBL_MAX_EXP
673 halfway = (int_dbl_max + top_power)//2
674 self.assertEqual(float(int_dbl_max), DBL_MAX)
675 self.assertEqual(float(int_dbl_max+1), DBL_MAX)
676 self.assertEqual(float(halfway-1), DBL_MAX)
677 self.assertRaises(OverflowError, float, halfway)
678 self.assertEqual(float(1-halfway), -DBL_MAX)
679 self.assertRaises(OverflowError, float, -halfway)
680 self.assertRaises(OverflowError, float, top_power-1)
681 self.assertRaises(OverflowError, float, top_power)
682 self.assertRaises(OverflowError, float, top_power+1)
683 self.assertRaises(OverflowError, float, 2*top_power-1)
684 self.assertRaises(OverflowError, float, 2*top_power)
685 self.assertRaises(OverflowError, float, top_power*top_power)
686
687 for p in range(100):
688 x = 2**p * (2**53 + 1) + 1
689 y = 2**p * (2**53 + 2)
690 self.assertEqual(int(float(x)), y)
691
692 x = 2**p * (2**53 + 1)
693 y = 2**p * 2**53
694 self.assertEqual(int(float(x)), y)
695
Walter Dörwalda0021592005-06-13 21:44:48 +0000696 def test_float_overflow(self):
697 import math
Tim Peters9fffa3e2001-09-04 05:14:19 +0000698
Walter Dörwalda0021592005-06-13 21:44:48 +0000699 for x in -2.0, -1.0, 0.0, 1.0, 2.0:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000700 self.assertEqual(float(int(x)), x)
Tim Peters9fffa3e2001-09-04 05:14:19 +0000701
Walter Dörwalda0021592005-06-13 21:44:48 +0000702 shuge = '12345' * 120
Guido van Rossume2a383d2007-01-15 16:59:06 +0000703 huge = 1 << 30000
Walter Dörwalda0021592005-06-13 21:44:48 +0000704 mhuge = -huge
705 namespace = {'huge': huge, 'mhuge': mhuge, 'shuge': shuge, 'math': math}
706 for test in ["float(huge)", "float(mhuge)",
707 "complex(huge)", "complex(mhuge)",
708 "complex(huge, 1)", "complex(mhuge, 1)",
709 "complex(1, huge)", "complex(1, mhuge)",
710 "1. + huge", "huge + 1.", "1. + mhuge", "mhuge + 1.",
711 "1. - huge", "huge - 1.", "1. - mhuge", "mhuge - 1.",
712 "1. * huge", "huge * 1.", "1. * mhuge", "mhuge * 1.",
713 "1. // huge", "huge // 1.", "1. // mhuge", "mhuge // 1.",
714 "1. / huge", "huge / 1.", "1. / mhuge", "mhuge / 1.",
715 "1. ** huge", "huge ** 1.", "1. ** mhuge", "mhuge ** 1.",
716 "math.sin(huge)", "math.sin(mhuge)",
717 "math.sqrt(huge)", "math.sqrt(mhuge)", # should do better
Guido van Rossum28bbe422007-08-24 03:46:30 +0000718 # math.floor() of an int returns an int now
719 ##"math.floor(huge)", "math.floor(mhuge)",
720 ]:
Tim Peters9fffa3e2001-09-04 05:14:19 +0000721
Walter Dörwalda0021592005-06-13 21:44:48 +0000722 self.assertRaises(OverflowError, eval, test, namespace)
Tim Peters9fffa3e2001-09-04 05:14:19 +0000723
Walter Dörwalda0021592005-06-13 21:44:48 +0000724 # XXX Perhaps float(shuge) can raise OverflowError on some box?
725 # The comparison should not.
726 self.assertNotEqual(float(shuge), int(shuge),
727 "float(shuge) should not equal int(shuge)")
Tim Peters83e7ccc2001-09-04 06:37:28 +0000728
Walter Dörwalda0021592005-06-13 21:44:48 +0000729 def test_logs(self):
730 import math
Tim Peters78526162001-09-05 00:53:45 +0000731
Walter Dörwalda0021592005-06-13 21:44:48 +0000732 LOG10E = math.log10(math.e)
Tim Peters307fa782004-09-23 08:06:40 +0000733
Guido van Rossum805365e2007-05-07 22:24:25 +0000734 for exp in list(range(10)) + [100, 1000, 10000]:
Walter Dörwalda0021592005-06-13 21:44:48 +0000735 value = 10 ** exp
736 log10 = math.log10(value)
737 self.assertAlmostEqual(log10, exp)
Tim Peters78526162001-09-05 00:53:45 +0000738
Walter Dörwalda0021592005-06-13 21:44:48 +0000739 # log10(value) == exp, so log(value) == log10(value)/log10(e) ==
740 # exp/LOG10E
741 expected = exp / LOG10E
742 log = math.log(value)
743 self.assertAlmostEqual(log, expected)
Tim Peters78526162001-09-05 00:53:45 +0000744
Guido van Rossume2a383d2007-01-15 16:59:06 +0000745 for bad in -(1 << 10000), -2, 0:
Walter Dörwalda0021592005-06-13 21:44:48 +0000746 self.assertRaises(ValueError, math.log, bad)
747 self.assertRaises(ValueError, math.log10, bad)
Tim Peters78526162001-09-05 00:53:45 +0000748
Walter Dörwalda0021592005-06-13 21:44:48 +0000749 def test_mixed_compares(self):
750 eq = self.assertEqual
751 import math
Tim Peters78526162001-09-05 00:53:45 +0000752
Walter Dörwalda0021592005-06-13 21:44:48 +0000753 # We're mostly concerned with that mixing floats and longs does the
754 # right stuff, even when longs are too large to fit in a float.
755 # The safest way to check the results is to use an entirely different
756 # method, which we do here via a skeletal rational class (which
757 # represents all Python ints, longs and floats exactly).
758 class Rat:
759 def __init__(self, value):
Walter Dörwaldaa97f042007-05-03 21:05:51 +0000760 if isinstance(value, int):
Walter Dörwalda0021592005-06-13 21:44:48 +0000761 self.n = value
762 self.d = 1
763 elif isinstance(value, float):
764 # Convert to exact rational equivalent.
765 f, e = math.frexp(abs(value))
766 assert f == 0 or 0.5 <= f < 1.0
767 # |value| = f * 2**e exactly
Tim Peters78526162001-09-05 00:53:45 +0000768
Walter Dörwalda0021592005-06-13 21:44:48 +0000769 # Suck up CHUNK bits at a time; 28 is enough so that we suck
770 # up all bits in 2 iterations for all known binary double-
771 # precision formats, and small enough to fit in an int.
772 CHUNK = 28
773 top = 0
774 # invariant: |value| = (top + f) * 2**e exactly
775 while f:
776 f = math.ldexp(f, CHUNK)
777 digit = int(f)
778 assert digit >> CHUNK == 0
779 top = (top << CHUNK) | digit
780 f -= digit
781 assert 0.0 <= f < 1.0
782 e -= CHUNK
Tim Peters78526162001-09-05 00:53:45 +0000783
Walter Dörwalda0021592005-06-13 21:44:48 +0000784 # Now |value| = top * 2**e exactly.
785 if e >= 0:
786 n = top << e
787 d = 1
788 else:
789 n = top
790 d = 1 << -e
791 if value < 0:
792 n = -n
793 self.n = n
794 self.d = d
795 assert float(n) / float(d) == value
Tim Peters307fa782004-09-23 08:06:40 +0000796 else:
Walter Dörwalda0021592005-06-13 21:44:48 +0000797 raise TypeError("can't deal with %r" % val)
Tim Peters307fa782004-09-23 08:06:40 +0000798
Benjamin Peterson60192082008-10-16 19:34:46 +0000799 def _cmp__(self, other):
Walter Dörwalda0021592005-06-13 21:44:48 +0000800 if not isinstance(other, Rat):
801 other = Rat(other)
Mark Dickinsona56c4672009-01-27 18:17:45 +0000802 x, y = self.n * other.d, self.d * other.n
803 return (x > y) - (x < y)
Benjamin Peterson60192082008-10-16 19:34:46 +0000804 def __eq__(self, other):
805 return self._cmp__(other) == 0
806 def __ne__(self, other):
807 return self._cmp__(other) != 0
808 def __ge__(self, other):
809 return self._cmp__(other) >= 0
810 def __gt__(self, other):
811 return self._cmp__(other) > 0
812 def __le__(self, other):
813 return self._cmp__(other) <= 0
814 def __lt__(self, other):
815 return self._cmp__(other) < 0
Tim Peters307fa782004-09-23 08:06:40 +0000816
Walter Dörwalda0021592005-06-13 21:44:48 +0000817 cases = [0, 0.001, 0.99, 1.0, 1.5, 1e20, 1e200]
818 # 2**48 is an important boundary in the internals. 2**53 is an
819 # important boundary for IEEE double precision.
820 for t in 2.0**48, 2.0**50, 2.0**53:
821 cases.extend([t - 1.0, t - 0.3, t, t + 0.3, t + 1.0,
Guido van Rossume2a383d2007-01-15 16:59:06 +0000822 int(t-1), int(t), int(t+1)])
Christian Heimesa37d4c62007-12-04 23:02:19 +0000823 cases.extend([0, 1, 2, sys.maxsize, float(sys.maxsize)])
Walter Dörwalda0021592005-06-13 21:44:48 +0000824 # 1L<<20000 should exceed all double formats. long(1e200) is to
825 # check that we get equality with 1e200 above.
Guido van Rossume2a383d2007-01-15 16:59:06 +0000826 t = int(1e200)
827 cases.extend([0, 1, 2, 1 << 20000, t-1, t, t+1])
Walter Dörwalda0021592005-06-13 21:44:48 +0000828 cases.extend([-x for x in cases])
829 for x in cases:
830 Rx = Rat(x)
831 for y in cases:
832 Ry = Rat(y)
Mark Dickinsona56c4672009-01-27 18:17:45 +0000833 Rcmp = (Rx > Ry) - (Rx < Ry)
834 xycmp = (x > y) - (x < y)
Walter Dörwalda0021592005-06-13 21:44:48 +0000835 eq(Rcmp, xycmp, Frm("%r %r %d %d", x, y, Rcmp, xycmp))
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))
838 eq(x < y, Rcmp < 0, Frm("%r < %r %d", x, y, Rcmp))
839 eq(x <= y, Rcmp <= 0, Frm("%r <= %r %d", x, y, Rcmp))
840 eq(x > y, Rcmp > 0, Frm("%r > %r %d", x, y, Rcmp))
841 eq(x >= y, Rcmp >= 0, Frm("%r >= %r %d", x, y, Rcmp))
Tim Peters307fa782004-09-23 08:06:40 +0000842
Eric Smith0dd1b632008-02-11 17:55:01 +0000843 def test__format__(self):
Eric Smith8c663262007-08-25 02:26:07 +0000844 self.assertEqual(format(123456789, 'd'), '123456789')
845 self.assertEqual(format(123456789, 'd'), '123456789')
846
Eric Smith185e30c2007-08-30 22:23:08 +0000847 # sign and aligning are interdependent
848 self.assertEqual(format(1, "-"), '1')
849 self.assertEqual(format(-1, "-"), '-1')
850 self.assertEqual(format(1, "-3"), ' 1')
851 self.assertEqual(format(-1, "-3"), ' -1')
852 self.assertEqual(format(1, "+3"), ' +1')
853 self.assertEqual(format(-1, "+3"), ' -1')
854 self.assertEqual(format(1, " 3"), ' 1')
855 self.assertEqual(format(-1, " 3"), ' -1')
856 self.assertEqual(format(1, " "), ' 1')
857 self.assertEqual(format(-1, " "), '-1')
858
Eric Smith8c663262007-08-25 02:26:07 +0000859 # hex
860 self.assertEqual(format(3, "x"), "3")
861 self.assertEqual(format(3, "X"), "3")
862 self.assertEqual(format(1234, "x"), "4d2")
863 self.assertEqual(format(-1234, "x"), "-4d2")
864 self.assertEqual(format(1234, "8x"), " 4d2")
Eric Smith185e30c2007-08-30 22:23:08 +0000865 self.assertEqual(format(-1234, "8x"), " -4d2")
Eric Smith8c663262007-08-25 02:26:07 +0000866 self.assertEqual(format(1234, "x"), "4d2")
867 self.assertEqual(format(-1234, "x"), "-4d2")
868 self.assertEqual(format(-3, "x"), "-3")
869 self.assertEqual(format(-3, "X"), "-3")
870 self.assertEqual(format(int('be', 16), "x"), "be")
871 self.assertEqual(format(int('be', 16), "X"), "BE")
872 self.assertEqual(format(-int('be', 16), "x"), "-be")
873 self.assertEqual(format(-int('be', 16), "X"), "-BE")
874
875 # octal
876 self.assertEqual(format(3, "b"), "11")
877 self.assertEqual(format(-3, "b"), "-11")
878 self.assertEqual(format(1234, "b"), "10011010010")
879 self.assertEqual(format(-1234, "b"), "-10011010010")
880 self.assertEqual(format(1234, "-b"), "10011010010")
881 self.assertEqual(format(-1234, "-b"), "-10011010010")
882 self.assertEqual(format(1234, " b"), " 10011010010")
883 self.assertEqual(format(-1234, " b"), "-10011010010")
884 self.assertEqual(format(1234, "+b"), "+10011010010")
885 self.assertEqual(format(-1234, "+b"), "-10011010010")
886
Eric Smith8c663262007-08-25 02:26:07 +0000887 # make sure these are errors
888 self.assertRaises(ValueError, format, 3, "1.3") # precision disallowed
Eric Smith8c663262007-08-25 02:26:07 +0000889 self.assertRaises(ValueError, format, 3, "+c") # sign not allowed
890 # with 'c'
Eric Smithfa767ef2008-01-28 10:59:27 +0000891
892 # ensure that only int and float type specifiers work
Eric Smith7b69c6c2008-01-27 21:07:59 +0000893 for format_spec in ([chr(x) for x in range(ord('a'), ord('z')+1)] +
894 [chr(x) for x in range(ord('A'), ord('Z')+1)]):
Eric Smithfa767ef2008-01-28 10:59:27 +0000895 if not format_spec in 'bcdoxXeEfFgGn%':
Eric Smith7b69c6c2008-01-27 21:07:59 +0000896 self.assertRaises(ValueError, format, 0, format_spec)
897 self.assertRaises(ValueError, format, 1, format_spec)
898 self.assertRaises(ValueError, format, -1, format_spec)
899 self.assertRaises(ValueError, format, 2**100, format_spec)
900 self.assertRaises(ValueError, format, -(2**100), format_spec)
901
Eric Smithfa767ef2008-01-28 10:59:27 +0000902 # ensure that float type specifiers work; format converts
903 # the int to a float
Eric Smith5807c412008-05-11 21:00:57 +0000904 for format_spec in 'eEfFgG%':
Eric Smithfa767ef2008-01-28 10:59:27 +0000905 for value in [0, 1, -1, 100, -100, 1234567890, -1234567890]:
906 self.assertEqual(format(value, format_spec),
907 format(float(value), format_spec))
Eric Smith8c663262007-08-25 02:26:07 +0000908
Christian Heimesa34706f2008-01-04 03:06:10 +0000909 def test_nan_inf(self):
Christian Heimes1aa7b302008-01-04 03:22:53 +0000910 self.assertRaises(OverflowError, int, float('inf'))
Georg Brandl6aa2d1f2008-08-12 08:35:52 +0000911 self.assertRaises(OverflowError, int, float('-inf'))
912 self.assertRaises(ValueError, int, float('nan'))
Christian Heimesa34706f2008-01-04 03:06:10 +0000913
Benjamin Peterson875d4c02008-07-13 17:44:16 +0000914 def test_true_division(self):
915 huge = 1 << 40000
916 mhuge = -huge
917 self.assertEqual(huge / huge, 1.0)
918 self.assertEqual(mhuge / mhuge, 1.0)
919 self.assertEqual(huge / mhuge, -1.0)
920 self.assertEqual(mhuge / huge, -1.0)
921 self.assertEqual(1 / huge, 0.0)
922 self.assertEqual(1 / huge, 0.0)
923 self.assertEqual(1 / mhuge, 0.0)
924 self.assertEqual(1 / mhuge, 0.0)
925 self.assertEqual((666 * huge + (huge >> 1)) / huge, 666.5)
926 self.assertEqual((666 * mhuge + (mhuge >> 1)) / mhuge, 666.5)
927 self.assertEqual((666 * huge + (huge >> 1)) / mhuge, -666.5)
928 self.assertEqual((666 * mhuge + (mhuge >> 1)) / huge, -666.5)
929 self.assertEqual(huge / (huge << 1), 0.5)
930 self.assertEqual((1000000 * huge) / huge, 1000000)
931
932 namespace = {'huge': huge, 'mhuge': mhuge}
933
934 for overflow in ["float(huge)", "float(mhuge)",
935 "huge / 1", "huge / 2", "huge / -1", "huge / -2",
936 "mhuge / 100", "mhuge / 200"]:
937 self.assertRaises(OverflowError, eval, overflow, namespace)
938
939 for underflow in ["1 / huge", "2 / huge", "-1 / huge", "-2 / huge",
940 "100 / mhuge", "200 / mhuge"]:
941 result = eval(underflow, namespace)
942 self.assertEqual(result, 0.0,
943 "expected underflow to 0 from %r" % underflow)
944
945 for zero in ["huge / 0", "mhuge / 0"]:
946 self.assertRaises(ZeroDivisionError, eval, zero, namespace)
947
948
Facundo Batista6e6f59b2008-07-24 18:57:11 +0000949 def test_small_ints(self):
950 for i in range(-5, 257):
951 self.assertTrue(i is i + 0)
952 self.assertTrue(i is i * 1)
953 self.assertTrue(i is i - 0)
954 self.assertTrue(i is i // 1)
955 self.assertTrue(i is i & -1)
956 self.assertTrue(i is i | 0)
957 self.assertTrue(i is i ^ 0)
958 self.assertTrue(i is ~~i)
959 self.assertTrue(i is i**1)
960 self.assertTrue(i is int(str(i)))
961 self.assertTrue(i is i<<2>>2, str(i))
962 # corner cases
963 i = 1 << 70
964 self.assertTrue(i - i is 0)
965 self.assertTrue(0 * i is 0)
966
Mark Dickinson54bc1ec2008-12-17 16:19:07 +0000967 def test_bit_length(self):
968 tiny = 1e-10
969 for x in range(-65000, 65000):
970 k = x.bit_length()
971 # Check equivalence with Python version
972 self.assertEqual(k, len(bin(x).lstrip('-0b')))
973 # Behaviour as specified in the docs
974 if x != 0:
Georg Brandlab91fde2009-08-13 08:51:18 +0000975 self.assertTrue(2**(k-1) <= abs(x) < 2**k)
Mark Dickinson54bc1ec2008-12-17 16:19:07 +0000976 else:
977 self.assertEqual(k, 0)
978 # Alternative definition: x.bit_length() == 1 + floor(log_2(x))
979 if x != 0:
980 # When x is an exact power of 2, numeric errors can
981 # cause floor(log(x)/log(2)) to be one too small; for
982 # small x this can be fixed by adding a small quantity
983 # to the quotient before taking the floor.
984 self.assertEqual(k, 1 + math.floor(
985 math.log(abs(x))/math.log(2) + tiny))
986
987 self.assertEqual((0).bit_length(), 0)
988 self.assertEqual((1).bit_length(), 1)
989 self.assertEqual((-1).bit_length(), 1)
990 self.assertEqual((2).bit_length(), 2)
991 self.assertEqual((-2).bit_length(), 2)
992 for i in [2, 3, 15, 16, 17, 31, 32, 33, 63, 64, 234]:
993 a = 2**i
994 self.assertEqual((a-1).bit_length(), i)
995 self.assertEqual((1-a).bit_length(), i)
996 self.assertEqual((a).bit_length(), i+1)
997 self.assertEqual((-a).bit_length(), i+1)
998 self.assertEqual((a+1).bit_length(), i+1)
999 self.assertEqual((-a-1).bit_length(), i+1)
1000
Mark Dickinson1124e712009-01-28 21:25:58 +00001001 def test_round(self):
1002 # check round-half-even algorithm. For round to nearest ten;
1003 # rounding map is invariant under adding multiples of 20
1004 test_dict = {0:0, 1:0, 2:0, 3:0, 4:0, 5:0,
1005 6:10, 7:10, 8:10, 9:10, 10:10, 11:10, 12:10, 13:10, 14:10,
1006 15:20, 16:20, 17:20, 18:20, 19:20}
1007 for offset in range(-520, 520, 20):
1008 for k, v in test_dict.items():
1009 got = round(k+offset, -1)
1010 expected = v+offset
1011 self.assertEqual(got, expected)
Georg Brandlab91fde2009-08-13 08:51:18 +00001012 self.assertTrue(type(got) is int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001013
1014 # larger second argument
1015 self.assertEqual(round(-150, -2), -200)
1016 self.assertEqual(round(-149, -2), -100)
1017 self.assertEqual(round(-51, -2), -100)
1018 self.assertEqual(round(-50, -2), 0)
1019 self.assertEqual(round(-49, -2), 0)
1020 self.assertEqual(round(-1, -2), 0)
1021 self.assertEqual(round(0, -2), 0)
1022 self.assertEqual(round(1, -2), 0)
1023 self.assertEqual(round(49, -2), 0)
1024 self.assertEqual(round(50, -2), 0)
1025 self.assertEqual(round(51, -2), 100)
1026 self.assertEqual(round(149, -2), 100)
1027 self.assertEqual(round(150, -2), 200)
1028 self.assertEqual(round(250, -2), 200)
1029 self.assertEqual(round(251, -2), 300)
1030 self.assertEqual(round(172500, -3), 172000)
1031 self.assertEqual(round(173500, -3), 174000)
1032 self.assertEqual(round(31415926535, -1), 31415926540)
1033 self.assertEqual(round(31415926535, -2), 31415926500)
1034 self.assertEqual(round(31415926535, -3), 31415927000)
1035 self.assertEqual(round(31415926535, -4), 31415930000)
1036 self.assertEqual(round(31415926535, -5), 31415900000)
1037 self.assertEqual(round(31415926535, -6), 31416000000)
1038 self.assertEqual(round(31415926535, -7), 31420000000)
1039 self.assertEqual(round(31415926535, -8), 31400000000)
1040 self.assertEqual(round(31415926535, -9), 31000000000)
1041 self.assertEqual(round(31415926535, -10), 30000000000)
1042 self.assertEqual(round(31415926535, -11), 0)
1043 self.assertEqual(round(31415926535, -12), 0)
1044 self.assertEqual(round(31415926535, -999), 0)
1045
1046 # should get correct results even for huge inputs
1047 for k in range(10, 100):
1048 got = round(10**k + 324678, -3)
1049 expect = 10**k + 325000
1050 self.assertEqual(got, expect)
Georg Brandlab91fde2009-08-13 08:51:18 +00001051 self.assertTrue(type(got) is int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001052
1053 # nonnegative second argument: round(x, n) should just return x
1054 for n in range(5):
1055 for i in range(100):
1056 x = random.randrange(-10000, 10000)
1057 got = round(x, n)
1058 self.assertEqual(got, x)
Georg Brandlab91fde2009-08-13 08:51:18 +00001059 self.assertTrue(type(got) is int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001060 for huge_n in 2**31-1, 2**31, 2**63-1, 2**63, 2**100, 10**100:
1061 self.assertEqual(round(8979323, huge_n), 8979323)
1062
1063 # omitted second argument
1064 for i in range(100):
1065 x = random.randrange(-10000, 10000)
1066 got = round(x)
1067 self.assertEqual(got, x)
Georg Brandlab91fde2009-08-13 08:51:18 +00001068 self.assertTrue(type(got) is int)
Mark Dickinson1124e712009-01-28 21:25:58 +00001069
1070 # bad second argument
1071 bad_exponents = ('brian', 2.0, 0j, None)
1072 for e in bad_exponents:
1073 self.assertRaises(TypeError, round, 3, e)
1074
1075
Mark Dickinson54bc1ec2008-12-17 16:19:07 +00001076
Walter Dörwalda0021592005-06-13 21:44:48 +00001077def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001078 support.run_unittest(LongTest)
Tim Peters307fa782004-09-23 08:06:40 +00001079
Walter Dörwalda0021592005-06-13 21:44:48 +00001080if __name__ == "__main__":
1081 test_main()