blob: 3c6b2159a0c559742ce88ce9ac0b0d687b77262e [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):
405 import math
Tim Peters9fffa3e2001-09-04 05:14:19 +0000406
Walter Dörwalda0021592005-06-13 21:44:48 +0000407 for x in -2.0, -1.0, 0.0, 1.0, 2.0:
Guido van Rossume2a383d2007-01-15 16:59:06 +0000408 self.assertEqual(float(int(x)), x)
Tim Peters9fffa3e2001-09-04 05:14:19 +0000409
Walter Dörwalda0021592005-06-13 21:44:48 +0000410 shuge = '12345' * 120
Guido van Rossume2a383d2007-01-15 16:59:06 +0000411 huge = 1 << 30000
Walter Dörwalda0021592005-06-13 21:44:48 +0000412 mhuge = -huge
413 namespace = {'huge': huge, 'mhuge': mhuge, 'shuge': shuge, 'math': math}
414 for test in ["float(huge)", "float(mhuge)",
415 "complex(huge)", "complex(mhuge)",
416 "complex(huge, 1)", "complex(mhuge, 1)",
417 "complex(1, huge)", "complex(1, mhuge)",
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 "1. / huge", "huge / 1.", "1. / mhuge", "mhuge / 1.",
423 "1. ** huge", "huge ** 1.", "1. ** mhuge", "mhuge ** 1.",
424 "math.sin(huge)", "math.sin(mhuge)",
425 "math.sqrt(huge)", "math.sqrt(mhuge)", # should do better
Guido van Rossum28bbe422007-08-24 03:46:30 +0000426 # math.floor() of an int returns an int now
427 ##"math.floor(huge)", "math.floor(mhuge)",
428 ]:
Tim Peters9fffa3e2001-09-04 05:14:19 +0000429
Walter Dörwalda0021592005-06-13 21:44:48 +0000430 self.assertRaises(OverflowError, eval, test, namespace)
Tim Peters9fffa3e2001-09-04 05:14:19 +0000431
Mark Dickinson5c2db372009-12-05 20:28:34 +0000432 # XXX Perhaps float(shuge) can raise OverflowError on some box?
433 # The comparison should not.
434 self.assertNotEqual(float(shuge), int(shuge),
435 "float(shuge) should not equal int(shuge)")
Tim Peters83e7ccc2001-09-04 06:37:28 +0000436
Walter Dörwalda0021592005-06-13 21:44:48 +0000437 def test_logs(self):
438 import math
Tim Peters78526162001-09-05 00:53:45 +0000439
Walter Dörwalda0021592005-06-13 21:44:48 +0000440 LOG10E = math.log10(math.e)
Tim Peters307fa782004-09-23 08:06:40 +0000441
Guido van Rossum805365e2007-05-07 22:24:25 +0000442 for exp in list(range(10)) + [100, 1000, 10000]:
Walter Dörwalda0021592005-06-13 21:44:48 +0000443 value = 10 ** exp
444 log10 = math.log10(value)
445 self.assertAlmostEqual(log10, exp)
Tim Peters78526162001-09-05 00:53:45 +0000446
Walter Dörwalda0021592005-06-13 21:44:48 +0000447 # log10(value) == exp, so log(value) == log10(value)/log10(e) ==
448 # exp/LOG10E
449 expected = exp / LOG10E
450 log = math.log(value)
451 self.assertAlmostEqual(log, expected)
Tim Peters78526162001-09-05 00:53:45 +0000452
Guido van Rossume2a383d2007-01-15 16:59:06 +0000453 for bad in -(1 << 10000), -2, 0:
Walter Dörwalda0021592005-06-13 21:44:48 +0000454 self.assertRaises(ValueError, math.log, bad)
455 self.assertRaises(ValueError, math.log10, bad)
Tim Peters78526162001-09-05 00:53:45 +0000456
Walter Dörwalda0021592005-06-13 21:44:48 +0000457 def test_mixed_compares(self):
458 eq = self.assertEqual
459 import math
Tim Peters78526162001-09-05 00:53:45 +0000460
Walter Dörwalda0021592005-06-13 21:44:48 +0000461 # We're mostly concerned with that mixing floats and longs does the
462 # right stuff, even when longs are too large to fit in a float.
463 # The safest way to check the results is to use an entirely different
464 # method, which we do here via a skeletal rational class (which
465 # represents all Python ints, longs and floats exactly).
466 class Rat:
467 def __init__(self, value):
Walter Dörwaldaa97f042007-05-03 21:05:51 +0000468 if isinstance(value, int):
Walter Dörwalda0021592005-06-13 21:44:48 +0000469 self.n = value
470 self.d = 1
471 elif isinstance(value, float):
472 # Convert to exact rational equivalent.
473 f, e = math.frexp(abs(value))
474 assert f == 0 or 0.5 <= f < 1.0
475 # |value| = f * 2**e exactly
Tim Peters78526162001-09-05 00:53:45 +0000476
Walter Dörwalda0021592005-06-13 21:44:48 +0000477 # Suck up CHUNK bits at a time; 28 is enough so that we suck
478 # up all bits in 2 iterations for all known binary double-
479 # precision formats, and small enough to fit in an int.
480 CHUNK = 28
481 top = 0
482 # invariant: |value| = (top + f) * 2**e exactly
483 while f:
484 f = math.ldexp(f, CHUNK)
485 digit = int(f)
486 assert digit >> CHUNK == 0
487 top = (top << CHUNK) | digit
488 f -= digit
489 assert 0.0 <= f < 1.0
490 e -= CHUNK
Tim Peters78526162001-09-05 00:53:45 +0000491
Walter Dörwalda0021592005-06-13 21:44:48 +0000492 # Now |value| = top * 2**e exactly.
493 if e >= 0:
494 n = top << e
495 d = 1
496 else:
497 n = top
498 d = 1 << -e
499 if value < 0:
500 n = -n
501 self.n = n
502 self.d = d
503 assert float(n) / float(d) == value
Tim Peters307fa782004-09-23 08:06:40 +0000504 else:
Georg Brandl89fad142010-03-14 10:23:39 +0000505 raise TypeError("can't deal with %r" % value)
Tim Peters307fa782004-09-23 08:06:40 +0000506
Benjamin Peterson60192082008-10-16 19:34:46 +0000507 def _cmp__(self, other):
Walter Dörwalda0021592005-06-13 21:44:48 +0000508 if not isinstance(other, Rat):
509 other = Rat(other)
Mark Dickinsona56c4672009-01-27 18:17:45 +0000510 x, y = self.n * other.d, self.d * other.n
511 return (x > y) - (x < y)
Benjamin Peterson60192082008-10-16 19:34:46 +0000512 def __eq__(self, other):
513 return self._cmp__(other) == 0
514 def __ne__(self, other):
515 return self._cmp__(other) != 0
516 def __ge__(self, other):
517 return self._cmp__(other) >= 0
518 def __gt__(self, other):
519 return self._cmp__(other) > 0
520 def __le__(self, other):
521 return self._cmp__(other) <= 0
522 def __lt__(self, other):
523 return self._cmp__(other) < 0
Tim Peters307fa782004-09-23 08:06:40 +0000524
Walter Dörwalda0021592005-06-13 21:44:48 +0000525 cases = [0, 0.001, 0.99, 1.0, 1.5, 1e20, 1e200]
526 # 2**48 is an important boundary in the internals. 2**53 is an
527 # important boundary for IEEE double precision.
528 for t in 2.0**48, 2.0**50, 2.0**53:
529 cases.extend([t - 1.0, t - 0.3, t, t + 0.3, t + 1.0,
Guido van Rossume2a383d2007-01-15 16:59:06 +0000530 int(t-1), int(t), int(t+1)])
Christian Heimesa37d4c62007-12-04 23:02:19 +0000531 cases.extend([0, 1, 2, sys.maxsize, float(sys.maxsize)])
Mark Dickinson5c2db372009-12-05 20:28:34 +0000532 # 1 << 20000 should exceed all double formats. int(1e200) is to
Walter Dörwalda0021592005-06-13 21:44:48 +0000533 # check that we get equality with 1e200 above.
Guido van Rossume2a383d2007-01-15 16:59:06 +0000534 t = int(1e200)
535 cases.extend([0, 1, 2, 1 << 20000, t-1, t, t+1])
Walter Dörwalda0021592005-06-13 21:44:48 +0000536 cases.extend([-x for x in cases])
537 for x in cases:
538 Rx = Rat(x)
539 for y in cases:
540 Ry = Rat(y)
Mark Dickinsona56c4672009-01-27 18:17:45 +0000541 Rcmp = (Rx > Ry) - (Rx < Ry)
542 xycmp = (x > y) - (x < y)
Walter Dörwalda0021592005-06-13 21:44:48 +0000543 eq(Rcmp, xycmp, Frm("%r %r %d %d", x, y, Rcmp, xycmp))
544 eq(x == y, Rcmp == 0, Frm("%r == %r %d", x, y, Rcmp))
545 eq(x != y, Rcmp != 0, Frm("%r != %r %d", x, y, Rcmp))
546 eq(x < y, Rcmp < 0, Frm("%r < %r %d", x, y, Rcmp))
547 eq(x <= y, Rcmp <= 0, Frm("%r <= %r %d", x, y, Rcmp))
548 eq(x > y, Rcmp > 0, Frm("%r > %r %d", x, y, Rcmp))
549 eq(x >= y, Rcmp >= 0, Frm("%r >= %r %d", x, y, Rcmp))
Tim Peters307fa782004-09-23 08:06:40 +0000550
Eric Smith0dd1b632008-02-11 17:55:01 +0000551 def test__format__(self):
Eric Smith8c663262007-08-25 02:26:07 +0000552 self.assertEqual(format(123456789, 'd'), '123456789')
553 self.assertEqual(format(123456789, 'd'), '123456789')
554
Eric Smith185e30c2007-08-30 22:23:08 +0000555 # sign and aligning are interdependent
556 self.assertEqual(format(1, "-"), '1')
557 self.assertEqual(format(-1, "-"), '-1')
558 self.assertEqual(format(1, "-3"), ' 1')
559 self.assertEqual(format(-1, "-3"), ' -1')
560 self.assertEqual(format(1, "+3"), ' +1')
561 self.assertEqual(format(-1, "+3"), ' -1')
562 self.assertEqual(format(1, " 3"), ' 1')
563 self.assertEqual(format(-1, " 3"), ' -1')
564 self.assertEqual(format(1, " "), ' 1')
565 self.assertEqual(format(-1, " "), '-1')
566
Eric Smith8c663262007-08-25 02:26:07 +0000567 # hex
568 self.assertEqual(format(3, "x"), "3")
569 self.assertEqual(format(3, "X"), "3")
570 self.assertEqual(format(1234, "x"), "4d2")
571 self.assertEqual(format(-1234, "x"), "-4d2")
572 self.assertEqual(format(1234, "8x"), " 4d2")
Eric Smith185e30c2007-08-30 22:23:08 +0000573 self.assertEqual(format(-1234, "8x"), " -4d2")
Eric Smith8c663262007-08-25 02:26:07 +0000574 self.assertEqual(format(1234, "x"), "4d2")
575 self.assertEqual(format(-1234, "x"), "-4d2")
576 self.assertEqual(format(-3, "x"), "-3")
577 self.assertEqual(format(-3, "X"), "-3")
578 self.assertEqual(format(int('be', 16), "x"), "be")
579 self.assertEqual(format(int('be', 16), "X"), "BE")
580 self.assertEqual(format(-int('be', 16), "x"), "-be")
581 self.assertEqual(format(-int('be', 16), "X"), "-BE")
582
583 # octal
584 self.assertEqual(format(3, "b"), "11")
585 self.assertEqual(format(-3, "b"), "-11")
586 self.assertEqual(format(1234, "b"), "10011010010")
587 self.assertEqual(format(-1234, "b"), "-10011010010")
588 self.assertEqual(format(1234, "-b"), "10011010010")
589 self.assertEqual(format(-1234, "-b"), "-10011010010")
590 self.assertEqual(format(1234, " b"), " 10011010010")
591 self.assertEqual(format(-1234, " b"), "-10011010010")
592 self.assertEqual(format(1234, "+b"), "+10011010010")
593 self.assertEqual(format(-1234, "+b"), "-10011010010")
594
Eric Smith8c663262007-08-25 02:26:07 +0000595 # make sure these are errors
596 self.assertRaises(ValueError, format, 3, "1.3") # precision disallowed
Eric Smith8c663262007-08-25 02:26:07 +0000597 self.assertRaises(ValueError, format, 3, "+c") # sign not allowed
598 # with 'c'
Eric Smithfa767ef2008-01-28 10:59:27 +0000599
600 # ensure that only int and float type specifiers work
Eric Smith7b69c6c2008-01-27 21:07:59 +0000601 for format_spec in ([chr(x) for x in range(ord('a'), ord('z')+1)] +
602 [chr(x) for x in range(ord('A'), ord('Z')+1)]):
Eric Smithfa767ef2008-01-28 10:59:27 +0000603 if not format_spec in 'bcdoxXeEfFgGn%':
Eric Smith7b69c6c2008-01-27 21:07:59 +0000604 self.assertRaises(ValueError, format, 0, format_spec)
605 self.assertRaises(ValueError, format, 1, format_spec)
606 self.assertRaises(ValueError, format, -1, format_spec)
607 self.assertRaises(ValueError, format, 2**100, format_spec)
608 self.assertRaises(ValueError, format, -(2**100), format_spec)
609
Eric Smithfa767ef2008-01-28 10:59:27 +0000610 # ensure that float type specifiers work; format converts
611 # the int to a float
Eric Smith5807c412008-05-11 21:00:57 +0000612 for format_spec in 'eEfFgG%':
Eric Smithfa767ef2008-01-28 10:59:27 +0000613 for value in [0, 1, -1, 100, -100, 1234567890, -1234567890]:
614 self.assertEqual(format(value, format_spec),
615 format(float(value), format_spec))
Eric Smith8c663262007-08-25 02:26:07 +0000616
Christian Heimesa34706f2008-01-04 03:06:10 +0000617 def test_nan_inf(self):
Christian Heimes1aa7b302008-01-04 03:22:53 +0000618 self.assertRaises(OverflowError, int, float('inf'))
Georg Brandl6aa2d1f2008-08-12 08:35:52 +0000619 self.assertRaises(OverflowError, int, float('-inf'))
620 self.assertRaises(ValueError, int, float('nan'))
Christian Heimesa34706f2008-01-04 03:06:10 +0000621
Benjamin Peterson875d4c02008-07-13 17:44:16 +0000622 def test_true_division(self):
623 huge = 1 << 40000
624 mhuge = -huge
625 self.assertEqual(huge / huge, 1.0)
626 self.assertEqual(mhuge / mhuge, 1.0)
627 self.assertEqual(huge / mhuge, -1.0)
628 self.assertEqual(mhuge / huge, -1.0)
629 self.assertEqual(1 / huge, 0.0)
630 self.assertEqual(1 / huge, 0.0)
631 self.assertEqual(1 / mhuge, 0.0)
632 self.assertEqual(1 / mhuge, 0.0)
633 self.assertEqual((666 * huge + (huge >> 1)) / huge, 666.5)
634 self.assertEqual((666 * mhuge + (mhuge >> 1)) / mhuge, 666.5)
635 self.assertEqual((666 * huge + (huge >> 1)) / mhuge, -666.5)
636 self.assertEqual((666 * mhuge + (mhuge >> 1)) / huge, -666.5)
637 self.assertEqual(huge / (huge << 1), 0.5)
638 self.assertEqual((1000000 * huge) / huge, 1000000)
639
640 namespace = {'huge': huge, 'mhuge': mhuge}
641
642 for overflow in ["float(huge)", "float(mhuge)",
643 "huge / 1", "huge / 2", "huge / -1", "huge / -2",
644 "mhuge / 100", "mhuge / 200"]:
645 self.assertRaises(OverflowError, eval, overflow, namespace)
646
647 for underflow in ["1 / huge", "2 / huge", "-1 / huge", "-2 / huge",
648 "100 / mhuge", "200 / mhuge"]:
649 result = eval(underflow, namespace)
650 self.assertEqual(result, 0.0,
651 "expected underflow to 0 from %r" % underflow)
652
653 for zero in ["huge / 0", "mhuge / 0"]:
654 self.assertRaises(ZeroDivisionError, eval, zero, namespace)
655
Mark Dickinsoncbb62742009-12-27 15:09:50 +0000656 def check_truediv(self, a, b, skip_small=True):
657 """Verify that the result of a/b is correctly rounded, by
658 comparing it with a pure Python implementation of correctly
659 rounded division. b should be nonzero."""
660
661 # skip check for small a and b: in this case, the current
662 # implementation converts the arguments to float directly and
663 # then applies a float division. This can give doubly-rounded
664 # results on x87-using machines (particularly 32-bit Linux).
665 if skip_small and max(abs(a), abs(b)) < 2**DBL_MANT_DIG:
666 return
667
668 try:
669 # use repr so that we can distinguish between -0.0 and 0.0
670 expected = repr(truediv(a, b))
671 except OverflowError:
672 expected = 'overflow'
673 except ZeroDivisionError:
674 expected = 'zerodivision'
675
676 try:
677 got = repr(a / b)
678 except OverflowError:
679 got = 'overflow'
680 except ZeroDivisionError:
681 got = 'zerodivision'
682
Mark Dickinson2cfda802009-12-27 21:34:05 +0000683 self.assertEqual(expected, got, "Incorrectly rounded division {}/{}: "
684 "expected {}, got {}".format(a, b, expected, got))
Mark Dickinsoncbb62742009-12-27 15:09:50 +0000685
686 @requires_IEEE_754
687 def test_correctly_rounded_true_division(self):
688 # more stringent tests than those above, checking that the
689 # result of true division of ints is always correctly rounded.
690 # This test should probably be considered CPython-specific.
691
692 # Exercise all the code paths not involving Gb-sized ints.
693 # ... divisions involving zero
694 self.check_truediv(123, 0)
695 self.check_truediv(-456, 0)
696 self.check_truediv(0, 3)
697 self.check_truediv(0, -3)
698 self.check_truediv(0, 0)
699 # ... overflow or underflow by large margin
700 self.check_truediv(671 * 12345 * 2**DBL_MAX_EXP, 12345)
701 self.check_truediv(12345, 345678 * 2**(DBL_MANT_DIG - DBL_MIN_EXP))
702 # ... a much larger or smaller than b
703 self.check_truediv(12345*2**100, 98765)
704 self.check_truediv(12345*2**30, 98765*7**81)
705 # ... a / b near a boundary: one of 1, 2**DBL_MANT_DIG, 2**DBL_MIN_EXP,
706 # 2**DBL_MAX_EXP, 2**(DBL_MIN_EXP-DBL_MANT_DIG)
707 bases = (0, DBL_MANT_DIG, DBL_MIN_EXP,
708 DBL_MAX_EXP, DBL_MIN_EXP - DBL_MANT_DIG)
709 for base in bases:
710 for exp in range(base - 15, base + 15):
711 self.check_truediv(75312*2**max(exp, 0), 69187*2**max(-exp, 0))
712 self.check_truediv(69187*2**max(exp, 0), 75312*2**max(-exp, 0))
713
714 # overflow corner case
715 for m in [1, 2, 7, 17, 12345, 7**100,
716 -1, -2, -5, -23, -67891, -41**50]:
717 for n in range(-10, 10):
718 self.check_truediv(m*DBL_MIN_OVERFLOW + n, m)
719 self.check_truediv(m*DBL_MIN_OVERFLOW + n, -m)
720
721 # check detection of inexactness in shifting stage
722 for n in range(250):
723 # (2**DBL_MANT_DIG+1)/(2**DBL_MANT_DIG) lies halfway
724 # between two representable floats, and would usually be
725 # rounded down under round-half-to-even. The tiniest of
726 # additions to the numerator should cause it to be rounded
727 # up instead.
728 self.check_truediv((2**DBL_MANT_DIG + 1)*12345*2**200 + 2**n,
729 2**DBL_MANT_DIG*12345)
730
731 # 1/2731 is one of the smallest division cases that's subject
732 # to double rounding on IEEE 754 machines working internally with
733 # 64-bit precision. On such machines, the next check would fail,
734 # were it not explicitly skipped in check_truediv.
735 self.check_truediv(1, 2731)
736
737 # a particularly bad case for the old algorithm: gives an
738 # error of close to 3.5 ulps.
739 self.check_truediv(295147931372582273023, 295147932265116303360)
740 for i in range(1000):
741 self.check_truediv(10**(i+1), 10**i)
742 self.check_truediv(10**i, 10**(i+1))
743
744 # test round-half-to-even behaviour, normal result
745 for m in [1, 2, 4, 7, 8, 16, 17, 32, 12345, 7**100,
746 -1, -2, -5, -23, -67891, -41**50]:
747 for n in range(-10, 10):
748 self.check_truediv(2**DBL_MANT_DIG*m + n, m)
749
750 # test round-half-to-even, subnormal result
751 for n in range(-20, 20):
752 self.check_truediv(n, 2**1076)
753
754 # largeish random divisions: a/b where |a| <= |b| <=
755 # 2*|a|; |ans| is between 0.5 and 1.0, so error should
756 # always be bounded by 2**-54 with equality possible only
757 # if the least significant bit of q=ans*2**53 is zero.
758 for M in [10**10, 10**100, 10**1000]:
759 for i in range(1000):
760 a = random.randrange(1, M)
761 b = random.randrange(a, 2*a+1)
762 self.check_truediv(a, b)
763 self.check_truediv(-a, b)
764 self.check_truediv(a, -b)
765 self.check_truediv(-a, -b)
766
767 # and some (genuinely) random tests
768 for _ in range(10000):
769 a_bits = random.randrange(1000)
770 b_bits = random.randrange(1, 1000)
771 x = random.randrange(2**a_bits)
772 y = random.randrange(1, 2**b_bits)
773 self.check_truediv(x, y)
774 self.check_truediv(x, -y)
775 self.check_truediv(-x, y)
776 self.check_truediv(-x, -y)
Benjamin Peterson875d4c02008-07-13 17:44:16 +0000777
Facundo Batista6e6f59b2008-07-24 18:57:11 +0000778 def test_small_ints(self):
779 for i in range(-5, 257):
780 self.assertTrue(i is i + 0)
781 self.assertTrue(i is i * 1)
782 self.assertTrue(i is i - 0)
783 self.assertTrue(i is i // 1)
784 self.assertTrue(i is i & -1)
785 self.assertTrue(i is i | 0)
786 self.assertTrue(i is i ^ 0)
787 self.assertTrue(i is ~~i)
788 self.assertTrue(i is i**1)
789 self.assertTrue(i is int(str(i)))
790 self.assertTrue(i is i<<2>>2, str(i))
791 # corner cases
792 i = 1 << 70
793 self.assertTrue(i - i is 0)
794 self.assertTrue(0 * i is 0)
795
Mark Dickinson54bc1ec2008-12-17 16:19:07 +0000796 def test_bit_length(self):
797 tiny = 1e-10
798 for x in range(-65000, 65000):
799 k = x.bit_length()
800 # Check equivalence with Python version
801 self.assertEqual(k, len(bin(x).lstrip('-0b')))
802 # Behaviour as specified in the docs
803 if x != 0:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000804 self.assertTrue(2**(k-1) <= abs(x) < 2**k)
Mark Dickinson54bc1ec2008-12-17 16:19:07 +0000805 else:
806 self.assertEqual(k, 0)
807 # Alternative definition: x.bit_length() == 1 + floor(log_2(x))
808 if x != 0:
809 # When x is an exact power of 2, numeric errors can
810 # cause floor(log(x)/log(2)) to be one too small; for
811 # small x this can be fixed by adding a small quantity
812 # to the quotient before taking the floor.
813 self.assertEqual(k, 1 + math.floor(
814 math.log(abs(x))/math.log(2) + tiny))
815
816 self.assertEqual((0).bit_length(), 0)
817 self.assertEqual((1).bit_length(), 1)
818 self.assertEqual((-1).bit_length(), 1)
819 self.assertEqual((2).bit_length(), 2)
820 self.assertEqual((-2).bit_length(), 2)
821 for i in [2, 3, 15, 16, 17, 31, 32, 33, 63, 64, 234]:
822 a = 2**i
823 self.assertEqual((a-1).bit_length(), i)
824 self.assertEqual((1-a).bit_length(), i)
825 self.assertEqual((a).bit_length(), i+1)
826 self.assertEqual((-a).bit_length(), i+1)
827 self.assertEqual((a+1).bit_length(), i+1)
828 self.assertEqual((-a-1).bit_length(), i+1)
829
Mark Dickinson1124e712009-01-28 21:25:58 +0000830 def test_round(self):
831 # check round-half-even algorithm. For round to nearest ten;
832 # rounding map is invariant under adding multiples of 20
833 test_dict = {0:0, 1:0, 2:0, 3:0, 4:0, 5:0,
834 6:10, 7:10, 8:10, 9:10, 10:10, 11:10, 12:10, 13:10, 14:10,
835 15:20, 16:20, 17:20, 18:20, 19:20}
836 for offset in range(-520, 520, 20):
837 for k, v in test_dict.items():
838 got = round(k+offset, -1)
839 expected = v+offset
840 self.assertEqual(got, expected)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000841 self.assertTrue(type(got) is int)
Mark Dickinson1124e712009-01-28 21:25:58 +0000842
843 # larger second argument
844 self.assertEqual(round(-150, -2), -200)
845 self.assertEqual(round(-149, -2), -100)
846 self.assertEqual(round(-51, -2), -100)
847 self.assertEqual(round(-50, -2), 0)
848 self.assertEqual(round(-49, -2), 0)
849 self.assertEqual(round(-1, -2), 0)
850 self.assertEqual(round(0, -2), 0)
851 self.assertEqual(round(1, -2), 0)
852 self.assertEqual(round(49, -2), 0)
853 self.assertEqual(round(50, -2), 0)
854 self.assertEqual(round(51, -2), 100)
855 self.assertEqual(round(149, -2), 100)
856 self.assertEqual(round(150, -2), 200)
857 self.assertEqual(round(250, -2), 200)
858 self.assertEqual(round(251, -2), 300)
859 self.assertEqual(round(172500, -3), 172000)
860 self.assertEqual(round(173500, -3), 174000)
861 self.assertEqual(round(31415926535, -1), 31415926540)
862 self.assertEqual(round(31415926535, -2), 31415926500)
863 self.assertEqual(round(31415926535, -3), 31415927000)
864 self.assertEqual(round(31415926535, -4), 31415930000)
865 self.assertEqual(round(31415926535, -5), 31415900000)
866 self.assertEqual(round(31415926535, -6), 31416000000)
867 self.assertEqual(round(31415926535, -7), 31420000000)
868 self.assertEqual(round(31415926535, -8), 31400000000)
869 self.assertEqual(round(31415926535, -9), 31000000000)
870 self.assertEqual(round(31415926535, -10), 30000000000)
871 self.assertEqual(round(31415926535, -11), 0)
872 self.assertEqual(round(31415926535, -12), 0)
873 self.assertEqual(round(31415926535, -999), 0)
874
875 # should get correct results even for huge inputs
876 for k in range(10, 100):
877 got = round(10**k + 324678, -3)
878 expect = 10**k + 325000
879 self.assertEqual(got, expect)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000880 self.assertTrue(type(got) is int)
Mark Dickinson1124e712009-01-28 21:25:58 +0000881
882 # nonnegative second argument: round(x, n) should just return x
883 for n in range(5):
884 for i in range(100):
885 x = random.randrange(-10000, 10000)
886 got = round(x, n)
887 self.assertEqual(got, x)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000888 self.assertTrue(type(got) is int)
Mark Dickinson1124e712009-01-28 21:25:58 +0000889 for huge_n in 2**31-1, 2**31, 2**63-1, 2**63, 2**100, 10**100:
890 self.assertEqual(round(8979323, huge_n), 8979323)
891
892 # omitted second argument
893 for i in range(100):
894 x = random.randrange(-10000, 10000)
895 got = round(x)
896 self.assertEqual(got, x)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000897 self.assertTrue(type(got) is int)
Mark Dickinson1124e712009-01-28 21:25:58 +0000898
899 # bad second argument
900 bad_exponents = ('brian', 2.0, 0j, None)
901 for e in bad_exponents:
902 self.assertRaises(TypeError, round, 3, e)
903
Alexandre Vassalottic36c3782010-01-09 20:35:09 +0000904 def test_to_bytes(self):
905 def check(tests, byteorder, signed=False):
906 for test, expected in tests.items():
907 try:
908 self.assertEqual(
909 test.to_bytes(len(expected), byteorder, signed=signed),
910 expected)
911 except Exception as err:
912 raise AssertionError(
913 "failed to convert {0} with byteorder={1} and signed={2}"
914 .format(test, byteorder, signed)) from err
915
916 # Convert integers to signed big-endian byte arrays.
917 tests1 = {
918 0: b'\x00',
919 1: b'\x01',
920 -1: b'\xff',
921 -127: b'\x81',
922 -128: b'\x80',
923 -129: b'\xff\x7f',
924 127: b'\x7f',
925 129: b'\x00\x81',
926 -255: b'\xff\x01',
927 -256: b'\xff\x00',
928 255: b'\x00\xff',
929 256: b'\x01\x00',
930 32767: b'\x7f\xff',
931 -32768: b'\xff\x80\x00',
932 65535: b'\x00\xff\xff',
933 -65536: b'\xff\x00\x00',
934 -8388608: b'\x80\x00\x00'
935 }
936 check(tests1, 'big', signed=True)
937
938 # Convert integers to signed little-endian byte arrays.
939 tests2 = {
940 0: b'\x00',
941 1: b'\x01',
942 -1: b'\xff',
943 -127: b'\x81',
944 -128: b'\x80',
945 -129: b'\x7f\xff',
946 127: b'\x7f',
947 129: b'\x81\x00',
948 -255: b'\x01\xff',
949 -256: b'\x00\xff',
950 255: b'\xff\x00',
951 256: b'\x00\x01',
952 32767: b'\xff\x7f',
953 -32768: b'\x00\x80',
954 65535: b'\xff\xff\x00',
955 -65536: b'\x00\x00\xff',
956 -8388608: b'\x00\x00\x80'
957 }
958 check(tests2, 'little', signed=True)
959
960 # Convert integers to unsigned big-endian byte arrays.
961 tests3 = {
962 0: b'\x00',
963 1: b'\x01',
964 127: b'\x7f',
965 128: b'\x80',
966 255: b'\xff',
967 256: b'\x01\x00',
968 32767: b'\x7f\xff',
969 32768: b'\x80\x00',
970 65535: b'\xff\xff',
971 65536: b'\x01\x00\x00'
972 }
973 check(tests3, 'big', signed=False)
974
975 # Convert integers to unsigned little-endian byte arrays.
976 tests4 = {
977 0: b'\x00',
978 1: b'\x01',
979 127: b'\x7f',
980 128: b'\x80',
981 255: b'\xff',
982 256: b'\x00\x01',
983 32767: b'\xff\x7f',
984 32768: b'\x00\x80',
985 65535: b'\xff\xff',
986 65536: b'\x00\x00\x01'
987 }
988 check(tests4, 'little', signed=False)
989
990 self.assertRaises(OverflowError, (256).to_bytes, 1, 'big', signed=False)
991 self.assertRaises(OverflowError, (256).to_bytes, 1, 'big', signed=True)
992 self.assertRaises(OverflowError, (256).to_bytes, 1, 'little', signed=False)
993 self.assertRaises(OverflowError, (256).to_bytes, 1, 'little', signed=True)
994 self.assertRaises(OverflowError, (-1).to_bytes, 2, 'big', signed=False),
995 self.assertRaises(OverflowError, (-1).to_bytes, 2, 'little', signed=False)
996 self.assertEqual((0).to_bytes(0, 'big'), b'')
997 self.assertEqual((1).to_bytes(5, 'big'), b'\x00\x00\x00\x00\x01')
998 self.assertEqual((0).to_bytes(5, 'big'), b'\x00\x00\x00\x00\x00')
999 self.assertEqual((-1).to_bytes(5, 'big', signed=True),
1000 b'\xff\xff\xff\xff\xff')
1001 self.assertRaises(OverflowError, (1).to_bytes, 0, 'big')
1002
1003 def test_from_bytes(self):
1004 def check(tests, byteorder, signed=False):
1005 for test, expected in tests.items():
1006 try:
1007 self.assertEqual(
1008 int.from_bytes(test, byteorder, signed=signed),
1009 expected)
1010 except Exception as err:
1011 raise AssertionError(
1012 "failed to convert {0} with byteorder={1!r} and signed={2}"
1013 .format(test, byteorder, signed)) from err
1014
1015 # Convert signed big-endian byte arrays to integers.
1016 tests1 = {
1017 b'': 0,
1018 b'\x00': 0,
1019 b'\x00\x00': 0,
1020 b'\x01': 1,
1021 b'\x00\x01': 1,
1022 b'\xff': -1,
1023 b'\xff\xff': -1,
1024 b'\x81': -127,
1025 b'\x80': -128,
1026 b'\xff\x7f': -129,
1027 b'\x7f': 127,
1028 b'\x00\x81': 129,
1029 b'\xff\x01': -255,
1030 b'\xff\x00': -256,
1031 b'\x00\xff': 255,
1032 b'\x01\x00': 256,
1033 b'\x7f\xff': 32767,
1034 b'\x80\x00': -32768,
1035 b'\x00\xff\xff': 65535,
1036 b'\xff\x00\x00': -65536,
1037 b'\x80\x00\x00': -8388608
1038 }
1039 check(tests1, 'big', signed=True)
1040
1041 # Convert signed little-endian byte arrays to integers.
1042 tests2 = {
1043 b'': 0,
1044 b'\x00': 0,
1045 b'\x00\x00': 0,
1046 b'\x01': 1,
1047 b'\x00\x01': 256,
1048 b'\xff': -1,
1049 b'\xff\xff': -1,
1050 b'\x81': -127,
1051 b'\x80': -128,
1052 b'\x7f\xff': -129,
1053 b'\x7f': 127,
1054 b'\x81\x00': 129,
1055 b'\x01\xff': -255,
1056 b'\x00\xff': -256,
1057 b'\xff\x00': 255,
1058 b'\x00\x01': 256,
1059 b'\xff\x7f': 32767,
1060 b'\x00\x80': -32768,
1061 b'\xff\xff\x00': 65535,
1062 b'\x00\x00\xff': -65536,
1063 b'\x00\x00\x80': -8388608
1064 }
1065 check(tests2, 'little', signed=True)
1066
1067 # Convert unsigned big-endian byte arrays to integers.
1068 tests3 = {
1069 b'': 0,
1070 b'\x00': 0,
1071 b'\x01': 1,
1072 b'\x7f': 127,
1073 b'\x80': 128,
1074 b'\xff': 255,
1075 b'\x01\x00': 256,
1076 b'\x7f\xff': 32767,
1077 b'\x80\x00': 32768,
1078 b'\xff\xff': 65535,
1079 b'\x01\x00\x00': 65536,
1080 }
1081 check(tests3, 'big', signed=False)
1082
1083 # Convert integers to unsigned little-endian byte arrays.
1084 tests4 = {
1085 b'': 0,
1086 b'\x00': 0,
1087 b'\x01': 1,
1088 b'\x7f': 127,
1089 b'\x80': 128,
1090 b'\xff': 255,
1091 b'\x00\x01': 256,
1092 b'\xff\x7f': 32767,
1093 b'\x00\x80': 32768,
1094 b'\xff\xff': 65535,
1095 b'\x00\x00\x01': 65536,
1096 }
1097 check(tests4, 'little', signed=False)
1098
1099 class myint(int):
1100 pass
1101
1102 self.assertTrue(type(myint.from_bytes(b'\x00', 'big')) is myint)
1103 self.assertEqual(myint.from_bytes(b'\x01', 'big'), 1)
1104 self.assertTrue(
1105 type(myint.from_bytes(b'\x00', 'big', signed=False)) is myint)
1106 self.assertEqual(myint.from_bytes(b'\x01', 'big', signed=False), 1)
1107 self.assertTrue(type(myint.from_bytes(b'\x00', 'little')) is myint)
1108 self.assertEqual(myint.from_bytes(b'\x01', 'little'), 1)
1109 self.assertTrue(type(myint.from_bytes(
1110 b'\x00', 'little', signed=False)) is myint)
1111 self.assertEqual(myint.from_bytes(b'\x01', 'little', signed=False), 1)
1112 self.assertEqual(
1113 int.from_bytes([255, 0, 0], 'big', signed=True), -65536)
1114 self.assertEqual(
1115 int.from_bytes((255, 0, 0), 'big', signed=True), -65536)
1116 self.assertEqual(int.from_bytes(
1117 bytearray(b'\xff\x00\x00'), 'big', signed=True), -65536)
1118 self.assertEqual(int.from_bytes(
1119 bytearray(b'\xff\x00\x00'), 'big', signed=True), -65536)
1120 self.assertEqual(int.from_bytes(
1121 array.array('B', b'\xff\x00\x00'), 'big', signed=True), -65536)
1122 self.assertEqual(int.from_bytes(
1123 memoryview(b'\xff\x00\x00'), 'big', signed=True), -65536)
1124 self.assertRaises(ValueError, int.from_bytes, [256], 'big')
1125 self.assertRaises(ValueError, int.from_bytes, [0], 'big\x00')
1126 self.assertRaises(ValueError, int.from_bytes, [0], 'little\x00')
1127 self.assertRaises(TypeError, int.from_bytes, "", 'big')
1128 self.assertRaises(TypeError, int.from_bytes, "\x00", 'big')
1129 self.assertRaises(TypeError, int.from_bytes, 0, 'big')
1130 self.assertRaises(TypeError, int.from_bytes, 0, 'big', True)
1131 self.assertRaises(TypeError, myint.from_bytes, "", 'big')
1132 self.assertRaises(TypeError, myint.from_bytes, "\x00", 'big')
1133 self.assertRaises(TypeError, myint.from_bytes, 0, 'big')
1134 self.assertRaises(TypeError, int.from_bytes, 0, 'big', True)
Mark Dickinson1124e712009-01-28 21:25:58 +00001135
Mark Dickinson54bc1ec2008-12-17 16:19:07 +00001136
Walter Dörwalda0021592005-06-13 21:44:48 +00001137def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001138 support.run_unittest(LongTest)
Tim Peters307fa782004-09-23 08:06:40 +00001139
Walter Dörwalda0021592005-06-13 21:44:48 +00001140if __name__ == "__main__":
1141 test_main()