blob: eea67e6cc32a9fc06ab82961d8551fbf10587144 [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
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000333 def test_conversion(self):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000334
Mark Dickinson5c2db372009-12-05 20:28:34 +0000335 class JustLong:
336 # test that __long__ no longer used in 3.x
337 def __long__(self):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000338 return 42
Mark Dickinson5c2db372009-12-05 20:28:34 +0000339 self.assertRaises(TypeError, int, JustLong())
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000340
Mark Dickinson5c2db372009-12-05 20:28:34 +0000341 class LongTrunc:
342 # __long__ should be ignored in 3.x
343 def __long__(self):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000344 return 42
Mark Dickinson5c2db372009-12-05 20:28:34 +0000345 def __trunc__(self):
346 return 1729
347 self.assertEqual(int(LongTrunc()), 1729)
Tim Peters26c7fa32001-08-23 22:56:21 +0000348
Mark Dickinsonc6300392009-04-20 21:38:00 +0000349 @unittest.skipUnless(float.__getformat__("double").startswith("IEEE"),
350 "test requires IEEE 754 doubles")
351 def test_float_conversion(self):
Mark Dickinsonc6300392009-04-20 21:38:00 +0000352
353 exact_values = [0, 1, 2,
354 2**53-3,
355 2**53-2,
356 2**53-1,
357 2**53,
358 2**53+2,
359 2**54-4,
360 2**54-2,
361 2**54,
362 2**54+4]
363 for x in exact_values:
364 self.assertEqual(float(x), x)
365 self.assertEqual(float(-x), -x)
366
367 # test round-half-even
368 for x, y in [(1, 0), (2, 2), (3, 4), (4, 4), (5, 4), (6, 6), (7, 8)]:
369 for p in range(15):
370 self.assertEqual(int(float(2**p*(2**53+x))), 2**p*(2**53+y))
371
372 for x, y in [(0, 0), (1, 0), (2, 0), (3, 4), (4, 4), (5, 4), (6, 8),
373 (7, 8), (8, 8), (9, 8), (10, 8), (11, 12), (12, 12),
374 (13, 12), (14, 16), (15, 16)]:
375 for p in range(15):
376 self.assertEqual(int(float(2**p*(2**54+x))), 2**p*(2**54+y))
377
378 # behaviour near extremes of floating-point range
379 int_dbl_max = int(DBL_MAX)
380 top_power = 2**DBL_MAX_EXP
381 halfway = (int_dbl_max + top_power)//2
382 self.assertEqual(float(int_dbl_max), DBL_MAX)
383 self.assertEqual(float(int_dbl_max+1), DBL_MAX)
384 self.assertEqual(float(halfway-1), DBL_MAX)
385 self.assertRaises(OverflowError, float, halfway)
386 self.assertEqual(float(1-halfway), -DBL_MAX)
387 self.assertRaises(OverflowError, float, -halfway)
388 self.assertRaises(OverflowError, float, top_power-1)
389 self.assertRaises(OverflowError, float, top_power)
390 self.assertRaises(OverflowError, float, top_power+1)
391 self.assertRaises(OverflowError, float, 2*top_power-1)
392 self.assertRaises(OverflowError, float, 2*top_power)
393 self.assertRaises(OverflowError, float, top_power*top_power)
394
395 for p in range(100):
396 x = 2**p * (2**53 + 1) + 1
397 y = 2**p * (2**53 + 2)
398 self.assertEqual(int(float(x)), y)
399
400 x = 2**p * (2**53 + 1)
401 y = 2**p * 2**53
402 self.assertEqual(int(float(x)), y)
403
Walter Dörwalda0021592005-06-13 21:44:48 +0000404 def test_float_overflow(self):
Walter Dörwalda0021592005-06-13 21:44:48 +0000405 for x in -2.0, -1.0, 0.0, 1.0, 2.0:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000406 self.assertEqual(float(int(x)), x)
Tim Peters9fffa3e2001-09-04 05:14:19 +0000407
Walter Dörwalda0021592005-06-13 21:44:48 +0000408 shuge = '12345' * 120
Guido van Rossume2a383d2007-01-15 16:59:06 +0000409 huge = 1 << 30000
Walter Dörwalda0021592005-06-13 21:44:48 +0000410 mhuge = -huge
411 namespace = {'huge': huge, 'mhuge': mhuge, 'shuge': shuge, 'math': math}
412 for test in ["float(huge)", "float(mhuge)",
413 "complex(huge)", "complex(mhuge)",
414 "complex(huge, 1)", "complex(mhuge, 1)",
415 "complex(1, huge)", "complex(1, mhuge)",
416 "1. + huge", "huge + 1.", "1. + mhuge", "mhuge + 1.",
417 "1. - huge", "huge - 1.", "1. - mhuge", "mhuge - 1.",
418 "1. * huge", "huge * 1.", "1. * mhuge", "mhuge * 1.",
419 "1. // huge", "huge // 1.", "1. // mhuge", "mhuge // 1.",
420 "1. / huge", "huge / 1.", "1. / mhuge", "mhuge / 1.",
421 "1. ** huge", "huge ** 1.", "1. ** mhuge", "mhuge ** 1.",
422 "math.sin(huge)", "math.sin(mhuge)",
423 "math.sqrt(huge)", "math.sqrt(mhuge)", # should do better
Guido van Rossum28bbe422007-08-24 03:46:30 +0000424 # math.floor() of an int returns an int now
425 ##"math.floor(huge)", "math.floor(mhuge)",
426 ]:
Tim Peters9fffa3e2001-09-04 05:14:19 +0000427
Walter Dörwalda0021592005-06-13 21:44:48 +0000428 self.assertRaises(OverflowError, eval, test, namespace)
Tim Peters9fffa3e2001-09-04 05:14:19 +0000429
Mark Dickinson5c2db372009-12-05 20:28:34 +0000430 # XXX Perhaps float(shuge) can raise OverflowError on some box?
431 # The comparison should not.
432 self.assertNotEqual(float(shuge), int(shuge),
433 "float(shuge) should not equal int(shuge)")
Tim Peters83e7ccc2001-09-04 06:37:28 +0000434
Walter Dörwalda0021592005-06-13 21:44:48 +0000435 def test_logs(self):
Walter Dörwalda0021592005-06-13 21:44:48 +0000436 LOG10E = math.log10(math.e)
Tim Peters307fa782004-09-23 08:06:40 +0000437
Guido van Rossum805365e2007-05-07 22:24:25 +0000438 for exp in list(range(10)) + [100, 1000, 10000]:
Walter Dörwalda0021592005-06-13 21:44:48 +0000439 value = 10 ** exp
440 log10 = math.log10(value)
441 self.assertAlmostEqual(log10, exp)
Tim Peters78526162001-09-05 00:53:45 +0000442
Walter Dörwalda0021592005-06-13 21:44:48 +0000443 # log10(value) == exp, so log(value) == log10(value)/log10(e) ==
444 # exp/LOG10E
445 expected = exp / LOG10E
446 log = math.log(value)
447 self.assertAlmostEqual(log, expected)
Tim Peters78526162001-09-05 00:53:45 +0000448
Guido van Rossume2a383d2007-01-15 16:59:06 +0000449 for bad in -(1 << 10000), -2, 0:
Walter Dörwalda0021592005-06-13 21:44:48 +0000450 self.assertRaises(ValueError, math.log, bad)
451 self.assertRaises(ValueError, math.log10, bad)
Tim Peters78526162001-09-05 00:53:45 +0000452
Walter Dörwalda0021592005-06-13 21:44:48 +0000453 def test_mixed_compares(self):
454 eq = self.assertEqual
Tim Peters78526162001-09-05 00:53:45 +0000455
Walter Dörwalda0021592005-06-13 21:44:48 +0000456 # We're mostly concerned with that mixing floats and longs does the
457 # right stuff, even when longs are too large to fit in a float.
458 # The safest way to check the results is to use an entirely different
459 # method, which we do here via a skeletal rational class (which
460 # represents all Python ints, longs and floats exactly).
461 class Rat:
462 def __init__(self, value):
Walter Dörwaldaa97f042007-05-03 21:05:51 +0000463 if isinstance(value, int):
Walter Dörwalda0021592005-06-13 21:44:48 +0000464 self.n = value
465 self.d = 1
466 elif isinstance(value, float):
467 # Convert to exact rational equivalent.
468 f, e = math.frexp(abs(value))
469 assert f == 0 or 0.5 <= f < 1.0
470 # |value| = f * 2**e exactly
Tim Peters78526162001-09-05 00:53:45 +0000471
Walter Dörwalda0021592005-06-13 21:44:48 +0000472 # Suck up CHUNK bits at a time; 28 is enough so that we suck
473 # up all bits in 2 iterations for all known binary double-
474 # precision formats, and small enough to fit in an int.
475 CHUNK = 28
476 top = 0
477 # invariant: |value| = (top + f) * 2**e exactly
478 while f:
479 f = math.ldexp(f, CHUNK)
480 digit = int(f)
481 assert digit >> CHUNK == 0
482 top = (top << CHUNK) | digit
483 f -= digit
484 assert 0.0 <= f < 1.0
485 e -= CHUNK
Tim Peters78526162001-09-05 00:53:45 +0000486
Walter Dörwalda0021592005-06-13 21:44:48 +0000487 # Now |value| = top * 2**e exactly.
488 if e >= 0:
489 n = top << e
490 d = 1
491 else:
492 n = top
493 d = 1 << -e
494 if value < 0:
495 n = -n
496 self.n = n
497 self.d = d
498 assert float(n) / float(d) == value
Tim Peters307fa782004-09-23 08:06:40 +0000499 else:
Georg Brandl89fad142010-03-14 10:23:39 +0000500 raise TypeError("can't deal with %r" % value)
Tim Peters307fa782004-09-23 08:06:40 +0000501
Benjamin Peterson60192082008-10-16 19:34:46 +0000502 def _cmp__(self, other):
Walter Dörwalda0021592005-06-13 21:44:48 +0000503 if not isinstance(other, Rat):
504 other = Rat(other)
Mark Dickinsona56c4672009-01-27 18:17:45 +0000505 x, y = self.n * other.d, self.d * other.n
506 return (x > y) - (x < y)
Benjamin Peterson60192082008-10-16 19:34:46 +0000507 def __eq__(self, other):
508 return self._cmp__(other) == 0
509 def __ne__(self, other):
510 return self._cmp__(other) != 0
511 def __ge__(self, other):
512 return self._cmp__(other) >= 0
513 def __gt__(self, other):
514 return self._cmp__(other) > 0
515 def __le__(self, other):
516 return self._cmp__(other) <= 0
517 def __lt__(self, other):
518 return self._cmp__(other) < 0
Tim Peters307fa782004-09-23 08:06:40 +0000519
Walter Dörwalda0021592005-06-13 21:44:48 +0000520 cases = [0, 0.001, 0.99, 1.0, 1.5, 1e20, 1e200]
521 # 2**48 is an important boundary in the internals. 2**53 is an
522 # important boundary for IEEE double precision.
523 for t in 2.0**48, 2.0**50, 2.0**53:
524 cases.extend([t - 1.0, t - 0.3, t, t + 0.3, t + 1.0,
Guido van Rossume2a383d2007-01-15 16:59:06 +0000525 int(t-1), int(t), int(t+1)])
Christian Heimesa37d4c62007-12-04 23:02:19 +0000526 cases.extend([0, 1, 2, sys.maxsize, float(sys.maxsize)])
Mark Dickinson5c2db372009-12-05 20:28:34 +0000527 # 1 << 20000 should exceed all double formats. int(1e200) is to
Walter Dörwalda0021592005-06-13 21:44:48 +0000528 # check that we get equality with 1e200 above.
Guido van Rossume2a383d2007-01-15 16:59:06 +0000529 t = int(1e200)
530 cases.extend([0, 1, 2, 1 << 20000, t-1, t, t+1])
Walter Dörwalda0021592005-06-13 21:44:48 +0000531 cases.extend([-x for x in cases])
532 for x in cases:
533 Rx = Rat(x)
534 for y in cases:
535 Ry = Rat(y)
Mark Dickinsona56c4672009-01-27 18:17:45 +0000536 Rcmp = (Rx > Ry) - (Rx < Ry)
537 xycmp = (x > y) - (x < y)
Walter Dörwalda0021592005-06-13 21:44:48 +0000538 eq(Rcmp, xycmp, Frm("%r %r %d %d", x, y, Rcmp, xycmp))
539 eq(x == y, Rcmp == 0, Frm("%r == %r %d", x, y, Rcmp))
540 eq(x != y, Rcmp != 0, Frm("%r != %r %d", x, y, Rcmp))
541 eq(x < y, Rcmp < 0, Frm("%r < %r %d", x, y, Rcmp))
542 eq(x <= y, Rcmp <= 0, Frm("%r <= %r %d", x, y, Rcmp))
543 eq(x > y, Rcmp > 0, Frm("%r > %r %d", x, y, Rcmp))
544 eq(x >= y, Rcmp >= 0, Frm("%r >= %r %d", x, y, Rcmp))
Tim Peters307fa782004-09-23 08:06:40 +0000545
Eric Smith0dd1b632008-02-11 17:55:01 +0000546 def test__format__(self):
Eric Smith8c663262007-08-25 02:26:07 +0000547 self.assertEqual(format(123456789, 'd'), '123456789')
548 self.assertEqual(format(123456789, 'd'), '123456789')
549
Eric Smith185e30c2007-08-30 22:23:08 +0000550 # sign and aligning are interdependent
551 self.assertEqual(format(1, "-"), '1')
552 self.assertEqual(format(-1, "-"), '-1')
553 self.assertEqual(format(1, "-3"), ' 1')
554 self.assertEqual(format(-1, "-3"), ' -1')
555 self.assertEqual(format(1, "+3"), ' +1')
556 self.assertEqual(format(-1, "+3"), ' -1')
557 self.assertEqual(format(1, " 3"), ' 1')
558 self.assertEqual(format(-1, " 3"), ' -1')
559 self.assertEqual(format(1, " "), ' 1')
560 self.assertEqual(format(-1, " "), '-1')
561
Eric Smith8c663262007-08-25 02:26:07 +0000562 # hex
563 self.assertEqual(format(3, "x"), "3")
564 self.assertEqual(format(3, "X"), "3")
565 self.assertEqual(format(1234, "x"), "4d2")
566 self.assertEqual(format(-1234, "x"), "-4d2")
567 self.assertEqual(format(1234, "8x"), " 4d2")
Eric Smith185e30c2007-08-30 22:23:08 +0000568 self.assertEqual(format(-1234, "8x"), " -4d2")
Eric Smith8c663262007-08-25 02:26:07 +0000569 self.assertEqual(format(1234, "x"), "4d2")
570 self.assertEqual(format(-1234, "x"), "-4d2")
571 self.assertEqual(format(-3, "x"), "-3")
572 self.assertEqual(format(-3, "X"), "-3")
573 self.assertEqual(format(int('be', 16), "x"), "be")
574 self.assertEqual(format(int('be', 16), "X"), "BE")
575 self.assertEqual(format(-int('be', 16), "x"), "-be")
576 self.assertEqual(format(-int('be', 16), "X"), "-BE")
577
578 # octal
579 self.assertEqual(format(3, "b"), "11")
580 self.assertEqual(format(-3, "b"), "-11")
581 self.assertEqual(format(1234, "b"), "10011010010")
582 self.assertEqual(format(-1234, "b"), "-10011010010")
583 self.assertEqual(format(1234, "-b"), "10011010010")
584 self.assertEqual(format(-1234, "-b"), "-10011010010")
585 self.assertEqual(format(1234, " b"), " 10011010010")
586 self.assertEqual(format(-1234, " b"), "-10011010010")
587 self.assertEqual(format(1234, "+b"), "+10011010010")
588 self.assertEqual(format(-1234, "+b"), "-10011010010")
589
Eric Smith8c663262007-08-25 02:26:07 +0000590 # make sure these are errors
591 self.assertRaises(ValueError, format, 3, "1.3") # precision disallowed
Eric Smith8c663262007-08-25 02:26:07 +0000592 self.assertRaises(ValueError, format, 3, "+c") # sign not allowed
593 # with 'c'
Eric Smithfa767ef2008-01-28 10:59:27 +0000594
595 # ensure that only int and float type specifiers work
Eric Smith7b69c6c2008-01-27 21:07:59 +0000596 for format_spec in ([chr(x) for x in range(ord('a'), ord('z')+1)] +
597 [chr(x) for x in range(ord('A'), ord('Z')+1)]):
Eric Smithfa767ef2008-01-28 10:59:27 +0000598 if not format_spec in 'bcdoxXeEfFgGn%':
Eric Smith7b69c6c2008-01-27 21:07:59 +0000599 self.assertRaises(ValueError, format, 0, format_spec)
600 self.assertRaises(ValueError, format, 1, format_spec)
601 self.assertRaises(ValueError, format, -1, format_spec)
602 self.assertRaises(ValueError, format, 2**100, format_spec)
603 self.assertRaises(ValueError, format, -(2**100), format_spec)
604
Eric Smithfa767ef2008-01-28 10:59:27 +0000605 # ensure that float type specifiers work; format converts
606 # the int to a float
Eric Smith5807c412008-05-11 21:00:57 +0000607 for format_spec in 'eEfFgG%':
Eric Smithfa767ef2008-01-28 10:59:27 +0000608 for value in [0, 1, -1, 100, -100, 1234567890, -1234567890]:
609 self.assertEqual(format(value, format_spec),
610 format(float(value), format_spec))
Eric Smith8c663262007-08-25 02:26:07 +0000611
Christian Heimesa34706f2008-01-04 03:06:10 +0000612 def test_nan_inf(self):
Christian Heimes1aa7b302008-01-04 03:22:53 +0000613 self.assertRaises(OverflowError, int, float('inf'))
Georg Brandl6aa2d1f2008-08-12 08:35:52 +0000614 self.assertRaises(OverflowError, int, float('-inf'))
615 self.assertRaises(ValueError, int, float('nan'))
Christian Heimesa34706f2008-01-04 03:06:10 +0000616
Benjamin Peterson875d4c02008-07-13 17:44:16 +0000617 def test_true_division(self):
618 huge = 1 << 40000
619 mhuge = -huge
620 self.assertEqual(huge / huge, 1.0)
621 self.assertEqual(mhuge / mhuge, 1.0)
622 self.assertEqual(huge / mhuge, -1.0)
623 self.assertEqual(mhuge / huge, -1.0)
624 self.assertEqual(1 / huge, 0.0)
625 self.assertEqual(1 / huge, 0.0)
626 self.assertEqual(1 / mhuge, 0.0)
627 self.assertEqual(1 / mhuge, 0.0)
628 self.assertEqual((666 * huge + (huge >> 1)) / huge, 666.5)
629 self.assertEqual((666 * mhuge + (mhuge >> 1)) / mhuge, 666.5)
630 self.assertEqual((666 * huge + (huge >> 1)) / mhuge, -666.5)
631 self.assertEqual((666 * mhuge + (mhuge >> 1)) / huge, -666.5)
632 self.assertEqual(huge / (huge << 1), 0.5)
633 self.assertEqual((1000000 * huge) / huge, 1000000)
634
635 namespace = {'huge': huge, 'mhuge': mhuge}
636
637 for overflow in ["float(huge)", "float(mhuge)",
638 "huge / 1", "huge / 2", "huge / -1", "huge / -2",
639 "mhuge / 100", "mhuge / 200"]:
640 self.assertRaises(OverflowError, eval, overflow, namespace)
641
642 for underflow in ["1 / huge", "2 / huge", "-1 / huge", "-2 / huge",
643 "100 / mhuge", "200 / mhuge"]:
644 result = eval(underflow, namespace)
645 self.assertEqual(result, 0.0,
646 "expected underflow to 0 from %r" % underflow)
647
648 for zero in ["huge / 0", "mhuge / 0"]:
649 self.assertRaises(ZeroDivisionError, eval, zero, namespace)
650
Mark Dickinsoncbb62742009-12-27 15:09:50 +0000651 def check_truediv(self, a, b, skip_small=True):
652 """Verify that the result of a/b is correctly rounded, by
653 comparing it with a pure Python implementation of correctly
654 rounded division. b should be nonzero."""
655
656 # skip check for small a and b: in this case, the current
657 # implementation converts the arguments to float directly and
658 # then applies a float division. This can give doubly-rounded
659 # results on x87-using machines (particularly 32-bit Linux).
660 if skip_small and max(abs(a), abs(b)) < 2**DBL_MANT_DIG:
661 return
662
663 try:
664 # use repr so that we can distinguish between -0.0 and 0.0
665 expected = repr(truediv(a, b))
666 except OverflowError:
667 expected = 'overflow'
668 except ZeroDivisionError:
669 expected = 'zerodivision'
670
671 try:
672 got = repr(a / b)
673 except OverflowError:
674 got = 'overflow'
675 except ZeroDivisionError:
676 got = 'zerodivision'
677
Mark Dickinson2cfda802009-12-27 21:34:05 +0000678 self.assertEqual(expected, got, "Incorrectly rounded division {}/{}: "
679 "expected {}, got {}".format(a, b, expected, got))
Mark Dickinsoncbb62742009-12-27 15:09:50 +0000680
681 @requires_IEEE_754
682 def test_correctly_rounded_true_division(self):
683 # more stringent tests than those above, checking that the
684 # result of true division of ints is always correctly rounded.
685 # This test should probably be considered CPython-specific.
686
687 # Exercise all the code paths not involving Gb-sized ints.
688 # ... divisions involving zero
689 self.check_truediv(123, 0)
690 self.check_truediv(-456, 0)
691 self.check_truediv(0, 3)
692 self.check_truediv(0, -3)
693 self.check_truediv(0, 0)
694 # ... overflow or underflow by large margin
695 self.check_truediv(671 * 12345 * 2**DBL_MAX_EXP, 12345)
696 self.check_truediv(12345, 345678 * 2**(DBL_MANT_DIG - DBL_MIN_EXP))
697 # ... a much larger or smaller than b
698 self.check_truediv(12345*2**100, 98765)
699 self.check_truediv(12345*2**30, 98765*7**81)
700 # ... a / b near a boundary: one of 1, 2**DBL_MANT_DIG, 2**DBL_MIN_EXP,
701 # 2**DBL_MAX_EXP, 2**(DBL_MIN_EXP-DBL_MANT_DIG)
702 bases = (0, DBL_MANT_DIG, DBL_MIN_EXP,
703 DBL_MAX_EXP, DBL_MIN_EXP - DBL_MANT_DIG)
704 for base in bases:
705 for exp in range(base - 15, base + 15):
706 self.check_truediv(75312*2**max(exp, 0), 69187*2**max(-exp, 0))
707 self.check_truediv(69187*2**max(exp, 0), 75312*2**max(-exp, 0))
708
709 # overflow corner case
710 for m in [1, 2, 7, 17, 12345, 7**100,
711 -1, -2, -5, -23, -67891, -41**50]:
712 for n in range(-10, 10):
713 self.check_truediv(m*DBL_MIN_OVERFLOW + n, m)
714 self.check_truediv(m*DBL_MIN_OVERFLOW + n, -m)
715
716 # check detection of inexactness in shifting stage
717 for n in range(250):
718 # (2**DBL_MANT_DIG+1)/(2**DBL_MANT_DIG) lies halfway
719 # between two representable floats, and would usually be
720 # rounded down under round-half-to-even. The tiniest of
721 # additions to the numerator should cause it to be rounded
722 # up instead.
723 self.check_truediv((2**DBL_MANT_DIG + 1)*12345*2**200 + 2**n,
724 2**DBL_MANT_DIG*12345)
725
726 # 1/2731 is one of the smallest division cases that's subject
727 # to double rounding on IEEE 754 machines working internally with
728 # 64-bit precision. On such machines, the next check would fail,
729 # were it not explicitly skipped in check_truediv.
730 self.check_truediv(1, 2731)
731
732 # a particularly bad case for the old algorithm: gives an
733 # error of close to 3.5 ulps.
734 self.check_truediv(295147931372582273023, 295147932265116303360)
735 for i in range(1000):
736 self.check_truediv(10**(i+1), 10**i)
737 self.check_truediv(10**i, 10**(i+1))
738
739 # test round-half-to-even behaviour, normal result
740 for m in [1, 2, 4, 7, 8, 16, 17, 32, 12345, 7**100,
741 -1, -2, -5, -23, -67891, -41**50]:
742 for n in range(-10, 10):
743 self.check_truediv(2**DBL_MANT_DIG*m + n, m)
744
745 # test round-half-to-even, subnormal result
746 for n in range(-20, 20):
747 self.check_truediv(n, 2**1076)
748
749 # largeish random divisions: a/b where |a| <= |b| <=
750 # 2*|a|; |ans| is between 0.5 and 1.0, so error should
751 # always be bounded by 2**-54 with equality possible only
752 # if the least significant bit of q=ans*2**53 is zero.
753 for M in [10**10, 10**100, 10**1000]:
754 for i in range(1000):
755 a = random.randrange(1, M)
756 b = random.randrange(a, 2*a+1)
757 self.check_truediv(a, b)
758 self.check_truediv(-a, b)
759 self.check_truediv(a, -b)
760 self.check_truediv(-a, -b)
761
762 # and some (genuinely) random tests
763 for _ in range(10000):
764 a_bits = random.randrange(1000)
765 b_bits = random.randrange(1, 1000)
766 x = random.randrange(2**a_bits)
767 y = random.randrange(1, 2**b_bits)
768 self.check_truediv(x, y)
769 self.check_truediv(x, -y)
770 self.check_truediv(-x, y)
771 self.check_truediv(-x, -y)
Benjamin Peterson875d4c02008-07-13 17:44:16 +0000772
Facundo Batista6e6f59b2008-07-24 18:57:11 +0000773 def test_small_ints(self):
774 for i in range(-5, 257):
775 self.assertTrue(i is i + 0)
776 self.assertTrue(i is i * 1)
777 self.assertTrue(i is i - 0)
778 self.assertTrue(i is i // 1)
779 self.assertTrue(i is i & -1)
780 self.assertTrue(i is i | 0)
781 self.assertTrue(i is i ^ 0)
782 self.assertTrue(i is ~~i)
783 self.assertTrue(i is i**1)
784 self.assertTrue(i is int(str(i)))
785 self.assertTrue(i is i<<2>>2, str(i))
786 # corner cases
787 i = 1 << 70
788 self.assertTrue(i - i is 0)
789 self.assertTrue(0 * i is 0)
790
Mark Dickinson54bc1ec2008-12-17 16:19:07 +0000791 def test_bit_length(self):
792 tiny = 1e-10
793 for x in range(-65000, 65000):
794 k = x.bit_length()
795 # Check equivalence with Python version
796 self.assertEqual(k, len(bin(x).lstrip('-0b')))
797 # Behaviour as specified in the docs
798 if x != 0:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000799 self.assertTrue(2**(k-1) <= abs(x) < 2**k)
Mark Dickinson54bc1ec2008-12-17 16:19:07 +0000800 else:
801 self.assertEqual(k, 0)
802 # Alternative definition: x.bit_length() == 1 + floor(log_2(x))
803 if x != 0:
804 # When x is an exact power of 2, numeric errors can
805 # cause floor(log(x)/log(2)) to be one too small; for
806 # small x this can be fixed by adding a small quantity
807 # to the quotient before taking the floor.
808 self.assertEqual(k, 1 + math.floor(
809 math.log(abs(x))/math.log(2) + tiny))
810
811 self.assertEqual((0).bit_length(), 0)
812 self.assertEqual((1).bit_length(), 1)
813 self.assertEqual((-1).bit_length(), 1)
814 self.assertEqual((2).bit_length(), 2)
815 self.assertEqual((-2).bit_length(), 2)
816 for i in [2, 3, 15, 16, 17, 31, 32, 33, 63, 64, 234]:
817 a = 2**i
818 self.assertEqual((a-1).bit_length(), i)
819 self.assertEqual((1-a).bit_length(), i)
820 self.assertEqual((a).bit_length(), i+1)
821 self.assertEqual((-a).bit_length(), i+1)
822 self.assertEqual((a+1).bit_length(), i+1)
823 self.assertEqual((-a-1).bit_length(), i+1)
824
Mark Dickinson1124e712009-01-28 21:25:58 +0000825 def test_round(self):
826 # check round-half-even algorithm. For round to nearest ten;
827 # rounding map is invariant under adding multiples of 20
828 test_dict = {0:0, 1:0, 2:0, 3:0, 4:0, 5:0,
829 6:10, 7:10, 8:10, 9:10, 10:10, 11:10, 12:10, 13:10, 14:10,
830 15:20, 16:20, 17:20, 18:20, 19:20}
831 for offset in range(-520, 520, 20):
832 for k, v in test_dict.items():
833 got = round(k+offset, -1)
834 expected = v+offset
835 self.assertEqual(got, expected)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000836 self.assertTrue(type(got) is int)
Mark Dickinson1124e712009-01-28 21:25:58 +0000837
838 # larger second argument
839 self.assertEqual(round(-150, -2), -200)
840 self.assertEqual(round(-149, -2), -100)
841 self.assertEqual(round(-51, -2), -100)
842 self.assertEqual(round(-50, -2), 0)
843 self.assertEqual(round(-49, -2), 0)
844 self.assertEqual(round(-1, -2), 0)
845 self.assertEqual(round(0, -2), 0)
846 self.assertEqual(round(1, -2), 0)
847 self.assertEqual(round(49, -2), 0)
848 self.assertEqual(round(50, -2), 0)
849 self.assertEqual(round(51, -2), 100)
850 self.assertEqual(round(149, -2), 100)
851 self.assertEqual(round(150, -2), 200)
852 self.assertEqual(round(250, -2), 200)
853 self.assertEqual(round(251, -2), 300)
854 self.assertEqual(round(172500, -3), 172000)
855 self.assertEqual(round(173500, -3), 174000)
856 self.assertEqual(round(31415926535, -1), 31415926540)
857 self.assertEqual(round(31415926535, -2), 31415926500)
858 self.assertEqual(round(31415926535, -3), 31415927000)
859 self.assertEqual(round(31415926535, -4), 31415930000)
860 self.assertEqual(round(31415926535, -5), 31415900000)
861 self.assertEqual(round(31415926535, -6), 31416000000)
862 self.assertEqual(round(31415926535, -7), 31420000000)
863 self.assertEqual(round(31415926535, -8), 31400000000)
864 self.assertEqual(round(31415926535, -9), 31000000000)
865 self.assertEqual(round(31415926535, -10), 30000000000)
866 self.assertEqual(round(31415926535, -11), 0)
867 self.assertEqual(round(31415926535, -12), 0)
868 self.assertEqual(round(31415926535, -999), 0)
869
870 # should get correct results even for huge inputs
871 for k in range(10, 100):
872 got = round(10**k + 324678, -3)
873 expect = 10**k + 325000
874 self.assertEqual(got, expect)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000875 self.assertTrue(type(got) is int)
Mark Dickinson1124e712009-01-28 21:25:58 +0000876
877 # nonnegative second argument: round(x, n) should just return x
878 for n in range(5):
879 for i in range(100):
880 x = random.randrange(-10000, 10000)
881 got = round(x, n)
882 self.assertEqual(got, x)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000883 self.assertTrue(type(got) is int)
Mark Dickinson1124e712009-01-28 21:25:58 +0000884 for huge_n in 2**31-1, 2**31, 2**63-1, 2**63, 2**100, 10**100:
885 self.assertEqual(round(8979323, huge_n), 8979323)
886
887 # omitted second argument
888 for i in range(100):
889 x = random.randrange(-10000, 10000)
890 got = round(x)
891 self.assertEqual(got, x)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000892 self.assertTrue(type(got) is int)
Mark Dickinson1124e712009-01-28 21:25:58 +0000893
894 # bad second argument
895 bad_exponents = ('brian', 2.0, 0j, None)
896 for e in bad_exponents:
897 self.assertRaises(TypeError, round, 3, e)
898
Alexandre Vassalottic36c3782010-01-09 20:35:09 +0000899 def test_to_bytes(self):
900 def check(tests, byteorder, signed=False):
901 for test, expected in tests.items():
902 try:
903 self.assertEqual(
904 test.to_bytes(len(expected), byteorder, signed=signed),
905 expected)
906 except Exception as err:
907 raise AssertionError(
908 "failed to convert {0} with byteorder={1} and signed={2}"
909 .format(test, byteorder, signed)) from err
910
911 # Convert integers to signed big-endian byte arrays.
912 tests1 = {
913 0: b'\x00',
914 1: b'\x01',
915 -1: b'\xff',
916 -127: b'\x81',
917 -128: b'\x80',
918 -129: b'\xff\x7f',
919 127: b'\x7f',
920 129: b'\x00\x81',
921 -255: b'\xff\x01',
922 -256: b'\xff\x00',
923 255: b'\x00\xff',
924 256: b'\x01\x00',
925 32767: b'\x7f\xff',
926 -32768: b'\xff\x80\x00',
927 65535: b'\x00\xff\xff',
928 -65536: b'\xff\x00\x00',
929 -8388608: b'\x80\x00\x00'
930 }
931 check(tests1, 'big', signed=True)
932
933 # Convert integers to signed little-endian byte arrays.
934 tests2 = {
935 0: b'\x00',
936 1: b'\x01',
937 -1: b'\xff',
938 -127: b'\x81',
939 -128: b'\x80',
940 -129: b'\x7f\xff',
941 127: b'\x7f',
942 129: b'\x81\x00',
943 -255: b'\x01\xff',
944 -256: b'\x00\xff',
945 255: b'\xff\x00',
946 256: b'\x00\x01',
947 32767: b'\xff\x7f',
948 -32768: b'\x00\x80',
949 65535: b'\xff\xff\x00',
950 -65536: b'\x00\x00\xff',
951 -8388608: b'\x00\x00\x80'
952 }
953 check(tests2, 'little', signed=True)
954
955 # Convert integers to unsigned big-endian byte arrays.
956 tests3 = {
957 0: b'\x00',
958 1: b'\x01',
959 127: b'\x7f',
960 128: b'\x80',
961 255: b'\xff',
962 256: b'\x01\x00',
963 32767: b'\x7f\xff',
964 32768: b'\x80\x00',
965 65535: b'\xff\xff',
966 65536: b'\x01\x00\x00'
967 }
968 check(tests3, 'big', signed=False)
969
970 # Convert integers to unsigned little-endian byte arrays.
971 tests4 = {
972 0: b'\x00',
973 1: b'\x01',
974 127: b'\x7f',
975 128: b'\x80',
976 255: b'\xff',
977 256: b'\x00\x01',
978 32767: b'\xff\x7f',
979 32768: b'\x00\x80',
980 65535: b'\xff\xff',
981 65536: b'\x00\x00\x01'
982 }
983 check(tests4, 'little', signed=False)
984
985 self.assertRaises(OverflowError, (256).to_bytes, 1, 'big', signed=False)
986 self.assertRaises(OverflowError, (256).to_bytes, 1, 'big', signed=True)
987 self.assertRaises(OverflowError, (256).to_bytes, 1, 'little', signed=False)
988 self.assertRaises(OverflowError, (256).to_bytes, 1, 'little', signed=True)
989 self.assertRaises(OverflowError, (-1).to_bytes, 2, 'big', signed=False),
990 self.assertRaises(OverflowError, (-1).to_bytes, 2, 'little', signed=False)
991 self.assertEqual((0).to_bytes(0, 'big'), b'')
992 self.assertEqual((1).to_bytes(5, 'big'), b'\x00\x00\x00\x00\x01')
993 self.assertEqual((0).to_bytes(5, 'big'), b'\x00\x00\x00\x00\x00')
994 self.assertEqual((-1).to_bytes(5, 'big', signed=True),
995 b'\xff\xff\xff\xff\xff')
996 self.assertRaises(OverflowError, (1).to_bytes, 0, 'big')
997
998 def test_from_bytes(self):
999 def check(tests, byteorder, signed=False):
1000 for test, expected in tests.items():
1001 try:
1002 self.assertEqual(
1003 int.from_bytes(test, byteorder, signed=signed),
1004 expected)
1005 except Exception as err:
1006 raise AssertionError(
1007 "failed to convert {0} with byteorder={1!r} and signed={2}"
1008 .format(test, byteorder, signed)) from err
1009
1010 # Convert signed big-endian byte arrays to integers.
1011 tests1 = {
1012 b'': 0,
1013 b'\x00': 0,
1014 b'\x00\x00': 0,
1015 b'\x01': 1,
1016 b'\x00\x01': 1,
1017 b'\xff': -1,
1018 b'\xff\xff': -1,
1019 b'\x81': -127,
1020 b'\x80': -128,
1021 b'\xff\x7f': -129,
1022 b'\x7f': 127,
1023 b'\x00\x81': 129,
1024 b'\xff\x01': -255,
1025 b'\xff\x00': -256,
1026 b'\x00\xff': 255,
1027 b'\x01\x00': 256,
1028 b'\x7f\xff': 32767,
1029 b'\x80\x00': -32768,
1030 b'\x00\xff\xff': 65535,
1031 b'\xff\x00\x00': -65536,
1032 b'\x80\x00\x00': -8388608
1033 }
1034 check(tests1, 'big', signed=True)
1035
1036 # Convert signed little-endian byte arrays to integers.
1037 tests2 = {
1038 b'': 0,
1039 b'\x00': 0,
1040 b'\x00\x00': 0,
1041 b'\x01': 1,
1042 b'\x00\x01': 256,
1043 b'\xff': -1,
1044 b'\xff\xff': -1,
1045 b'\x81': -127,
1046 b'\x80': -128,
1047 b'\x7f\xff': -129,
1048 b'\x7f': 127,
1049 b'\x81\x00': 129,
1050 b'\x01\xff': -255,
1051 b'\x00\xff': -256,
1052 b'\xff\x00': 255,
1053 b'\x00\x01': 256,
1054 b'\xff\x7f': 32767,
1055 b'\x00\x80': -32768,
1056 b'\xff\xff\x00': 65535,
1057 b'\x00\x00\xff': -65536,
1058 b'\x00\x00\x80': -8388608
1059 }
1060 check(tests2, 'little', signed=True)
1061
1062 # Convert unsigned big-endian byte arrays to integers.
1063 tests3 = {
1064 b'': 0,
1065 b'\x00': 0,
1066 b'\x01': 1,
1067 b'\x7f': 127,
1068 b'\x80': 128,
1069 b'\xff': 255,
1070 b'\x01\x00': 256,
1071 b'\x7f\xff': 32767,
1072 b'\x80\x00': 32768,
1073 b'\xff\xff': 65535,
1074 b'\x01\x00\x00': 65536,
1075 }
1076 check(tests3, 'big', signed=False)
1077
1078 # Convert integers to unsigned little-endian byte arrays.
1079 tests4 = {
1080 b'': 0,
1081 b'\x00': 0,
1082 b'\x01': 1,
1083 b'\x7f': 127,
1084 b'\x80': 128,
1085 b'\xff': 255,
1086 b'\x00\x01': 256,
1087 b'\xff\x7f': 32767,
1088 b'\x00\x80': 32768,
1089 b'\xff\xff': 65535,
1090 b'\x00\x00\x01': 65536,
1091 }
1092 check(tests4, 'little', signed=False)
1093
1094 class myint(int):
1095 pass
1096
1097 self.assertTrue(type(myint.from_bytes(b'\x00', 'big')) is myint)
1098 self.assertEqual(myint.from_bytes(b'\x01', 'big'), 1)
1099 self.assertTrue(
1100 type(myint.from_bytes(b'\x00', 'big', signed=False)) is myint)
1101 self.assertEqual(myint.from_bytes(b'\x01', 'big', signed=False), 1)
1102 self.assertTrue(type(myint.from_bytes(b'\x00', 'little')) is myint)
1103 self.assertEqual(myint.from_bytes(b'\x01', 'little'), 1)
1104 self.assertTrue(type(myint.from_bytes(
1105 b'\x00', 'little', signed=False)) is myint)
1106 self.assertEqual(myint.from_bytes(b'\x01', 'little', signed=False), 1)
1107 self.assertEqual(
1108 int.from_bytes([255, 0, 0], 'big', signed=True), -65536)
1109 self.assertEqual(
1110 int.from_bytes((255, 0, 0), 'big', signed=True), -65536)
1111 self.assertEqual(int.from_bytes(
1112 bytearray(b'\xff\x00\x00'), 'big', signed=True), -65536)
1113 self.assertEqual(int.from_bytes(
1114 bytearray(b'\xff\x00\x00'), 'big', signed=True), -65536)
1115 self.assertEqual(int.from_bytes(
1116 array.array('B', b'\xff\x00\x00'), 'big', signed=True), -65536)
1117 self.assertEqual(int.from_bytes(
1118 memoryview(b'\xff\x00\x00'), 'big', signed=True), -65536)
1119 self.assertRaises(ValueError, int.from_bytes, [256], 'big')
1120 self.assertRaises(ValueError, int.from_bytes, [0], 'big\x00')
1121 self.assertRaises(ValueError, int.from_bytes, [0], 'little\x00')
1122 self.assertRaises(TypeError, int.from_bytes, "", 'big')
1123 self.assertRaises(TypeError, int.from_bytes, "\x00", 'big')
1124 self.assertRaises(TypeError, int.from_bytes, 0, 'big')
1125 self.assertRaises(TypeError, int.from_bytes, 0, 'big', True)
1126 self.assertRaises(TypeError, myint.from_bytes, "", 'big')
1127 self.assertRaises(TypeError, myint.from_bytes, "\x00", 'big')
1128 self.assertRaises(TypeError, myint.from_bytes, 0, 'big')
1129 self.assertRaises(TypeError, int.from_bytes, 0, 'big', True)
Mark Dickinson1124e712009-01-28 21:25:58 +00001130
Mark Dickinson54bc1ec2008-12-17 16:19:07 +00001131
Walter Dörwalda0021592005-06-13 21:44:48 +00001132def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001133 support.run_unittest(LongTest)
Tim Peters307fa782004-09-23 08:06:40 +00001134
Walter Dörwalda0021592005-06-13 21:44:48 +00001135if __name__ == "__main__":
1136 test_main()