blob: c47b8e3505c0e2596fea54e5feab73c9b7d8865a [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
Alexandre Vassalottic36c3782010-01-09 20:35:09 +00007import array
Walter Dörwalda0021592005-06-13 21:44:48 +00008
9# 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
Mark Dickinsoncbb62742009-12-27 15:09:50 +000018# decorator for skipping tests on non-IEEE 754 platforms
19requires_IEEE_754 = unittest.skipUnless(
20 float.__getformat__("double").startswith("IEEE"),
21 "test requires IEEE 754 doubles")
22
Guido van Rossum4365cab1998-08-13 14:20:17 +000023# SHIFT should match the value in longintrepr.h for best testing.
Mark Dickinsonbd792642009-03-18 20:06:12 +000024SHIFT = sys.int_info.bits_per_digit
Guido van Rossum4365cab1998-08-13 14:20:17 +000025BASE = 2 ** SHIFT
26MASK = BASE - 1
Tim Petersdaec9612004-08-30 23:18:23 +000027KARATSUBA_CUTOFF = 70 # from longobject.c
Guido van Rossum4365cab1998-08-13 14:20:17 +000028
29# Max number of base BASE digits to use in test cases. Doubling
Tim Peters28b0e2a2002-08-13 02:17:11 +000030# this will more than double the runtime.
31MAXDIGITS = 15
Guido van Rossum4365cab1998-08-13 14:20:17 +000032
Guido van Rossum4581a0c1998-10-02 01:19:48 +000033# build some special values
Guido van Rossumc1f779c2007-07-03 08:25:58 +000034special = [0, 1, 2, BASE, BASE >> 1, 0x5555555555555555, 0xaaaaaaaaaaaaaaaa]
Guido van Rossum4581a0c1998-10-02 01:19:48 +000035# some solid strings of one bits
Guido van Rossume2a383d2007-01-15 16:59:06 +000036p2 = 4 # 0 and 1 already added
Guido van Rossum4581a0c1998-10-02 01:19:48 +000037for i in range(2*SHIFT):
38 special.append(p2 - 1)
39 p2 = p2 << 1
40del p2
41# add complements & negations
Guido van Rossumc1f779c2007-07-03 08:25:58 +000042special += [~x for x in special] + [-x for x in special]
Guido van Rossum4581a0c1998-10-02 01:19:48 +000043
Mark Dickinsoncbb62742009-12-27 15:09:50 +000044DBL_MAX = sys.float_info.max
45DBL_MAX_EXP = sys.float_info.max_exp
46DBL_MIN_EXP = sys.float_info.min_exp
47DBL_MANT_DIG = sys.float_info.mant_dig
48DBL_MIN_OVERFLOW = 2**DBL_MAX_EXP - 2**(DBL_MAX_EXP - DBL_MANT_DIG - 1)
49
50# pure Python version of correctly-rounded true division
51def truediv(a, b):
52 """Correctly-rounded true division for integers."""
53 negative = a^b < 0
54 a, b = abs(a), abs(b)
55
56 # exceptions: division by zero, overflow
57 if not b:
58 raise ZeroDivisionError("division by zero")
59 if a >= DBL_MIN_OVERFLOW * b:
60 raise OverflowError("int/int too large to represent as a float")
61
62 # find integer d satisfying 2**(d - 1) <= a/b < 2**d
63 d = a.bit_length() - b.bit_length()
64 if d >= 0 and a >= 2**d * b or d < 0 and a * 2**-d >= b:
65 d += 1
66
67 # compute 2**-exp * a / b for suitable exp
68 exp = max(d, DBL_MIN_EXP) - DBL_MANT_DIG
69 a, b = a << max(-exp, 0), b << max(exp, 0)
70 q, r = divmod(a, b)
71
72 # round-half-to-even: fractional part is r/b, which is > 0.5 iff
73 # 2*r > b, and == 0.5 iff 2*r == b.
74 if 2*r > b or 2*r == b and q % 2 == 1:
75 q += 1
76
Mark Dickinsona4e15062009-12-27 19:03:31 +000077 result = math.ldexp(q, exp)
Mark Dickinsoncbb62742009-12-27 15:09:50 +000078 return -result if negative else result
79
80
Walter Dörwalda0021592005-06-13 21:44:48 +000081class LongTest(unittest.TestCase):
Guido van Rossum4365cab1998-08-13 14:20:17 +000082
Walter Dörwalda0021592005-06-13 21:44:48 +000083 # Get quasi-random long consisting of ndigits digits (in base BASE).
84 # quasi == the most-significant digit will not be 0, and the number
85 # is constructed to contain long strings of 0 and 1 bits. These are
86 # more likely than random bits to provoke digit-boundary errors.
87 # The sign of the number is also random.
Guido van Rossum4365cab1998-08-13 14:20:17 +000088
Walter Dörwalda0021592005-06-13 21:44:48 +000089 def getran(self, ndigits):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000090 self.assertTrue(ndigits > 0)
Walter Dörwalda0021592005-06-13 21:44:48 +000091 nbits_hi = ndigits * SHIFT
92 nbits_lo = nbits_hi - SHIFT + 1
Guido van Rossume2a383d2007-01-15 16:59:06 +000093 answer = 0
Walter Dörwalda0021592005-06-13 21:44:48 +000094 nbits = 0
95 r = int(random.random() * (SHIFT * 2)) | 1 # force 1 bits to start
96 while nbits < nbits_lo:
97 bits = (r >> 1) + 1
98 bits = min(bits, nbits_hi - nbits)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000099 self.assertTrue(1 <= bits <= SHIFT)
Walter Dörwalda0021592005-06-13 21:44:48 +0000100 nbits = nbits + bits
101 answer = answer << bits
102 if r & 1:
103 answer = answer | ((1 << bits) - 1)
104 r = int(random.random() * (SHIFT * 2))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000105 self.assertTrue(nbits_lo <= nbits <= nbits_hi)
Walter Dörwalda0021592005-06-13 21:44:48 +0000106 if random.random() < 0.5:
107 answer = -answer
108 return answer
Guido van Rossum4581a0c1998-10-02 01:19:48 +0000109
Walter Dörwalda0021592005-06-13 21:44:48 +0000110 # Get random long consisting of ndigits random digits (relative to base
111 # BASE). The sign bit is also random.
Guido van Rossum4581a0c1998-10-02 01:19:48 +0000112
Walter Dörwalda0021592005-06-13 21:44:48 +0000113 def getran2(ndigits):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000114 answer = 0
Guido van Rossum805365e2007-05-07 22:24:25 +0000115 for i in range(ndigits):
Walter Dörwalda0021592005-06-13 21:44:48 +0000116 answer = (answer << SHIFT) | random.randint(0, MASK)
117 if random.random() < 0.5:
118 answer = -answer
119 return answer
Guido van Rossum4365cab1998-08-13 14:20:17 +0000120
Walter Dörwalda0021592005-06-13 21:44:48 +0000121 def check_division(self, x, y):
122 eq = self.assertEqual
123 q, r = divmod(x, y)
124 q2, r2 = x//y, x%y
125 pab, pba = x*y, y*x
126 eq(pab, pba, Frm("multiplication does not commute for %r and %r", x, y))
127 eq(q, q2, Frm("divmod returns different quotient than / for %r and %r", x, y))
128 eq(r, r2, Frm("divmod returns different mod than %% for %r and %r", x, y))
129 eq(x, q*y + r, Frm("x != q*y + r after divmod on x=%r, y=%r", x, y))
130 if y > 0:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000131 self.assertTrue(0 <= r < y, Frm("bad mod from divmod on %r and %r", x, y))
Walter Dörwalda0021592005-06-13 21:44:48 +0000132 else:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000133 self.assertTrue(y < r <= 0, Frm("bad mod from divmod on %r and %r", x, y))
Guido van Rossum4365cab1998-08-13 14:20:17 +0000134
Walter Dörwalda0021592005-06-13 21:44:48 +0000135 def test_division(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000136 digits = list(range(1, MAXDIGITS+1)) + list(range(KARATSUBA_CUTOFF,
137 KARATSUBA_CUTOFF + 14))
Walter Dörwalda0021592005-06-13 21:44:48 +0000138 digits.append(KARATSUBA_CUTOFF * 3)
139 for lenx in digits:
140 x = self.getran(lenx)
141 for leny in digits:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000142 y = self.getran(leny) or 1
Walter Dörwalda0021592005-06-13 21:44:48 +0000143 self.check_division(x, y)
Guido van Rossum4365cab1998-08-13 14:20:17 +0000144
Mark Dickinsonbd792642009-03-18 20:06:12 +0000145 # specific numbers chosen to exercise corner cases of the
146 # current long division implementation
147
148 # 30-bit cases involving a quotient digit estimate of BASE+1
149 self.check_division(1231948412290879395966702881,
150 1147341367131428698)
151 self.check_division(815427756481275430342312021515587883,
152 707270836069027745)
153 self.check_division(627976073697012820849443363563599041,
154 643588798496057020)
155 self.check_division(1115141373653752303710932756325578065,
156 1038556335171453937726882627)
157 # 30-bit cases that require the post-subtraction correction step
158 self.check_division(922498905405436751940989320930368494,
159 949985870686786135626943396)
160 self.check_division(768235853328091167204009652174031844,
161 1091555541180371554426545266)
162
163 # 15-bit cases involving a quotient digit estimate of BASE+1
164 self.check_division(20172188947443, 615611397)
165 self.check_division(1020908530270155025, 950795710)
166 self.check_division(128589565723112408, 736393718)
167 self.check_division(609919780285761575, 18613274546784)
168 # 15-bit cases that require the post-subtraction correction step
169 self.check_division(710031681576388032, 26769404391308)
170 self.check_division(1933622614268221, 30212853348836)
171
172
173
Walter Dörwalda0021592005-06-13 21:44:48 +0000174 def test_karatsuba(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000175 digits = list(range(1, 5)) + list(range(KARATSUBA_CUTOFF,
176 KARATSUBA_CUTOFF + 10))
Walter Dörwalda0021592005-06-13 21:44:48 +0000177 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:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000184 a = (1 << abits) - 1
Walter Dörwalda0021592005-06-13 21:44:48 +0000185 for bbits in bits:
186 if bbits < abits:
187 continue
Guido van Rossume2a383d2007-01-15 16:59:06 +0000188 b = (1 << bbits) - 1
Walter Dörwalda0021592005-06-13 21:44:48 +0000189 x = a * b
Guido van Rossume2a383d2007-01-15 16:59:06 +0000190 y = ((1 << (abits + bbits)) -
191 (1 << abits) -
192 (1 << bbits) +
Walter Dörwalda0021592005-06-13 21:44:48 +0000193 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))
Guido van Rossum805365e2007-05-07 22:24:25 +0000214 for n in range(2*SHIFT):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000215 p2 = 2 ** n
Walter Dörwalda0021592005-06-13 21:44:48 +0000216 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)
Guido van Rossum805365e2007-05-07 22:24:25 +0000258 digits = range(1, MAXDIGITS+1)
Walter Dörwalda0021592005-06-13 21:44:48 +0000259 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):
Walter Dörwalda0021592005-06-13 21:44:48 +0000268 digits = []
269 sign = 0
270 if x < 0:
271 sign, x = 1, -x
272 while x:
273 x, r = divmod(x, base)
274 digits.append(int(r))
275 digits.reverse()
276 digits = digits or [0]
277 return '-'[:sign] + \
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000278 {2: '0b', 8: '0o', 10: '', 16: '0x'}[base] + \
Guido van Rossumd2dbecb2006-08-18 16:29:54 +0000279 "".join(map(lambda i: "0123456789abcdef"[i], digits))
Guido van Rossum4365cab1998-08-13 14:20:17 +0000280
Walter Dörwalda0021592005-06-13 21:44:48 +0000281 def check_format_1(self, x):
282 for base, mapper in (8, oct), (10, repr), (16, hex):
283 got = mapper(x)
284 expected = self.slow_format(x, base)
285 msg = Frm("%s returned %r but expected %r for %r",
286 mapper.__name__, got, expected, x)
287 self.assertEqual(got, expected, msg)
Mark Dickinson5c2db372009-12-05 20:28:34 +0000288 self.assertEqual(int(got, 0), x, Frm('int("%s", 0) != %r', got, x))
Walter Dörwalda0021592005-06-13 21:44:48 +0000289 # str() has to be checked a little differently since there's no
290 # trailing "L"
291 got = str(x)
Guido van Rossumd2dbecb2006-08-18 16:29:54 +0000292 expected = self.slow_format(x, 10)
Walter Dörwalda0021592005-06-13 21:44:48 +0000293 msg = Frm("%s returned %r but expected %r for %r",
294 mapper.__name__, got, expected, x)
295 self.assertEqual(got, expected, msg)
Guido van Rossum4365cab1998-08-13 14:20:17 +0000296
Walter Dörwalda0021592005-06-13 21:44:48 +0000297 def test_format(self):
298 for x in special:
299 self.check_format_1(x)
Guido van Rossum805365e2007-05-07 22:24:25 +0000300 for i in range(10):
301 for lenx in range(1, MAXDIGITS+1):
Walter Dörwalda0021592005-06-13 21:44:48 +0000302 x = self.getran(lenx)
303 self.check_format_1(x)
Guido van Rossum4365cab1998-08-13 14:20:17 +0000304
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000305 def test_long(self):
Mark Dickinson5c2db372009-12-05 20:28:34 +0000306 # Check conversions from string
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000307 LL = [
308 ('1' + '0'*20, 10**20),
309 ('1' + '0'*100, 10**100)
310 ]
Mark Dickinson5c2db372009-12-05 20:28:34 +0000311 for s, v in LL:
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000312 for sign in "", "+", "-":
313 for prefix in "", " ", "\t", " \t\t ":
314 ss = prefix + sign + s
315 vv = v
316 if sign == "-" and v is not ValueError:
317 vv = -v
318 try:
Mark Dickinson5c2db372009-12-05 20:28:34 +0000319 self.assertEqual(int(ss), vv)
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000320 except ValueError:
321 pass
322
Mark Dickinson9ffc0202009-01-20 20:45:53 +0000323 # trailing L should no longer be accepted...
324 self.assertRaises(ValueError, int, '123L')
325 self.assertRaises(ValueError, int, '123l')
326 self.assertRaises(ValueError, int, '0L')
327 self.assertRaises(ValueError, int, '-37L')
328 self.assertRaises(ValueError, int, '0x32L', 16)
329 self.assertRaises(ValueError, int, '1L', 21)
330 # ... but it's just a normal digit if base >= 22
331 self.assertEqual(int('1L', 22), 43)
332
Mark Dickinson56544db2010-05-26 19:14:01 +0000333 # tests with base 0
334 self.assertEqual(int('000', 0), 0)
335 self.assertEqual(int('0o123', 0), 83)
336 self.assertEqual(int('0x123', 0), 291)
337 self.assertEqual(int('0b100', 0), 4)
338 self.assertEqual(int(' 0O123 ', 0), 83)
339 self.assertEqual(int(' 0X123 ', 0), 291)
340 self.assertEqual(int(' 0B100 ', 0), 4)
341 self.assertEqual(int('0', 0), 0)
342 self.assertEqual(int('+0', 0), 0)
343 self.assertEqual(int('-0', 0), 0)
344 self.assertEqual(int('00', 0), 0)
345 self.assertRaises(ValueError, int, '08', 0)
346 self.assertRaises(ValueError, int, '-012395', 0)
347
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000348 def test_conversion(self):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000349
Mark Dickinson5c2db372009-12-05 20:28:34 +0000350 class JustLong:
351 # test that __long__ no longer used in 3.x
352 def __long__(self):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000353 return 42
Mark Dickinson5c2db372009-12-05 20:28:34 +0000354 self.assertRaises(TypeError, int, JustLong())
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000355
Mark Dickinson5c2db372009-12-05 20:28:34 +0000356 class LongTrunc:
357 # __long__ should be ignored in 3.x
358 def __long__(self):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000359 return 42
Mark Dickinson5c2db372009-12-05 20:28:34 +0000360 def __trunc__(self):
361 return 1729
362 self.assertEqual(int(LongTrunc()), 1729)
Tim Peters26c7fa32001-08-23 22:56:21 +0000363
Mark Dickinsonc6300392009-04-20 21:38:00 +0000364 @unittest.skipUnless(float.__getformat__("double").startswith("IEEE"),
365 "test requires IEEE 754 doubles")
366 def test_float_conversion(self):
Mark Dickinsonc6300392009-04-20 21:38:00 +0000367
368 exact_values = [0, 1, 2,
369 2**53-3,
370 2**53-2,
371 2**53-1,
372 2**53,
373 2**53+2,
374 2**54-4,
375 2**54-2,
376 2**54,
377 2**54+4]
378 for x in exact_values:
379 self.assertEqual(float(x), x)
380 self.assertEqual(float(-x), -x)
381
382 # test round-half-even
383 for x, y in [(1, 0), (2, 2), (3, 4), (4, 4), (5, 4), (6, 6), (7, 8)]:
384 for p in range(15):
385 self.assertEqual(int(float(2**p*(2**53+x))), 2**p*(2**53+y))
386
387 for x, y in [(0, 0), (1, 0), (2, 0), (3, 4), (4, 4), (5, 4), (6, 8),
388 (7, 8), (8, 8), (9, 8), (10, 8), (11, 12), (12, 12),
389 (13, 12), (14, 16), (15, 16)]:
390 for p in range(15):
391 self.assertEqual(int(float(2**p*(2**54+x))), 2**p*(2**54+y))
392
393 # behaviour near extremes of floating-point range
394 int_dbl_max = int(DBL_MAX)
395 top_power = 2**DBL_MAX_EXP
396 halfway = (int_dbl_max + top_power)//2
397 self.assertEqual(float(int_dbl_max), DBL_MAX)
398 self.assertEqual(float(int_dbl_max+1), DBL_MAX)
399 self.assertEqual(float(halfway-1), DBL_MAX)
400 self.assertRaises(OverflowError, float, halfway)
401 self.assertEqual(float(1-halfway), -DBL_MAX)
402 self.assertRaises(OverflowError, float, -halfway)
403 self.assertRaises(OverflowError, float, top_power-1)
404 self.assertRaises(OverflowError, float, top_power)
405 self.assertRaises(OverflowError, float, top_power+1)
406 self.assertRaises(OverflowError, float, 2*top_power-1)
407 self.assertRaises(OverflowError, float, 2*top_power)
408 self.assertRaises(OverflowError, float, top_power*top_power)
409
410 for p in range(100):
411 x = 2**p * (2**53 + 1) + 1
412 y = 2**p * (2**53 + 2)
413 self.assertEqual(int(float(x)), y)
414
415 x = 2**p * (2**53 + 1)
416 y = 2**p * 2**53
417 self.assertEqual(int(float(x)), y)
418
Walter Dörwalda0021592005-06-13 21:44:48 +0000419 def test_float_overflow(self):
Walter Dörwalda0021592005-06-13 21:44:48 +0000420 for x in -2.0, -1.0, 0.0, 1.0, 2.0:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000421 self.assertEqual(float(int(x)), x)
Tim Peters9fffa3e2001-09-04 05:14:19 +0000422
Walter Dörwalda0021592005-06-13 21:44:48 +0000423 shuge = '12345' * 120
Guido van Rossume2a383d2007-01-15 16:59:06 +0000424 huge = 1 << 30000
Walter Dörwalda0021592005-06-13 21:44:48 +0000425 mhuge = -huge
426 namespace = {'huge': huge, 'mhuge': mhuge, 'shuge': shuge, 'math': math}
427 for test in ["float(huge)", "float(mhuge)",
428 "complex(huge)", "complex(mhuge)",
429 "complex(huge, 1)", "complex(mhuge, 1)",
430 "complex(1, huge)", "complex(1, mhuge)",
431 "1. + huge", "huge + 1.", "1. + mhuge", "mhuge + 1.",
432 "1. - huge", "huge - 1.", "1. - mhuge", "mhuge - 1.",
433 "1. * huge", "huge * 1.", "1. * mhuge", "mhuge * 1.",
434 "1. // huge", "huge // 1.", "1. // mhuge", "mhuge // 1.",
435 "1. / huge", "huge / 1.", "1. / mhuge", "mhuge / 1.",
436 "1. ** huge", "huge ** 1.", "1. ** mhuge", "mhuge ** 1.",
437 "math.sin(huge)", "math.sin(mhuge)",
438 "math.sqrt(huge)", "math.sqrt(mhuge)", # should do better
Guido van Rossum28bbe422007-08-24 03:46:30 +0000439 # math.floor() of an int returns an int now
440 ##"math.floor(huge)", "math.floor(mhuge)",
441 ]:
Tim Peters9fffa3e2001-09-04 05:14:19 +0000442
Walter Dörwalda0021592005-06-13 21:44:48 +0000443 self.assertRaises(OverflowError, eval, test, namespace)
Tim Peters9fffa3e2001-09-04 05:14:19 +0000444
Mark Dickinson5c2db372009-12-05 20:28:34 +0000445 # XXX Perhaps float(shuge) can raise OverflowError on some box?
446 # The comparison should not.
447 self.assertNotEqual(float(shuge), int(shuge),
448 "float(shuge) should not equal int(shuge)")
Tim Peters83e7ccc2001-09-04 06:37:28 +0000449
Walter Dörwalda0021592005-06-13 21:44:48 +0000450 def test_logs(self):
Walter Dörwalda0021592005-06-13 21:44:48 +0000451 LOG10E = math.log10(math.e)
Tim Peters307fa782004-09-23 08:06:40 +0000452
Guido van Rossum805365e2007-05-07 22:24:25 +0000453 for exp in list(range(10)) + [100, 1000, 10000]:
Walter Dörwalda0021592005-06-13 21:44:48 +0000454 value = 10 ** exp
455 log10 = math.log10(value)
456 self.assertAlmostEqual(log10, exp)
Tim Peters78526162001-09-05 00:53:45 +0000457
Walter Dörwalda0021592005-06-13 21:44:48 +0000458 # log10(value) == exp, so log(value) == log10(value)/log10(e) ==
459 # exp/LOG10E
460 expected = exp / LOG10E
461 log = math.log(value)
462 self.assertAlmostEqual(log, expected)
Tim Peters78526162001-09-05 00:53:45 +0000463
Guido van Rossume2a383d2007-01-15 16:59:06 +0000464 for bad in -(1 << 10000), -2, 0:
Walter Dörwalda0021592005-06-13 21:44:48 +0000465 self.assertRaises(ValueError, math.log, bad)
466 self.assertRaises(ValueError, math.log10, bad)
Tim Peters78526162001-09-05 00:53:45 +0000467
Walter Dörwalda0021592005-06-13 21:44:48 +0000468 def test_mixed_compares(self):
469 eq = self.assertEqual
Tim Peters78526162001-09-05 00:53:45 +0000470
Walter Dörwalda0021592005-06-13 21:44:48 +0000471 # We're mostly concerned with that mixing floats and longs does the
472 # right stuff, even when longs are too large to fit in a float.
473 # The safest way to check the results is to use an entirely different
474 # method, which we do here via a skeletal rational class (which
475 # represents all Python ints, longs and floats exactly).
476 class Rat:
477 def __init__(self, value):
Walter Dörwaldaa97f042007-05-03 21:05:51 +0000478 if isinstance(value, int):
Walter Dörwalda0021592005-06-13 21:44:48 +0000479 self.n = value
480 self.d = 1
481 elif isinstance(value, float):
482 # Convert to exact rational equivalent.
483 f, e = math.frexp(abs(value))
484 assert f == 0 or 0.5 <= f < 1.0
485 # |value| = f * 2**e exactly
Tim Peters78526162001-09-05 00:53:45 +0000486
Walter Dörwalda0021592005-06-13 21:44:48 +0000487 # Suck up CHUNK bits at a time; 28 is enough so that we suck
488 # up all bits in 2 iterations for all known binary double-
489 # precision formats, and small enough to fit in an int.
490 CHUNK = 28
491 top = 0
492 # invariant: |value| = (top + f) * 2**e exactly
493 while f:
494 f = math.ldexp(f, CHUNK)
495 digit = int(f)
496 assert digit >> CHUNK == 0
497 top = (top << CHUNK) | digit
498 f -= digit
499 assert 0.0 <= f < 1.0
500 e -= CHUNK
Tim Peters78526162001-09-05 00:53:45 +0000501
Walter Dörwalda0021592005-06-13 21:44:48 +0000502 # Now |value| = top * 2**e exactly.
503 if e >= 0:
504 n = top << e
505 d = 1
506 else:
507 n = top
508 d = 1 << -e
509 if value < 0:
510 n = -n
511 self.n = n
512 self.d = d
513 assert float(n) / float(d) == value
Tim Peters307fa782004-09-23 08:06:40 +0000514 else:
Georg Brandl89fad142010-03-14 10:23:39 +0000515 raise TypeError("can't deal with %r" % value)
Tim Peters307fa782004-09-23 08:06:40 +0000516
Benjamin Peterson60192082008-10-16 19:34:46 +0000517 def _cmp__(self, other):
Walter Dörwalda0021592005-06-13 21:44:48 +0000518 if not isinstance(other, Rat):
519 other = Rat(other)
Mark Dickinsona56c4672009-01-27 18:17:45 +0000520 x, y = self.n * other.d, self.d * other.n
521 return (x > y) - (x < y)
Benjamin Peterson60192082008-10-16 19:34:46 +0000522 def __eq__(self, other):
523 return self._cmp__(other) == 0
524 def __ne__(self, other):
525 return self._cmp__(other) != 0
526 def __ge__(self, other):
527 return self._cmp__(other) >= 0
528 def __gt__(self, other):
529 return self._cmp__(other) > 0
530 def __le__(self, other):
531 return self._cmp__(other) <= 0
532 def __lt__(self, other):
533 return self._cmp__(other) < 0
Tim Peters307fa782004-09-23 08:06:40 +0000534
Walter Dörwalda0021592005-06-13 21:44:48 +0000535 cases = [0, 0.001, 0.99, 1.0, 1.5, 1e20, 1e200]
536 # 2**48 is an important boundary in the internals. 2**53 is an
537 # important boundary for IEEE double precision.
538 for t in 2.0**48, 2.0**50, 2.0**53:
539 cases.extend([t - 1.0, t - 0.3, t, t + 0.3, t + 1.0,
Guido van Rossume2a383d2007-01-15 16:59:06 +0000540 int(t-1), int(t), int(t+1)])
Christian Heimesa37d4c62007-12-04 23:02:19 +0000541 cases.extend([0, 1, 2, sys.maxsize, float(sys.maxsize)])
Mark Dickinson5c2db372009-12-05 20:28:34 +0000542 # 1 << 20000 should exceed all double formats. int(1e200) is to
Walter Dörwalda0021592005-06-13 21:44:48 +0000543 # check that we get equality with 1e200 above.
Guido van Rossume2a383d2007-01-15 16:59:06 +0000544 t = int(1e200)
545 cases.extend([0, 1, 2, 1 << 20000, t-1, t, t+1])
Walter Dörwalda0021592005-06-13 21:44:48 +0000546 cases.extend([-x for x in cases])
547 for x in cases:
548 Rx = Rat(x)
549 for y in cases:
550 Ry = Rat(y)
Mark Dickinsona56c4672009-01-27 18:17:45 +0000551 Rcmp = (Rx > Ry) - (Rx < Ry)
552 xycmp = (x > y) - (x < y)
Walter Dörwalda0021592005-06-13 21:44:48 +0000553 eq(Rcmp, xycmp, Frm("%r %r %d %d", x, y, Rcmp, xycmp))
554 eq(x == y, Rcmp == 0, Frm("%r == %r %d", x, y, Rcmp))
555 eq(x != y, Rcmp != 0, Frm("%r != %r %d", x, y, Rcmp))
556 eq(x < y, Rcmp < 0, Frm("%r < %r %d", x, y, Rcmp))
557 eq(x <= y, Rcmp <= 0, Frm("%r <= %r %d", x, y, Rcmp))
558 eq(x > y, Rcmp > 0, Frm("%r > %r %d", x, y, Rcmp))
559 eq(x >= y, Rcmp >= 0, Frm("%r >= %r %d", x, y, Rcmp))
Tim Peters307fa782004-09-23 08:06:40 +0000560
Eric Smith0dd1b632008-02-11 17:55:01 +0000561 def test__format__(self):
Eric Smith8c663262007-08-25 02:26:07 +0000562 self.assertEqual(format(123456789, 'd'), '123456789')
563 self.assertEqual(format(123456789, 'd'), '123456789')
564
Eric Smith185e30c2007-08-30 22:23:08 +0000565 # sign and aligning are interdependent
566 self.assertEqual(format(1, "-"), '1')
567 self.assertEqual(format(-1, "-"), '-1')
568 self.assertEqual(format(1, "-3"), ' 1')
569 self.assertEqual(format(-1, "-3"), ' -1')
570 self.assertEqual(format(1, "+3"), ' +1')
571 self.assertEqual(format(-1, "+3"), ' -1')
572 self.assertEqual(format(1, " 3"), ' 1')
573 self.assertEqual(format(-1, " 3"), ' -1')
574 self.assertEqual(format(1, " "), ' 1')
575 self.assertEqual(format(-1, " "), '-1')
576
Eric Smith8c663262007-08-25 02:26:07 +0000577 # hex
578 self.assertEqual(format(3, "x"), "3")
579 self.assertEqual(format(3, "X"), "3")
580 self.assertEqual(format(1234, "x"), "4d2")
581 self.assertEqual(format(-1234, "x"), "-4d2")
582 self.assertEqual(format(1234, "8x"), " 4d2")
Eric Smith185e30c2007-08-30 22:23:08 +0000583 self.assertEqual(format(-1234, "8x"), " -4d2")
Eric Smith8c663262007-08-25 02:26:07 +0000584 self.assertEqual(format(1234, "x"), "4d2")
585 self.assertEqual(format(-1234, "x"), "-4d2")
586 self.assertEqual(format(-3, "x"), "-3")
587 self.assertEqual(format(-3, "X"), "-3")
588 self.assertEqual(format(int('be', 16), "x"), "be")
589 self.assertEqual(format(int('be', 16), "X"), "BE")
590 self.assertEqual(format(-int('be', 16), "x"), "-be")
591 self.assertEqual(format(-int('be', 16), "X"), "-BE")
592
593 # octal
594 self.assertEqual(format(3, "b"), "11")
595 self.assertEqual(format(-3, "b"), "-11")
596 self.assertEqual(format(1234, "b"), "10011010010")
597 self.assertEqual(format(-1234, "b"), "-10011010010")
598 self.assertEqual(format(1234, "-b"), "10011010010")
599 self.assertEqual(format(-1234, "-b"), "-10011010010")
600 self.assertEqual(format(1234, " b"), " 10011010010")
601 self.assertEqual(format(-1234, " b"), "-10011010010")
602 self.assertEqual(format(1234, "+b"), "+10011010010")
603 self.assertEqual(format(-1234, "+b"), "-10011010010")
604
Eric Smith8c663262007-08-25 02:26:07 +0000605 # make sure these are errors
606 self.assertRaises(ValueError, format, 3, "1.3") # precision disallowed
Eric Smith8c663262007-08-25 02:26:07 +0000607 self.assertRaises(ValueError, format, 3, "+c") # sign not allowed
608 # with 'c'
Eric Smithfa767ef2008-01-28 10:59:27 +0000609
610 # ensure that only int and float type specifiers work
Eric Smith7b69c6c2008-01-27 21:07:59 +0000611 for format_spec in ([chr(x) for x in range(ord('a'), ord('z')+1)] +
612 [chr(x) for x in range(ord('A'), ord('Z')+1)]):
Eric Smithfa767ef2008-01-28 10:59:27 +0000613 if not format_spec in 'bcdoxXeEfFgGn%':
Eric Smith7b69c6c2008-01-27 21:07:59 +0000614 self.assertRaises(ValueError, format, 0, format_spec)
615 self.assertRaises(ValueError, format, 1, format_spec)
616 self.assertRaises(ValueError, format, -1, format_spec)
617 self.assertRaises(ValueError, format, 2**100, format_spec)
618 self.assertRaises(ValueError, format, -(2**100), format_spec)
619
Eric Smithfa767ef2008-01-28 10:59:27 +0000620 # ensure that float type specifiers work; format converts
621 # the int to a float
Eric Smith5807c412008-05-11 21:00:57 +0000622 for format_spec in 'eEfFgG%':
Eric Smithfa767ef2008-01-28 10:59:27 +0000623 for value in [0, 1, -1, 100, -100, 1234567890, -1234567890]:
624 self.assertEqual(format(value, format_spec),
625 format(float(value), format_spec))
Eric Smith8c663262007-08-25 02:26:07 +0000626
Christian Heimesa34706f2008-01-04 03:06:10 +0000627 def test_nan_inf(self):
Christian Heimes1aa7b302008-01-04 03:22:53 +0000628 self.assertRaises(OverflowError, int, float('inf'))
Georg Brandl6aa2d1f2008-08-12 08:35:52 +0000629 self.assertRaises(OverflowError, int, float('-inf'))
630 self.assertRaises(ValueError, int, float('nan'))
Christian Heimesa34706f2008-01-04 03:06:10 +0000631
Benjamin Peterson875d4c02008-07-13 17:44:16 +0000632 def test_true_division(self):
633 huge = 1 << 40000
634 mhuge = -huge
635 self.assertEqual(huge / huge, 1.0)
636 self.assertEqual(mhuge / mhuge, 1.0)
637 self.assertEqual(huge / mhuge, -1.0)
638 self.assertEqual(mhuge / huge, -1.0)
639 self.assertEqual(1 / huge, 0.0)
640 self.assertEqual(1 / huge, 0.0)
641 self.assertEqual(1 / mhuge, 0.0)
642 self.assertEqual(1 / mhuge, 0.0)
643 self.assertEqual((666 * huge + (huge >> 1)) / huge, 666.5)
644 self.assertEqual((666 * mhuge + (mhuge >> 1)) / mhuge, 666.5)
645 self.assertEqual((666 * huge + (huge >> 1)) / mhuge, -666.5)
646 self.assertEqual((666 * mhuge + (mhuge >> 1)) / huge, -666.5)
647 self.assertEqual(huge / (huge << 1), 0.5)
648 self.assertEqual((1000000 * huge) / huge, 1000000)
649
650 namespace = {'huge': huge, 'mhuge': mhuge}
651
652 for overflow in ["float(huge)", "float(mhuge)",
653 "huge / 1", "huge / 2", "huge / -1", "huge / -2",
654 "mhuge / 100", "mhuge / 200"]:
655 self.assertRaises(OverflowError, eval, overflow, namespace)
656
657 for underflow in ["1 / huge", "2 / huge", "-1 / huge", "-2 / huge",
658 "100 / mhuge", "200 / mhuge"]:
659 result = eval(underflow, namespace)
660 self.assertEqual(result, 0.0,
661 "expected underflow to 0 from %r" % underflow)
662
663 for zero in ["huge / 0", "mhuge / 0"]:
664 self.assertRaises(ZeroDivisionError, eval, zero, namespace)
665
Mark Dickinsoncbb62742009-12-27 15:09:50 +0000666 def check_truediv(self, a, b, skip_small=True):
667 """Verify that the result of a/b is correctly rounded, by
668 comparing it with a pure Python implementation of correctly
669 rounded division. b should be nonzero."""
670
671 # skip check for small a and b: in this case, the current
672 # implementation converts the arguments to float directly and
673 # then applies a float division. This can give doubly-rounded
674 # results on x87-using machines (particularly 32-bit Linux).
675 if skip_small and max(abs(a), abs(b)) < 2**DBL_MANT_DIG:
676 return
677
678 try:
679 # use repr so that we can distinguish between -0.0 and 0.0
680 expected = repr(truediv(a, b))
681 except OverflowError:
682 expected = 'overflow'
683 except ZeroDivisionError:
684 expected = 'zerodivision'
685
686 try:
687 got = repr(a / b)
688 except OverflowError:
689 got = 'overflow'
690 except ZeroDivisionError:
691 got = 'zerodivision'
692
Mark Dickinson2cfda802009-12-27 21:34:05 +0000693 self.assertEqual(expected, got, "Incorrectly rounded division {}/{}: "
694 "expected {}, got {}".format(a, b, expected, got))
Mark Dickinsoncbb62742009-12-27 15:09:50 +0000695
696 @requires_IEEE_754
697 def test_correctly_rounded_true_division(self):
698 # more stringent tests than those above, checking that the
699 # result of true division of ints is always correctly rounded.
700 # This test should probably be considered CPython-specific.
701
702 # Exercise all the code paths not involving Gb-sized ints.
703 # ... divisions involving zero
704 self.check_truediv(123, 0)
705 self.check_truediv(-456, 0)
706 self.check_truediv(0, 3)
707 self.check_truediv(0, -3)
708 self.check_truediv(0, 0)
709 # ... overflow or underflow by large margin
710 self.check_truediv(671 * 12345 * 2**DBL_MAX_EXP, 12345)
711 self.check_truediv(12345, 345678 * 2**(DBL_MANT_DIG - DBL_MIN_EXP))
712 # ... a much larger or smaller than b
713 self.check_truediv(12345*2**100, 98765)
714 self.check_truediv(12345*2**30, 98765*7**81)
715 # ... a / b near a boundary: one of 1, 2**DBL_MANT_DIG, 2**DBL_MIN_EXP,
716 # 2**DBL_MAX_EXP, 2**(DBL_MIN_EXP-DBL_MANT_DIG)
717 bases = (0, DBL_MANT_DIG, DBL_MIN_EXP,
718 DBL_MAX_EXP, DBL_MIN_EXP - DBL_MANT_DIG)
719 for base in bases:
720 for exp in range(base - 15, base + 15):
721 self.check_truediv(75312*2**max(exp, 0), 69187*2**max(-exp, 0))
722 self.check_truediv(69187*2**max(exp, 0), 75312*2**max(-exp, 0))
723
724 # overflow corner case
725 for m in [1, 2, 7, 17, 12345, 7**100,
726 -1, -2, -5, -23, -67891, -41**50]:
727 for n in range(-10, 10):
728 self.check_truediv(m*DBL_MIN_OVERFLOW + n, m)
729 self.check_truediv(m*DBL_MIN_OVERFLOW + n, -m)
730
731 # check detection of inexactness in shifting stage
732 for n in range(250):
733 # (2**DBL_MANT_DIG+1)/(2**DBL_MANT_DIG) lies halfway
734 # between two representable floats, and would usually be
735 # rounded down under round-half-to-even. The tiniest of
736 # additions to the numerator should cause it to be rounded
737 # up instead.
738 self.check_truediv((2**DBL_MANT_DIG + 1)*12345*2**200 + 2**n,
739 2**DBL_MANT_DIG*12345)
740
741 # 1/2731 is one of the smallest division cases that's subject
742 # to double rounding on IEEE 754 machines working internally with
743 # 64-bit precision. On such machines, the next check would fail,
744 # were it not explicitly skipped in check_truediv.
745 self.check_truediv(1, 2731)
746
747 # a particularly bad case for the old algorithm: gives an
748 # error of close to 3.5 ulps.
749 self.check_truediv(295147931372582273023, 295147932265116303360)
750 for i in range(1000):
751 self.check_truediv(10**(i+1), 10**i)
752 self.check_truediv(10**i, 10**(i+1))
753
754 # test round-half-to-even behaviour, normal result
755 for m in [1, 2, 4, 7, 8, 16, 17, 32, 12345, 7**100,
756 -1, -2, -5, -23, -67891, -41**50]:
757 for n in range(-10, 10):
758 self.check_truediv(2**DBL_MANT_DIG*m + n, m)
759
760 # test round-half-to-even, subnormal result
761 for n in range(-20, 20):
762 self.check_truediv(n, 2**1076)
763
764 # largeish random divisions: a/b where |a| <= |b| <=
765 # 2*|a|; |ans| is between 0.5 and 1.0, so error should
766 # always be bounded by 2**-54 with equality possible only
767 # if the least significant bit of q=ans*2**53 is zero.
768 for M in [10**10, 10**100, 10**1000]:
769 for i in range(1000):
770 a = random.randrange(1, M)
771 b = random.randrange(a, 2*a+1)
772 self.check_truediv(a, b)
773 self.check_truediv(-a, b)
774 self.check_truediv(a, -b)
775 self.check_truediv(-a, -b)
776
777 # and some (genuinely) random tests
778 for _ in range(10000):
779 a_bits = random.randrange(1000)
780 b_bits = random.randrange(1, 1000)
781 x = random.randrange(2**a_bits)
782 y = random.randrange(1, 2**b_bits)
783 self.check_truediv(x, y)
784 self.check_truediv(x, -y)
785 self.check_truediv(-x, y)
786 self.check_truediv(-x, -y)
Benjamin Peterson875d4c02008-07-13 17:44:16 +0000787
Facundo Batista6e6f59b2008-07-24 18:57:11 +0000788 def test_small_ints(self):
789 for i in range(-5, 257):
790 self.assertTrue(i is i + 0)
791 self.assertTrue(i is i * 1)
792 self.assertTrue(i is i - 0)
793 self.assertTrue(i is i // 1)
794 self.assertTrue(i is i & -1)
795 self.assertTrue(i is i | 0)
796 self.assertTrue(i is i ^ 0)
797 self.assertTrue(i is ~~i)
798 self.assertTrue(i is i**1)
799 self.assertTrue(i is int(str(i)))
800 self.assertTrue(i is i<<2>>2, str(i))
801 # corner cases
802 i = 1 << 70
803 self.assertTrue(i - i is 0)
804 self.assertTrue(0 * i is 0)
805
Mark Dickinson54bc1ec2008-12-17 16:19:07 +0000806 def test_bit_length(self):
807 tiny = 1e-10
808 for x in range(-65000, 65000):
809 k = x.bit_length()
810 # Check equivalence with Python version
811 self.assertEqual(k, len(bin(x).lstrip('-0b')))
812 # Behaviour as specified in the docs
813 if x != 0:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000814 self.assertTrue(2**(k-1) <= abs(x) < 2**k)
Mark Dickinson54bc1ec2008-12-17 16:19:07 +0000815 else:
816 self.assertEqual(k, 0)
817 # Alternative definition: x.bit_length() == 1 + floor(log_2(x))
818 if x != 0:
819 # When x is an exact power of 2, numeric errors can
820 # cause floor(log(x)/log(2)) to be one too small; for
821 # small x this can be fixed by adding a small quantity
822 # to the quotient before taking the floor.
823 self.assertEqual(k, 1 + math.floor(
824 math.log(abs(x))/math.log(2) + tiny))
825
826 self.assertEqual((0).bit_length(), 0)
827 self.assertEqual((1).bit_length(), 1)
828 self.assertEqual((-1).bit_length(), 1)
829 self.assertEqual((2).bit_length(), 2)
830 self.assertEqual((-2).bit_length(), 2)
831 for i in [2, 3, 15, 16, 17, 31, 32, 33, 63, 64, 234]:
832 a = 2**i
833 self.assertEqual((a-1).bit_length(), i)
834 self.assertEqual((1-a).bit_length(), i)
835 self.assertEqual((a).bit_length(), i+1)
836 self.assertEqual((-a).bit_length(), i+1)
837 self.assertEqual((a+1).bit_length(), i+1)
838 self.assertEqual((-a-1).bit_length(), i+1)
839
Mark Dickinson1124e712009-01-28 21:25:58 +0000840 def test_round(self):
841 # check round-half-even algorithm. For round to nearest ten;
842 # rounding map is invariant under adding multiples of 20
843 test_dict = {0:0, 1:0, 2:0, 3:0, 4:0, 5:0,
844 6:10, 7:10, 8:10, 9:10, 10:10, 11:10, 12:10, 13:10, 14:10,
845 15:20, 16:20, 17:20, 18:20, 19:20}
846 for offset in range(-520, 520, 20):
847 for k, v in test_dict.items():
848 got = round(k+offset, -1)
849 expected = v+offset
850 self.assertEqual(got, expected)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000851 self.assertTrue(type(got) is int)
Mark Dickinson1124e712009-01-28 21:25:58 +0000852
853 # larger second argument
854 self.assertEqual(round(-150, -2), -200)
855 self.assertEqual(round(-149, -2), -100)
856 self.assertEqual(round(-51, -2), -100)
857 self.assertEqual(round(-50, -2), 0)
858 self.assertEqual(round(-49, -2), 0)
859 self.assertEqual(round(-1, -2), 0)
860 self.assertEqual(round(0, -2), 0)
861 self.assertEqual(round(1, -2), 0)
862 self.assertEqual(round(49, -2), 0)
863 self.assertEqual(round(50, -2), 0)
864 self.assertEqual(round(51, -2), 100)
865 self.assertEqual(round(149, -2), 100)
866 self.assertEqual(round(150, -2), 200)
867 self.assertEqual(round(250, -2), 200)
868 self.assertEqual(round(251, -2), 300)
869 self.assertEqual(round(172500, -3), 172000)
870 self.assertEqual(round(173500, -3), 174000)
871 self.assertEqual(round(31415926535, -1), 31415926540)
872 self.assertEqual(round(31415926535, -2), 31415926500)
873 self.assertEqual(round(31415926535, -3), 31415927000)
874 self.assertEqual(round(31415926535, -4), 31415930000)
875 self.assertEqual(round(31415926535, -5), 31415900000)
876 self.assertEqual(round(31415926535, -6), 31416000000)
877 self.assertEqual(round(31415926535, -7), 31420000000)
878 self.assertEqual(round(31415926535, -8), 31400000000)
879 self.assertEqual(round(31415926535, -9), 31000000000)
880 self.assertEqual(round(31415926535, -10), 30000000000)
881 self.assertEqual(round(31415926535, -11), 0)
882 self.assertEqual(round(31415926535, -12), 0)
883 self.assertEqual(round(31415926535, -999), 0)
884
885 # should get correct results even for huge inputs
886 for k in range(10, 100):
887 got = round(10**k + 324678, -3)
888 expect = 10**k + 325000
889 self.assertEqual(got, expect)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000890 self.assertTrue(type(got) is int)
Mark Dickinson1124e712009-01-28 21:25:58 +0000891
892 # nonnegative second argument: round(x, n) should just return x
893 for n in range(5):
894 for i in range(100):
895 x = random.randrange(-10000, 10000)
896 got = round(x, n)
897 self.assertEqual(got, x)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000898 self.assertTrue(type(got) is int)
Mark Dickinson1124e712009-01-28 21:25:58 +0000899 for huge_n in 2**31-1, 2**31, 2**63-1, 2**63, 2**100, 10**100:
900 self.assertEqual(round(8979323, huge_n), 8979323)
901
902 # omitted second argument
903 for i in range(100):
904 x = random.randrange(-10000, 10000)
905 got = round(x)
906 self.assertEqual(got, x)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000907 self.assertTrue(type(got) is int)
Mark Dickinson1124e712009-01-28 21:25:58 +0000908
909 # bad second argument
910 bad_exponents = ('brian', 2.0, 0j, None)
911 for e in bad_exponents:
912 self.assertRaises(TypeError, round, 3, e)
913
Alexandre Vassalottic36c3782010-01-09 20:35:09 +0000914 def test_to_bytes(self):
915 def check(tests, byteorder, signed=False):
916 for test, expected in tests.items():
917 try:
918 self.assertEqual(
919 test.to_bytes(len(expected), byteorder, signed=signed),
920 expected)
921 except Exception as err:
922 raise AssertionError(
923 "failed to convert {0} with byteorder={1} and signed={2}"
924 .format(test, byteorder, signed)) from err
925
926 # Convert integers to signed big-endian byte arrays.
927 tests1 = {
928 0: b'\x00',
929 1: b'\x01',
930 -1: b'\xff',
931 -127: b'\x81',
932 -128: b'\x80',
933 -129: b'\xff\x7f',
934 127: b'\x7f',
935 129: b'\x00\x81',
936 -255: b'\xff\x01',
937 -256: b'\xff\x00',
938 255: b'\x00\xff',
939 256: b'\x01\x00',
940 32767: b'\x7f\xff',
941 -32768: b'\xff\x80\x00',
942 65535: b'\x00\xff\xff',
943 -65536: b'\xff\x00\x00',
944 -8388608: b'\x80\x00\x00'
945 }
946 check(tests1, 'big', signed=True)
947
948 # Convert integers to signed little-endian byte arrays.
949 tests2 = {
950 0: b'\x00',
951 1: b'\x01',
952 -1: b'\xff',
953 -127: b'\x81',
954 -128: b'\x80',
955 -129: b'\x7f\xff',
956 127: b'\x7f',
957 129: b'\x81\x00',
958 -255: b'\x01\xff',
959 -256: b'\x00\xff',
960 255: b'\xff\x00',
961 256: b'\x00\x01',
962 32767: b'\xff\x7f',
963 -32768: b'\x00\x80',
964 65535: b'\xff\xff\x00',
965 -65536: b'\x00\x00\xff',
966 -8388608: b'\x00\x00\x80'
967 }
968 check(tests2, 'little', signed=True)
969
970 # Convert integers to unsigned big-endian byte arrays.
971 tests3 = {
972 0: b'\x00',
973 1: b'\x01',
974 127: b'\x7f',
975 128: b'\x80',
976 255: b'\xff',
977 256: b'\x01\x00',
978 32767: b'\x7f\xff',
979 32768: b'\x80\x00',
980 65535: b'\xff\xff',
981 65536: b'\x01\x00\x00'
982 }
983 check(tests3, 'big', signed=False)
984
985 # Convert integers to unsigned little-endian byte arrays.
986 tests4 = {
987 0: b'\x00',
988 1: b'\x01',
989 127: b'\x7f',
990 128: b'\x80',
991 255: b'\xff',
992 256: b'\x00\x01',
993 32767: b'\xff\x7f',
994 32768: b'\x00\x80',
995 65535: b'\xff\xff',
996 65536: b'\x00\x00\x01'
997 }
998 check(tests4, 'little', signed=False)
999
1000 self.assertRaises(OverflowError, (256).to_bytes, 1, 'big', signed=False)
1001 self.assertRaises(OverflowError, (256).to_bytes, 1, 'big', signed=True)
1002 self.assertRaises(OverflowError, (256).to_bytes, 1, 'little', signed=False)
1003 self.assertRaises(OverflowError, (256).to_bytes, 1, 'little', signed=True)
1004 self.assertRaises(OverflowError, (-1).to_bytes, 2, 'big', signed=False),
1005 self.assertRaises(OverflowError, (-1).to_bytes, 2, 'little', signed=False)
1006 self.assertEqual((0).to_bytes(0, 'big'), b'')
1007 self.assertEqual((1).to_bytes(5, 'big'), b'\x00\x00\x00\x00\x01')
1008 self.assertEqual((0).to_bytes(5, 'big'), b'\x00\x00\x00\x00\x00')
1009 self.assertEqual((-1).to_bytes(5, 'big', signed=True),
1010 b'\xff\xff\xff\xff\xff')
1011 self.assertRaises(OverflowError, (1).to_bytes, 0, 'big')
1012
1013 def test_from_bytes(self):
1014 def check(tests, byteorder, signed=False):
1015 for test, expected in tests.items():
1016 try:
1017 self.assertEqual(
1018 int.from_bytes(test, byteorder, signed=signed),
1019 expected)
1020 except Exception as err:
1021 raise AssertionError(
1022 "failed to convert {0} with byteorder={1!r} and signed={2}"
1023 .format(test, byteorder, signed)) from err
1024
1025 # Convert signed big-endian byte arrays to integers.
1026 tests1 = {
1027 b'': 0,
1028 b'\x00': 0,
1029 b'\x00\x00': 0,
1030 b'\x01': 1,
1031 b'\x00\x01': 1,
1032 b'\xff': -1,
1033 b'\xff\xff': -1,
1034 b'\x81': -127,
1035 b'\x80': -128,
1036 b'\xff\x7f': -129,
1037 b'\x7f': 127,
1038 b'\x00\x81': 129,
1039 b'\xff\x01': -255,
1040 b'\xff\x00': -256,
1041 b'\x00\xff': 255,
1042 b'\x01\x00': 256,
1043 b'\x7f\xff': 32767,
1044 b'\x80\x00': -32768,
1045 b'\x00\xff\xff': 65535,
1046 b'\xff\x00\x00': -65536,
1047 b'\x80\x00\x00': -8388608
1048 }
1049 check(tests1, 'big', signed=True)
1050
1051 # Convert signed little-endian byte arrays to integers.
1052 tests2 = {
1053 b'': 0,
1054 b'\x00': 0,
1055 b'\x00\x00': 0,
1056 b'\x01': 1,
1057 b'\x00\x01': 256,
1058 b'\xff': -1,
1059 b'\xff\xff': -1,
1060 b'\x81': -127,
1061 b'\x80': -128,
1062 b'\x7f\xff': -129,
1063 b'\x7f': 127,
1064 b'\x81\x00': 129,
1065 b'\x01\xff': -255,
1066 b'\x00\xff': -256,
1067 b'\xff\x00': 255,
1068 b'\x00\x01': 256,
1069 b'\xff\x7f': 32767,
1070 b'\x00\x80': -32768,
1071 b'\xff\xff\x00': 65535,
1072 b'\x00\x00\xff': -65536,
1073 b'\x00\x00\x80': -8388608
1074 }
1075 check(tests2, 'little', signed=True)
1076
1077 # Convert unsigned big-endian byte arrays to integers.
1078 tests3 = {
1079 b'': 0,
1080 b'\x00': 0,
1081 b'\x01': 1,
1082 b'\x7f': 127,
1083 b'\x80': 128,
1084 b'\xff': 255,
1085 b'\x01\x00': 256,
1086 b'\x7f\xff': 32767,
1087 b'\x80\x00': 32768,
1088 b'\xff\xff': 65535,
1089 b'\x01\x00\x00': 65536,
1090 }
1091 check(tests3, 'big', signed=False)
1092
1093 # Convert integers to unsigned little-endian byte arrays.
1094 tests4 = {
1095 b'': 0,
1096 b'\x00': 0,
1097 b'\x01': 1,
1098 b'\x7f': 127,
1099 b'\x80': 128,
1100 b'\xff': 255,
1101 b'\x00\x01': 256,
1102 b'\xff\x7f': 32767,
1103 b'\x00\x80': 32768,
1104 b'\xff\xff': 65535,
1105 b'\x00\x00\x01': 65536,
1106 }
1107 check(tests4, 'little', signed=False)
1108
1109 class myint(int):
1110 pass
1111
1112 self.assertTrue(type(myint.from_bytes(b'\x00', 'big')) is myint)
1113 self.assertEqual(myint.from_bytes(b'\x01', 'big'), 1)
1114 self.assertTrue(
1115 type(myint.from_bytes(b'\x00', 'big', signed=False)) is myint)
1116 self.assertEqual(myint.from_bytes(b'\x01', 'big', signed=False), 1)
1117 self.assertTrue(type(myint.from_bytes(b'\x00', 'little')) is myint)
1118 self.assertEqual(myint.from_bytes(b'\x01', 'little'), 1)
1119 self.assertTrue(type(myint.from_bytes(
1120 b'\x00', 'little', signed=False)) is myint)
1121 self.assertEqual(myint.from_bytes(b'\x01', 'little', signed=False), 1)
1122 self.assertEqual(
1123 int.from_bytes([255, 0, 0], 'big', signed=True), -65536)
1124 self.assertEqual(
1125 int.from_bytes((255, 0, 0), 'big', signed=True), -65536)
1126 self.assertEqual(int.from_bytes(
1127 bytearray(b'\xff\x00\x00'), 'big', signed=True), -65536)
1128 self.assertEqual(int.from_bytes(
1129 bytearray(b'\xff\x00\x00'), 'big', signed=True), -65536)
1130 self.assertEqual(int.from_bytes(
1131 array.array('B', b'\xff\x00\x00'), 'big', signed=True), -65536)
1132 self.assertEqual(int.from_bytes(
1133 memoryview(b'\xff\x00\x00'), 'big', signed=True), -65536)
1134 self.assertRaises(ValueError, int.from_bytes, [256], 'big')
1135 self.assertRaises(ValueError, int.from_bytes, [0], 'big\x00')
1136 self.assertRaises(ValueError, int.from_bytes, [0], 'little\x00')
1137 self.assertRaises(TypeError, int.from_bytes, "", 'big')
1138 self.assertRaises(TypeError, int.from_bytes, "\x00", 'big')
1139 self.assertRaises(TypeError, int.from_bytes, 0, 'big')
1140 self.assertRaises(TypeError, int.from_bytes, 0, 'big', True)
1141 self.assertRaises(TypeError, myint.from_bytes, "", 'big')
1142 self.assertRaises(TypeError, myint.from_bytes, "\x00", 'big')
1143 self.assertRaises(TypeError, myint.from_bytes, 0, 'big')
1144 self.assertRaises(TypeError, int.from_bytes, 0, 'big', True)
Mark Dickinson1124e712009-01-28 21:25:58 +00001145
Mark Dickinson54bc1ec2008-12-17 16:19:07 +00001146
Walter Dörwalda0021592005-06-13 21:44:48 +00001147def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001148 support.run_unittest(LongTest)
Tim Peters307fa782004-09-23 08:06:40 +00001149
Walter Dörwalda0021592005-06-13 21:44:48 +00001150if __name__ == "__main__":
1151 test_main()