14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport test.test_support, unittest 24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass PowTest(unittest.TestCase): 44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def powtest(self, type): 64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if type != float: 74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(-1000, 1000): 84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(pow(type(i), 0), 1) 94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(pow(type(i), 1), type(i)) 104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(pow(type(0), 1), type(0)) 114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(pow(type(1), 1), type(1)) 124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(-100, 100): 144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(pow(type(i), 3), i*i*i) 154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pow2 = 1 174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(0,31): 184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(pow(2, i), pow2) 194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if i != 30 : pow2 = pow2*2 204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for othertype in int, long: 224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(-10, 0) + range(1, 10): 234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ii = type(i) 244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for j in range(1, 11): 254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm jj = -othertype(j) 264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pow(ii, jj) 274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for othertype in int, long, float: 294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(1, 100): 304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm zero = type(0) 314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm exp = -othertype(i/10.0) 324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if exp == 0: 334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue 344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(ZeroDivisionError, pow, zero, exp) 354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm il, ih = -20, 20 374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm jl, jh = -5, 5 384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm kl, kh = -10, 10 394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm asseq = self.assertEqual 404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if type == float: 414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm il = 1 424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm asseq = self.assertAlmostEqual 434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif type == int: 444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm jl = 0 454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif type == long: 464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm jl, jh = 0, 15 474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(il, ih+1): 484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for j in range(jl, jh+1): 494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for k in range(kl, kh+1): 504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if k != 0: 514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if type == float or j < 0: 524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, pow, type(i), j, k) 534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm continue 544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm asseq( 554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pow(type(i),j,k), 564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pow(type(i),j)% type(k) 574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ) 584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_powint(self): 604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.powtest(int) 614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_powlong(self): 634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.powtest(long) 644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_powfloat(self): 664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.powtest(float) 674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_other(self): 694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Other tests-- not very systematic 704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(pow(3,3) % 8, pow(3,3,8)) 714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(pow(3,3) % -8, pow(3,3,-8)) 724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(pow(3,2) % -2, pow(3,2,-2)) 734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(pow(-3,3) % 8, pow(-3,3,8)) 744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(pow(-3,3) % -8, pow(-3,3,-8)) 754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(pow(5,2) % -8, pow(5,2,-8)) 764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(pow(3L,3L) % 8, pow(3L,3L,8)) 784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(pow(3L,3L) % -8, pow(3L,3L,-8)) 794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(pow(3L,2) % -2, pow(3L,2,-2)) 804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(pow(-3L,3L) % 8, pow(-3L,3L,8)) 814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(pow(-3L,3L) % -8, pow(-3L,3L,-8)) 824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(pow(5L,2) % -8, pow(5L,2,-8)) 834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(-10, 11): 854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for j in range(0, 6): 864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for k in range(-7, 11): 874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if j >= 0 and k != 0: 884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual( 894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pow(i,j) % k, 904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pow(i,j,k) 914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ) 924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if j >= 0 and k != 0: 934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual( 944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pow(long(i),j) % k, 954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pow(long(i),j,k) 964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ) 974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_bug643260(self): 994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class TestRpow: 1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __rpow__(self, other): 1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return None 1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm None ** TestRpow() # Won't fail when __rpow__ invoked. SF bug #643260. 1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_bug705231(self): 1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # -1.0 raised to an integer should never blow up. It did if the 1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # platform pow() was buggy, and Python didn't worm around it. 1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm eq = self.assertEqual 1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm a = -1.0 1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # The next two tests can still fail if the platform floor() 1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # function doesn't treat all large inputs as integers 1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # test_math should also fail if that is happening 1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm eq(pow(a, 1.23e167), 1.0) 1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm eq(pow(a, -1.23e167), 1.0) 1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for b in range(-10, 11): 1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm eq(pow(a, float(b)), b & 1 and -1.0 or 1.0) 1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for n in range(0, 100): 1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fiveto = float(5 ** n) 1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # For small n, fiveto will be odd. Eventually we run out of 1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # mantissa bits, though, and thereafer fiveto will be even. 1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm expected = fiveto % 2.0 and -1.0 or 1.0 1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm eq(pow(a, fiveto), expected) 1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm eq(pow(a, -fiveto), expected) 1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm eq(expected, 1.0) # else we didn't push fiveto to evenness 1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef test_main(): 1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm test.test_support.run_unittest(PowTest) 1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmif __name__ == "__main__": 1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm test_main() 130