@@ -299,73 +299,79 @@ def test_pow():
299
299
# (0xffffffffffffffff >> 63) is used to produce a non-narrowed int
300
300
assert 2 ** (0xffffffffffffffff >> 63 ) == 2
301
301
302
- # try:
303
- # 2 ** (2**128)
304
- # except ArithmeticError:
305
- # assert True
306
- # else:
307
- # assert False
308
-
309
- # assert 2 ** -(2**128) == 0.0
310
-
311
- # class X(float):
312
- # def __rpow__(self, other):
313
- # return 42
314
-
315
- # assert 2 ** X() == 42
316
-
317
- # try:
318
- # 2.0 .__pow__(2, 2)
319
- # except TypeError as e:
320
- # assert True
321
- # else:
322
- # assert False
323
-
324
- # try:
325
- # 2.0 .__pow__(2.0, 2.0)
326
- # except TypeError as e:
327
- # assert True
328
- # else:
329
- # assert False
330
-
331
- # assert 2 ** 2.0 == 4.0
332
-
333
- # assert 2 .__pow__("a") == NotImplemented
334
- # assert 2 .__pow__("a", 2) == NotImplemented
335
- # assert 2 .__pow__(2**30, 2**128) == 0
336
-
337
- # # crafted to try specializations
338
- # def mypow(a, b, c):
339
- # return a.__pow__(b, c)
340
-
341
- # values = [
342
- # [1, 2, None], # long
343
- # [1, 128, None], # BigInteger
344
- # [1, -2, None], # double result
345
- # [1, 0xffffffffffffffffffffffffffffffff & 0x8000, None], # narrow to long
346
- # [2, 0xffffffffffffffffffffffffffffffff & 0x8000, None], # cannot narrow
347
- # [2, -(0xffffffffffffffffffffffffffffffff & 0x8000), None], # double result
348
- # [2**128, 0, None], # narrow to long
349
- # [2**128, 1, None], # cannot narrow
350
- # [2**128, -2, None], # double
351
- # [2**128, 0xffffffffffffffffffffffffffffffff & 0x8000, None], # large
352
- # [2**128, -(0xffffffffffffffffffffffffffffffff & 0x8000), None], # double result
353
- # [1, 2, 3], # fast path
354
- # [2, 2**30, 2**128], # generic
355
- # ] + []
356
-
357
- # if sys.version_info.minor >= 8:
358
- # values += [
359
- # [1, -2, 3], # fast path double
360
- # ]
361
-
362
- # for args in values:
363
- # assert mypow(*args) == pow(*args), f"{args} -> {mypow(*args)} == {pow(*args)}"
364
-
365
- # def mypow_rev(a, b, c):
366
- # return a.__pow__(b, c)
367
-
368
- # for args in reversed(values):
369
- # assert mypow_rev(*args) == pow(*args), f"{args} -> {mypow(*args)} == {pow(*args)}"
370
-
371
- # assert 2**1.0 == 2.0
302
+ if sys .implementation .name == "graalpython" :
303
+ try :
304
+ 2 ** (2 ** 128 )
305
+ except ArithmeticError :
306
+ assert True
307
+ else :
308
+ assert False
309
+
310
+ assert 2 ** - (2 ** 128 ) == 0.0
311
+
312
+ class X (float ):
313
+ def __rpow__ (self , other ):
314
+ return 42
315
+
316
+ assert 2 ** X () == 42
317
+
318
+ try :
319
+ 2.0 .__pow__ (2 , 2 )
320
+ except TypeError as e :
321
+ assert True
322
+ else :
323
+ assert False
324
+
325
+ try :
326
+ 2.0 .__pow__ (2.0 , 2.0 )
327
+ except TypeError as e :
328
+ assert True
329
+ else :
330
+ assert False
331
+
332
+ assert 2 ** 2.0 == 4.0
333
+
334
+ assert 2 .__pow__ ("a" ) == NotImplemented
335
+ assert 2 .__pow__ ("a" , 2 ) == NotImplemented
336
+ assert 2 .__pow__ (2 ** 30 , 2 ** 128 ) == 0
337
+
338
+ # crafted to try specializations
339
+ def mypow (a , b , c ):
340
+ return a .__pow__ (b , c )
341
+
342
+ values = [
343
+ [1 , 2 , None , 1 ], # long
344
+ [1 , 128 , None , 1 ], # BigInteger
345
+ [1 , - 2 , None , 1.0 ], # double result
346
+ [1 , 0xffffffffffffffffffffffffffffffff & 0x80 , None , 1 ], # narrow to long
347
+ [2 , 0xffffffffffffffffffffffffffffffff & 0x80 , None , 340282366920938463463374607431768211456 ], # cannot narrow
348
+ [2 , - (0xffffffffffffffffffffffffffffffff & 0x80 ), None , 2.938735877055719e-39 ], # double result
349
+ [2 ** 128 , 0 , None , 1 ], # narrow to long
350
+ [2 ** 128 , 1 , None , 340282366920938463463374607431768211456 ], # cannot narrow
351
+ [2 ** 128 , - 2 , None , 8.636168555094445e-78 ], # double
352
+ [2 ** 128 , 0xffffffffffffffffffffffffffffffff & 0x2 , None , 115792089237316195423570985008687907853269984665640564039457584007913129639936 ], # large
353
+ [2 ** 128 , - (0xffffffffffffffffffffffffffffffff & 0x8 ), None , 5.562684646268003e-309 ], # double result
354
+ [1 , 2 , 3 , 1 ], # fast path
355
+ [2 , 2 ** 30 , 2 ** 128 , 0 ], # generic
356
+ ] + []
357
+
358
+ if sys .version_info .minor >= 8 :
359
+ values += [
360
+ [1 , - 2 , 3 , 1 ], # fast path double
361
+ [1 , 2 , - 3 , - 2 ], # negative mod
362
+ [1 , - 2 , - 3 , - 2 ], # negative mod and negative right
363
+ [1 , - 2 ** 128 , 3 , 1 ], # mod and large negative right
364
+ [1 , - 2 ** 128 , - 3 , - 2 ], # negative mod and large negative right
365
+ [1 , - 2 ** 128 , - 2 ** 64 , - 18446744073709551615 ], # large negative mod and large negative right
366
+ ]
367
+
368
+ for args in values :
369
+ assert mypow (* args [:- 1 ]) == args [- 1 ], "%r -> %r == %r" % (args , mypow (* args [:- 1 ]), args [- 1 ])
370
+
371
+ def mypow_rev (a , b , c ):
372
+ return a .__pow__ (b , c )
373
+
374
+ for args in reversed (values ):
375
+ assert mypow_rev (* args [:- 1 ]) == args [- 1 ], "%r -> %r == %r" % (args , mypow (* args [:- 1 ]), args [- 1 ])
376
+
377
+ assert 2 ** 1.0 == 2.0
0 commit comments