|
8 | 8 | ) |
9 | 9 |
|
10 | 10 | from random import random |
11 | | -from math import isnan, copysign |
| 11 | +from math import isnan, copysign, ulp |
12 | 12 | import operator |
13 | 13 |
|
14 | 14 | INF = float("inf") |
@@ -446,6 +446,20 @@ def test_pow_with_small_integer_exponents(self): |
446 | 446 | self.assertEqual(str(float_pow), str(int_pow)) |
447 | 447 | self.assertEqual(str(complex_pow), str(int_pow)) |
448 | 448 |
|
| 449 | + @support.requires_IEEE_754 |
| 450 | + def test_pow_small_negative_integer_exponents(self): |
| 451 | + z = complex(float.fromhex('0x1.47e9c711723f5p+81'), |
| 452 | + float.fromhex('0x1.38afd1168e49fp+85')) |
| 453 | + expected = complex(float.fromhex('0x0.4000000000000p-1022'), |
| 454 | + float.fromhex('0x0.3ffffffffffffp-1022')) |
| 455 | + for exponent in (-12, -12.0, complex(-12.0, 0.0)): |
| 456 | + with self.subTest(exponent=exponent): |
| 457 | + result = z ** exponent |
| 458 | + self.assertLessEqual(abs(result.real - expected.real), |
| 459 | + 4 * ulp(expected.real)) |
| 460 | + self.assertLessEqual(abs(result.imag - expected.imag), |
| 461 | + 4 * ulp(expected.imag)) |
| 462 | + |
449 | 463 | def test_boolcontext(self): |
450 | 464 | for i in range(100): |
451 | 465 | self.assertTrue(complex(random() + 1e-6, random() + 1e-6)) |
|
0 commit comments