test_complex.py 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789
  1. import unittest
  2. import sys
  3. from test import support
  4. from test.test_grammar import (VALID_UNDERSCORE_LITERALS,
  5. INVALID_UNDERSCORE_LITERALS)
  6. from random import random
  7. from math import atan2, isnan, copysign
  8. import operator
  9. INF = float("inf")
  10. NAN = float("nan")
  11. # These tests ensure that complex math does the right thing
  12. ZERO_DIVISION = (
  13. (1+1j, 0+0j),
  14. (1+1j, 0.0),
  15. (1+1j, 0),
  16. (1.0, 0+0j),
  17. (1, 0+0j),
  18. )
  19. class ComplexTest(unittest.TestCase):
  20. def assertAlmostEqual(self, a, b):
  21. if isinstance(a, complex):
  22. if isinstance(b, complex):
  23. unittest.TestCase.assertAlmostEqual(self, a.real, b.real)
  24. unittest.TestCase.assertAlmostEqual(self, a.imag, b.imag)
  25. else:
  26. unittest.TestCase.assertAlmostEqual(self, a.real, b)
  27. unittest.TestCase.assertAlmostEqual(self, a.imag, 0.)
  28. else:
  29. if isinstance(b, complex):
  30. unittest.TestCase.assertAlmostEqual(self, a, b.real)
  31. unittest.TestCase.assertAlmostEqual(self, 0., b.imag)
  32. else:
  33. unittest.TestCase.assertAlmostEqual(self, a, b)
  34. def assertCloseAbs(self, x, y, eps=1e-9):
  35. """Return true iff floats x and y "are close"."""
  36. # put the one with larger magnitude second
  37. if abs(x) > abs(y):
  38. x, y = y, x
  39. if y == 0:
  40. return abs(x) < eps
  41. if x == 0:
  42. return abs(y) < eps
  43. # check that relative difference < eps
  44. self.assertTrue(abs((x-y)/y) < eps)
  45. def assertFloatsAreIdentical(self, x, y):
  46. """assert that floats x and y are identical, in the sense that:
  47. (1) both x and y are nans, or
  48. (2) both x and y are infinities, with the same sign, or
  49. (3) both x and y are zeros, with the same sign, or
  50. (4) x and y are both finite and nonzero, and x == y
  51. """
  52. msg = 'floats {!r} and {!r} are not identical'
  53. if isnan(x) or isnan(y):
  54. if isnan(x) and isnan(y):
  55. return
  56. elif x == y:
  57. if x != 0.0:
  58. return
  59. # both zero; check that signs match
  60. elif copysign(1.0, x) == copysign(1.0, y):
  61. return
  62. else:
  63. msg += ': zeros have different signs'
  64. self.fail(msg.format(x, y))
  65. def assertClose(self, x, y, eps=1e-9):
  66. """Return true iff complexes x and y "are close"."""
  67. self.assertCloseAbs(x.real, y.real, eps)
  68. self.assertCloseAbs(x.imag, y.imag, eps)
  69. def check_div(self, x, y):
  70. """Compute complex z=x*y, and check that z/x==y and z/y==x."""
  71. z = x * y
  72. if x != 0:
  73. q = z / x
  74. self.assertClose(q, y)
  75. q = z.__truediv__(x)
  76. self.assertClose(q, y)
  77. if y != 0:
  78. q = z / y
  79. self.assertClose(q, x)
  80. q = z.__truediv__(y)
  81. self.assertClose(q, x)
  82. def test_truediv(self):
  83. simple_real = [float(i) for i in range(-5, 6)]
  84. simple_complex = [complex(x, y) for x in simple_real for y in simple_real]
  85. for x in simple_complex:
  86. for y in simple_complex:
  87. self.check_div(x, y)
  88. # A naive complex division algorithm (such as in 2.0) is very prone to
  89. # nonsense errors for these (overflows and underflows).
  90. self.check_div(complex(1e200, 1e200), 1+0j)
  91. self.check_div(complex(1e-200, 1e-200), 1+0j)
  92. # Just for fun.
  93. for i in range(100):
  94. self.check_div(complex(random(), random()),
  95. complex(random(), random()))
  96. self.assertAlmostEqual(complex.__truediv__(2+0j, 1+1j), 1-1j)
  97. for denom_real, denom_imag in [(0, NAN), (NAN, 0), (NAN, NAN)]:
  98. z = complex(0, 0) / complex(denom_real, denom_imag)
  99. self.assertTrue(isnan(z.real))
  100. self.assertTrue(isnan(z.imag))
  101. def test_truediv_zero_division(self):
  102. for a, b in ZERO_DIVISION:
  103. with self.assertRaises(ZeroDivisionError):
  104. a / b
  105. def test_floordiv(self):
  106. with self.assertRaises(TypeError):
  107. (1+1j) // (1+0j)
  108. with self.assertRaises(TypeError):
  109. (1+1j) // 1.0
  110. with self.assertRaises(TypeError):
  111. (1+1j) // 1
  112. with self.assertRaises(TypeError):
  113. 1.0 // (1+0j)
  114. with self.assertRaises(TypeError):
  115. 1 // (1+0j)
  116. def test_floordiv_zero_division(self):
  117. for a, b in ZERO_DIVISION:
  118. with self.assertRaises(TypeError):
  119. a // b
  120. def test_richcompare(self):
  121. self.assertIs(complex.__eq__(1+1j, 1<<10000), False)
  122. self.assertIs(complex.__lt__(1+1j, None), NotImplemented)
  123. self.assertIs(complex.__eq__(1+1j, 1+1j), True)
  124. self.assertIs(complex.__eq__(1+1j, 2+2j), False)
  125. self.assertIs(complex.__ne__(1+1j, 1+1j), False)
  126. self.assertIs(complex.__ne__(1+1j, 2+2j), True)
  127. for i in range(1, 100):
  128. f = i / 100.0
  129. self.assertIs(complex.__eq__(f+0j, f), True)
  130. self.assertIs(complex.__ne__(f+0j, f), False)
  131. self.assertIs(complex.__eq__(complex(f, f), f), False)
  132. self.assertIs(complex.__ne__(complex(f, f), f), True)
  133. self.assertIs(complex.__lt__(1+1j, 2+2j), NotImplemented)
  134. self.assertIs(complex.__le__(1+1j, 2+2j), NotImplemented)
  135. self.assertIs(complex.__gt__(1+1j, 2+2j), NotImplemented)
  136. self.assertIs(complex.__ge__(1+1j, 2+2j), NotImplemented)
  137. self.assertRaises(TypeError, operator.lt, 1+1j, 2+2j)
  138. self.assertRaises(TypeError, operator.le, 1+1j, 2+2j)
  139. self.assertRaises(TypeError, operator.gt, 1+1j, 2+2j)
  140. self.assertRaises(TypeError, operator.ge, 1+1j, 2+2j)
  141. self.assertIs(operator.eq(1+1j, 1+1j), True)
  142. self.assertIs(operator.eq(1+1j, 2+2j), False)
  143. self.assertIs(operator.ne(1+1j, 1+1j), False)
  144. self.assertIs(operator.ne(1+1j, 2+2j), True)
  145. def test_richcompare_boundaries(self):
  146. def check(n, deltas, is_equal, imag = 0.0):
  147. for delta in deltas:
  148. i = n + delta
  149. z = complex(i, imag)
  150. self.assertIs(complex.__eq__(z, i), is_equal(delta))
  151. self.assertIs(complex.__ne__(z, i), not is_equal(delta))
  152. # For IEEE-754 doubles the following should hold:
  153. # x in [2 ** (52 + i), 2 ** (53 + i + 1)] -> x mod 2 ** i == 0
  154. # where the interval is representable, of course.
  155. for i in range(1, 10):
  156. pow = 52 + i
  157. mult = 2 ** i
  158. check(2 ** pow, range(1, 101), lambda delta: delta % mult == 0)
  159. check(2 ** pow, range(1, 101), lambda delta: False, float(i))
  160. check(2 ** 53, range(-100, 0), lambda delta: True)
  161. def test_mod(self):
  162. # % is no longer supported on complex numbers
  163. with self.assertRaises(TypeError):
  164. (1+1j) % (1+0j)
  165. with self.assertRaises(TypeError):
  166. (1+1j) % 1.0
  167. with self.assertRaises(TypeError):
  168. (1+1j) % 1
  169. with self.assertRaises(TypeError):
  170. 1.0 % (1+0j)
  171. with self.assertRaises(TypeError):
  172. 1 % (1+0j)
  173. def test_mod_zero_division(self):
  174. for a, b in ZERO_DIVISION:
  175. with self.assertRaises(TypeError):
  176. a % b
  177. def test_divmod(self):
  178. self.assertRaises(TypeError, divmod, 1+1j, 1+0j)
  179. self.assertRaises(TypeError, divmod, 1+1j, 1.0)
  180. self.assertRaises(TypeError, divmod, 1+1j, 1)
  181. self.assertRaises(TypeError, divmod, 1.0, 1+0j)
  182. self.assertRaises(TypeError, divmod, 1, 1+0j)
  183. def test_divmod_zero_division(self):
  184. for a, b in ZERO_DIVISION:
  185. self.assertRaises(TypeError, divmod, a, b)
  186. def test_pow(self):
  187. self.assertAlmostEqual(pow(1+1j, 0+0j), 1.0)
  188. self.assertAlmostEqual(pow(0+0j, 2+0j), 0.0)
  189. self.assertRaises(ZeroDivisionError, pow, 0+0j, 1j)
  190. self.assertAlmostEqual(pow(1j, -1), 1/1j)
  191. self.assertAlmostEqual(pow(1j, 200), 1)
  192. self.assertRaises(ValueError, pow, 1+1j, 1+1j, 1+1j)
  193. self.assertRaises(OverflowError, pow, 1e200+1j, 1e200+1j)
  194. a = 3.33+4.43j
  195. self.assertEqual(a ** 0j, 1)
  196. self.assertEqual(a ** 0.+0.j, 1)
  197. self.assertEqual(3j ** 0j, 1)
  198. self.assertEqual(3j ** 0, 1)
  199. try:
  200. 0j ** a
  201. except ZeroDivisionError:
  202. pass
  203. else:
  204. self.fail("should fail 0.0 to negative or complex power")
  205. try:
  206. 0j ** (3-2j)
  207. except ZeroDivisionError:
  208. pass
  209. else:
  210. self.fail("should fail 0.0 to negative or complex power")
  211. # The following is used to exercise certain code paths
  212. self.assertEqual(a ** 105, a ** 105)
  213. self.assertEqual(a ** -105, a ** -105)
  214. self.assertEqual(a ** -30, a ** -30)
  215. self.assertEqual(0.0j ** 0, 1)
  216. b = 5.1+2.3j
  217. self.assertRaises(ValueError, pow, a, b, 0)
  218. # Check some boundary conditions; some of these used to invoke
  219. # undefined behaviour (https://bugs.python.org/issue44698). We're
  220. # not actually checking the results of these operations, just making
  221. # sure they don't crash (for example when using clang's
  222. # UndefinedBehaviourSanitizer).
  223. values = (sys.maxsize, sys.maxsize+1, sys.maxsize-1,
  224. -sys.maxsize, -sys.maxsize+1, -sys.maxsize+1)
  225. for real in values:
  226. for imag in values:
  227. with self.subTest(real=real, imag=imag):
  228. c = complex(real, imag)
  229. try:
  230. c ** real
  231. except OverflowError:
  232. pass
  233. try:
  234. c ** c
  235. except OverflowError:
  236. pass
  237. def test_pow_with_small_integer_exponents(self):
  238. # Check that small integer exponents are handled identically
  239. # regardless of their type.
  240. values = [
  241. complex(5.0, 12.0),
  242. complex(5.0e100, 12.0e100),
  243. complex(-4.0, INF),
  244. complex(INF, 0.0),
  245. ]
  246. exponents = [-19, -5, -3, -2, -1, 0, 1, 2, 3, 5, 19]
  247. for value in values:
  248. for exponent in exponents:
  249. with self.subTest(value=value, exponent=exponent):
  250. try:
  251. int_pow = value**exponent
  252. except OverflowError:
  253. int_pow = "overflow"
  254. try:
  255. float_pow = value**float(exponent)
  256. except OverflowError:
  257. float_pow = "overflow"
  258. try:
  259. complex_pow = value**complex(exponent)
  260. except OverflowError:
  261. complex_pow = "overflow"
  262. self.assertEqual(str(float_pow), str(int_pow))
  263. self.assertEqual(str(complex_pow), str(int_pow))
  264. def test_boolcontext(self):
  265. for i in range(100):
  266. self.assertTrue(complex(random() + 1e-6, random() + 1e-6))
  267. self.assertTrue(not complex(0.0, 0.0))
  268. def test_conjugate(self):
  269. self.assertClose(complex(5.3, 9.8).conjugate(), 5.3-9.8j)
  270. def test_constructor(self):
  271. class NS:
  272. def __init__(self, value): self.value = value
  273. def __complex__(self): return self.value
  274. self.assertEqual(complex(NS(1+10j)), 1+10j)
  275. self.assertRaises(TypeError, complex, NS(None))
  276. self.assertRaises(TypeError, complex, {})
  277. self.assertRaises(TypeError, complex, NS(1.5))
  278. self.assertRaises(TypeError, complex, NS(1))
  279. self.assertAlmostEqual(complex("1+10j"), 1+10j)
  280. self.assertAlmostEqual(complex(10), 10+0j)
  281. self.assertAlmostEqual(complex(10.0), 10+0j)
  282. self.assertAlmostEqual(complex(10), 10+0j)
  283. self.assertAlmostEqual(complex(10+0j), 10+0j)
  284. self.assertAlmostEqual(complex(1,10), 1+10j)
  285. self.assertAlmostEqual(complex(1,10), 1+10j)
  286. self.assertAlmostEqual(complex(1,10.0), 1+10j)
  287. self.assertAlmostEqual(complex(1,10), 1+10j)
  288. self.assertAlmostEqual(complex(1,10), 1+10j)
  289. self.assertAlmostEqual(complex(1,10.0), 1+10j)
  290. self.assertAlmostEqual(complex(1.0,10), 1+10j)
  291. self.assertAlmostEqual(complex(1.0,10), 1+10j)
  292. self.assertAlmostEqual(complex(1.0,10.0), 1+10j)
  293. self.assertAlmostEqual(complex(3.14+0j), 3.14+0j)
  294. self.assertAlmostEqual(complex(3.14), 3.14+0j)
  295. self.assertAlmostEqual(complex(314), 314.0+0j)
  296. self.assertAlmostEqual(complex(314), 314.0+0j)
  297. self.assertAlmostEqual(complex(3.14+0j, 0j), 3.14+0j)
  298. self.assertAlmostEqual(complex(3.14, 0.0), 3.14+0j)
  299. self.assertAlmostEqual(complex(314, 0), 314.0+0j)
  300. self.assertAlmostEqual(complex(314, 0), 314.0+0j)
  301. self.assertAlmostEqual(complex(0j, 3.14j), -3.14+0j)
  302. self.assertAlmostEqual(complex(0.0, 3.14j), -3.14+0j)
  303. self.assertAlmostEqual(complex(0j, 3.14), 3.14j)
  304. self.assertAlmostEqual(complex(0.0, 3.14), 3.14j)
  305. self.assertAlmostEqual(complex("1"), 1+0j)
  306. self.assertAlmostEqual(complex("1j"), 1j)
  307. self.assertAlmostEqual(complex(), 0)
  308. self.assertAlmostEqual(complex("-1"), -1)
  309. self.assertAlmostEqual(complex("+1"), +1)
  310. self.assertAlmostEqual(complex("(1+2j)"), 1+2j)
  311. self.assertAlmostEqual(complex("(1.3+2.2j)"), 1.3+2.2j)
  312. self.assertAlmostEqual(complex("3.14+1J"), 3.14+1j)
  313. self.assertAlmostEqual(complex(" ( +3.14-6J )"), 3.14-6j)
  314. self.assertAlmostEqual(complex(" ( +3.14-J )"), 3.14-1j)
  315. self.assertAlmostEqual(complex(" ( +3.14+j )"), 3.14+1j)
  316. self.assertAlmostEqual(complex("J"), 1j)
  317. self.assertAlmostEqual(complex("( j )"), 1j)
  318. self.assertAlmostEqual(complex("+J"), 1j)
  319. self.assertAlmostEqual(complex("( -j)"), -1j)
  320. self.assertAlmostEqual(complex('1e-500'), 0.0 + 0.0j)
  321. self.assertAlmostEqual(complex('-1e-500j'), 0.0 - 0.0j)
  322. self.assertAlmostEqual(complex('-1e-500+1e-500j'), -0.0 + 0.0j)
  323. class complex2(complex): pass
  324. self.assertAlmostEqual(complex(complex2(1+1j)), 1+1j)
  325. self.assertAlmostEqual(complex(real=17, imag=23), 17+23j)
  326. self.assertAlmostEqual(complex(real=17+23j), 17+23j)
  327. self.assertAlmostEqual(complex(real=17+23j, imag=23), 17+46j)
  328. self.assertAlmostEqual(complex(real=1+2j, imag=3+4j), -3+5j)
  329. # check that the sign of a zero in the real or imaginary part
  330. # is preserved when constructing from two floats. (These checks
  331. # are harmless on systems without support for signed zeros.)
  332. def split_zeros(x):
  333. """Function that produces different results for 0. and -0."""
  334. return atan2(x, -1.)
  335. self.assertEqual(split_zeros(complex(1., 0.).imag), split_zeros(0.))
  336. self.assertEqual(split_zeros(complex(1., -0.).imag), split_zeros(-0.))
  337. self.assertEqual(split_zeros(complex(0., 1.).real), split_zeros(0.))
  338. self.assertEqual(split_zeros(complex(-0., 1.).real), split_zeros(-0.))
  339. c = 3.14 + 1j
  340. self.assertTrue(complex(c) is c)
  341. del c
  342. self.assertRaises(TypeError, complex, "1", "1")
  343. self.assertRaises(TypeError, complex, 1, "1")
  344. # SF bug 543840: complex(string) accepts strings with \0
  345. # Fixed in 2.3.
  346. self.assertRaises(ValueError, complex, '1+1j\0j')
  347. self.assertRaises(TypeError, int, 5+3j)
  348. self.assertRaises(TypeError, int, 5+3j)
  349. self.assertRaises(TypeError, float, 5+3j)
  350. self.assertRaises(ValueError, complex, "")
  351. self.assertRaises(TypeError, complex, None)
  352. self.assertRaisesRegex(TypeError, "not 'NoneType'", complex, None)
  353. self.assertRaises(ValueError, complex, "\0")
  354. self.assertRaises(ValueError, complex, "3\09")
  355. self.assertRaises(TypeError, complex, "1", "2")
  356. self.assertRaises(TypeError, complex, "1", 42)
  357. self.assertRaises(TypeError, complex, 1, "2")
  358. self.assertRaises(ValueError, complex, "1+")
  359. self.assertRaises(ValueError, complex, "1+1j+1j")
  360. self.assertRaises(ValueError, complex, "--")
  361. self.assertRaises(ValueError, complex, "(1+2j")
  362. self.assertRaises(ValueError, complex, "1+2j)")
  363. self.assertRaises(ValueError, complex, "1+(2j)")
  364. self.assertRaises(ValueError, complex, "(1+2j)123")
  365. self.assertRaises(ValueError, complex, "x")
  366. self.assertRaises(ValueError, complex, "1j+2")
  367. self.assertRaises(ValueError, complex, "1e1ej")
  368. self.assertRaises(ValueError, complex, "1e++1ej")
  369. self.assertRaises(ValueError, complex, ")1+2j(")
  370. self.assertRaisesRegex(
  371. TypeError,
  372. "first argument must be a string or a number, not 'dict'",
  373. complex, {1:2}, 1)
  374. self.assertRaisesRegex(
  375. TypeError,
  376. "second argument must be a number, not 'dict'",
  377. complex, 1, {1:2})
  378. # the following three are accepted by Python 2.6
  379. self.assertRaises(ValueError, complex, "1..1j")
  380. self.assertRaises(ValueError, complex, "1.11.1j")
  381. self.assertRaises(ValueError, complex, "1e1.1j")
  382. # check that complex accepts long unicode strings
  383. self.assertEqual(type(complex("1"*500)), complex)
  384. # check whitespace processing
  385. self.assertEqual(complex('\N{EM SPACE}(\N{EN SPACE}1+1j ) '), 1+1j)
  386. # Invalid unicode string
  387. # See bpo-34087
  388. self.assertRaises(ValueError, complex, '\u3053\u3093\u306b\u3061\u306f')
  389. class EvilExc(Exception):
  390. pass
  391. class evilcomplex:
  392. def __complex__(self):
  393. raise EvilExc
  394. self.assertRaises(EvilExc, complex, evilcomplex())
  395. class float2:
  396. def __init__(self, value):
  397. self.value = value
  398. def __float__(self):
  399. return self.value
  400. self.assertAlmostEqual(complex(float2(42.)), 42)
  401. self.assertAlmostEqual(complex(real=float2(17.), imag=float2(23.)), 17+23j)
  402. self.assertRaises(TypeError, complex, float2(None))
  403. class MyIndex:
  404. def __init__(self, value):
  405. self.value = value
  406. def __index__(self):
  407. return self.value
  408. self.assertAlmostEqual(complex(MyIndex(42)), 42.0+0.0j)
  409. self.assertAlmostEqual(complex(123, MyIndex(42)), 123.0+42.0j)
  410. self.assertRaises(OverflowError, complex, MyIndex(2**2000))
  411. self.assertRaises(OverflowError, complex, 123, MyIndex(2**2000))
  412. class MyInt:
  413. def __int__(self):
  414. return 42
  415. self.assertRaises(TypeError, complex, MyInt())
  416. self.assertRaises(TypeError, complex, 123, MyInt())
  417. class complex0(complex):
  418. """Test usage of __complex__() when inheriting from 'complex'"""
  419. def __complex__(self):
  420. return 42j
  421. class complex1(complex):
  422. """Test usage of __complex__() with a __new__() method"""
  423. def __new__(self, value=0j):
  424. return complex.__new__(self, 2*value)
  425. def __complex__(self):
  426. return self
  427. class complex2(complex):
  428. """Make sure that __complex__() calls fail if anything other than a
  429. complex is returned"""
  430. def __complex__(self):
  431. return None
  432. self.assertEqual(complex(complex0(1j)), 42j)
  433. with self.assertWarns(DeprecationWarning):
  434. self.assertEqual(complex(complex1(1j)), 2j)
  435. self.assertRaises(TypeError, complex, complex2(1j))
  436. def test___complex__(self):
  437. z = 3 + 4j
  438. self.assertEqual(z.__complex__(), z)
  439. self.assertEqual(type(z.__complex__()), complex)
  440. class complex_subclass(complex):
  441. pass
  442. z = complex_subclass(3 + 4j)
  443. self.assertEqual(z.__complex__(), 3 + 4j)
  444. self.assertEqual(type(z.__complex__()), complex)
  445. @support.requires_IEEE_754
  446. def test_constructor_special_numbers(self):
  447. class complex2(complex):
  448. pass
  449. for x in 0.0, -0.0, INF, -INF, NAN:
  450. for y in 0.0, -0.0, INF, -INF, NAN:
  451. with self.subTest(x=x, y=y):
  452. z = complex(x, y)
  453. self.assertFloatsAreIdentical(z.real, x)
  454. self.assertFloatsAreIdentical(z.imag, y)
  455. z = complex2(x, y)
  456. self.assertIs(type(z), complex2)
  457. self.assertFloatsAreIdentical(z.real, x)
  458. self.assertFloatsAreIdentical(z.imag, y)
  459. z = complex(complex2(x, y))
  460. self.assertIs(type(z), complex)
  461. self.assertFloatsAreIdentical(z.real, x)
  462. self.assertFloatsAreIdentical(z.imag, y)
  463. z = complex2(complex(x, y))
  464. self.assertIs(type(z), complex2)
  465. self.assertFloatsAreIdentical(z.real, x)
  466. self.assertFloatsAreIdentical(z.imag, y)
  467. def test_underscores(self):
  468. # check underscores
  469. for lit in VALID_UNDERSCORE_LITERALS:
  470. if not any(ch in lit for ch in 'xXoObB'):
  471. self.assertEqual(complex(lit), eval(lit))
  472. self.assertEqual(complex(lit), complex(lit.replace('_', '')))
  473. for lit in INVALID_UNDERSCORE_LITERALS:
  474. if lit in ('0_7', '09_99'): # octals are not recognized here
  475. continue
  476. if not any(ch in lit for ch in 'xXoObB'):
  477. self.assertRaises(ValueError, complex, lit)
  478. def test_hash(self):
  479. for x in range(-30, 30):
  480. self.assertEqual(hash(x), hash(complex(x, 0)))
  481. x /= 3.0 # now check against floating point
  482. self.assertEqual(hash(x), hash(complex(x, 0.)))
  483. def test_abs(self):
  484. nums = [complex(x/3., y/7.) for x in range(-9,9) for y in range(-9,9)]
  485. for num in nums:
  486. self.assertAlmostEqual((num.real**2 + num.imag**2) ** 0.5, abs(num))
  487. def test_repr_str(self):
  488. def test(v, expected, test_fn=self.assertEqual):
  489. test_fn(repr(v), expected)
  490. test_fn(str(v), expected)
  491. test(1+6j, '(1+6j)')
  492. test(1-6j, '(1-6j)')
  493. test(-(1+0j), '(-1+-0j)', test_fn=self.assertNotEqual)
  494. test(complex(1., INF), "(1+infj)")
  495. test(complex(1., -INF), "(1-infj)")
  496. test(complex(INF, 1), "(inf+1j)")
  497. test(complex(-INF, INF), "(-inf+infj)")
  498. test(complex(NAN, 1), "(nan+1j)")
  499. test(complex(1, NAN), "(1+nanj)")
  500. test(complex(NAN, NAN), "(nan+nanj)")
  501. test(complex(0, INF), "infj")
  502. test(complex(0, -INF), "-infj")
  503. test(complex(0, NAN), "nanj")
  504. self.assertEqual(1-6j,complex(repr(1-6j)))
  505. self.assertEqual(1+6j,complex(repr(1+6j)))
  506. self.assertEqual(-6j,complex(repr(-6j)))
  507. self.assertEqual(6j,complex(repr(6j)))
  508. @support.requires_IEEE_754
  509. def test_negative_zero_repr_str(self):
  510. def test(v, expected, test_fn=self.assertEqual):
  511. test_fn(repr(v), expected)
  512. test_fn(str(v), expected)
  513. test(complex(0., 1.), "1j")
  514. test(complex(-0., 1.), "(-0+1j)")
  515. test(complex(0., -1.), "-1j")
  516. test(complex(-0., -1.), "(-0-1j)")
  517. test(complex(0., 0.), "0j")
  518. test(complex(0., -0.), "-0j")
  519. test(complex(-0., 0.), "(-0+0j)")
  520. test(complex(-0., -0.), "(-0-0j)")
  521. def test_neg(self):
  522. self.assertEqual(-(1+6j), -1-6j)
  523. def test_getnewargs(self):
  524. self.assertEqual((1+2j).__getnewargs__(), (1.0, 2.0))
  525. self.assertEqual((1-2j).__getnewargs__(), (1.0, -2.0))
  526. self.assertEqual((2j).__getnewargs__(), (0.0, 2.0))
  527. self.assertEqual((-0j).__getnewargs__(), (0.0, -0.0))
  528. self.assertEqual(complex(0, INF).__getnewargs__(), (0.0, INF))
  529. self.assertEqual(complex(INF, 0).__getnewargs__(), (INF, 0.0))
  530. @support.requires_IEEE_754
  531. def test_plus_minus_0j(self):
  532. # test that -0j and 0j literals are not identified
  533. z1, z2 = 0j, -0j
  534. self.assertEqual(atan2(z1.imag, -1.), atan2(0., -1.))
  535. self.assertEqual(atan2(z2.imag, -1.), atan2(-0., -1.))
  536. @support.requires_IEEE_754
  537. def test_negated_imaginary_literal(self):
  538. z0 = -0j
  539. z1 = -7j
  540. z2 = -1e1000j
  541. # Note: In versions of Python < 3.2, a negated imaginary literal
  542. # accidentally ended up with real part 0.0 instead of -0.0, thanks to a
  543. # modification during CST -> AST translation (see issue #9011). That's
  544. # fixed in Python 3.2.
  545. self.assertFloatsAreIdentical(z0.real, -0.0)
  546. self.assertFloatsAreIdentical(z0.imag, -0.0)
  547. self.assertFloatsAreIdentical(z1.real, -0.0)
  548. self.assertFloatsAreIdentical(z1.imag, -7.0)
  549. self.assertFloatsAreIdentical(z2.real, -0.0)
  550. self.assertFloatsAreIdentical(z2.imag, -INF)
  551. @support.requires_IEEE_754
  552. def test_overflow(self):
  553. self.assertEqual(complex("1e500"), complex(INF, 0.0))
  554. self.assertEqual(complex("-1e500j"), complex(0.0, -INF))
  555. self.assertEqual(complex("-1e500+1.8e308j"), complex(-INF, INF))
  556. @support.requires_IEEE_754
  557. def test_repr_roundtrip(self):
  558. vals = [0.0, 1e-500, 1e-315, 1e-200, 0.0123, 3.1415, 1e50, INF, NAN]
  559. vals += [-v for v in vals]
  560. # complex(repr(z)) should recover z exactly, even for complex
  561. # numbers involving an infinity, nan, or negative zero
  562. for x in vals:
  563. for y in vals:
  564. z = complex(x, y)
  565. roundtrip = complex(repr(z))
  566. self.assertFloatsAreIdentical(z.real, roundtrip.real)
  567. self.assertFloatsAreIdentical(z.imag, roundtrip.imag)
  568. # if we predefine some constants, then eval(repr(z)) should
  569. # also work, except that it might change the sign of zeros
  570. inf, nan = float('inf'), float('nan')
  571. infj, nanj = complex(0.0, inf), complex(0.0, nan)
  572. for x in vals:
  573. for y in vals:
  574. z = complex(x, y)
  575. roundtrip = eval(repr(z))
  576. # adding 0.0 has no effect beside changing -0.0 to 0.0
  577. self.assertFloatsAreIdentical(0.0 + z.real,
  578. 0.0 + roundtrip.real)
  579. self.assertFloatsAreIdentical(0.0 + z.imag,
  580. 0.0 + roundtrip.imag)
  581. def test_format(self):
  582. # empty format string is same as str()
  583. self.assertEqual(format(1+3j, ''), str(1+3j))
  584. self.assertEqual(format(1.5+3.5j, ''), str(1.5+3.5j))
  585. self.assertEqual(format(3j, ''), str(3j))
  586. self.assertEqual(format(3.2j, ''), str(3.2j))
  587. self.assertEqual(format(3+0j, ''), str(3+0j))
  588. self.assertEqual(format(3.2+0j, ''), str(3.2+0j))
  589. # empty presentation type should still be analogous to str,
  590. # even when format string is nonempty (issue #5920).
  591. self.assertEqual(format(3.2+0j, '-'), str(3.2+0j))
  592. self.assertEqual(format(3.2+0j, '<'), str(3.2+0j))
  593. z = 4/7. - 100j/7.
  594. self.assertEqual(format(z, ''), str(z))
  595. self.assertEqual(format(z, '-'), str(z))
  596. self.assertEqual(format(z, '<'), str(z))
  597. self.assertEqual(format(z, '10'), str(z))
  598. z = complex(0.0, 3.0)
  599. self.assertEqual(format(z, ''), str(z))
  600. self.assertEqual(format(z, '-'), str(z))
  601. self.assertEqual(format(z, '<'), str(z))
  602. self.assertEqual(format(z, '2'), str(z))
  603. z = complex(-0.0, 2.0)
  604. self.assertEqual(format(z, ''), str(z))
  605. self.assertEqual(format(z, '-'), str(z))
  606. self.assertEqual(format(z, '<'), str(z))
  607. self.assertEqual(format(z, '3'), str(z))
  608. self.assertEqual(format(1+3j, 'g'), '1+3j')
  609. self.assertEqual(format(3j, 'g'), '0+3j')
  610. self.assertEqual(format(1.5+3.5j, 'g'), '1.5+3.5j')
  611. self.assertEqual(format(1.5+3.5j, '+g'), '+1.5+3.5j')
  612. self.assertEqual(format(1.5-3.5j, '+g'), '+1.5-3.5j')
  613. self.assertEqual(format(1.5-3.5j, '-g'), '1.5-3.5j')
  614. self.assertEqual(format(1.5+3.5j, ' g'), ' 1.5+3.5j')
  615. self.assertEqual(format(1.5-3.5j, ' g'), ' 1.5-3.5j')
  616. self.assertEqual(format(-1.5+3.5j, ' g'), '-1.5+3.5j')
  617. self.assertEqual(format(-1.5-3.5j, ' g'), '-1.5-3.5j')
  618. self.assertEqual(format(-1.5-3.5e-20j, 'g'), '-1.5-3.5e-20j')
  619. self.assertEqual(format(-1.5-3.5j, 'f'), '-1.500000-3.500000j')
  620. self.assertEqual(format(-1.5-3.5j, 'F'), '-1.500000-3.500000j')
  621. self.assertEqual(format(-1.5-3.5j, 'e'), '-1.500000e+00-3.500000e+00j')
  622. self.assertEqual(format(-1.5-3.5j, '.2e'), '-1.50e+00-3.50e+00j')
  623. self.assertEqual(format(-1.5-3.5j, '.2E'), '-1.50E+00-3.50E+00j')
  624. self.assertEqual(format(-1.5e10-3.5e5j, '.2G'), '-1.5E+10-3.5E+05j')
  625. self.assertEqual(format(1.5+3j, '<20g'), '1.5+3j ')
  626. self.assertEqual(format(1.5+3j, '*<20g'), '1.5+3j**************')
  627. self.assertEqual(format(1.5+3j, '>20g'), ' 1.5+3j')
  628. self.assertEqual(format(1.5+3j, '^20g'), ' 1.5+3j ')
  629. self.assertEqual(format(1.5+3j, '<20'), '(1.5+3j) ')
  630. self.assertEqual(format(1.5+3j, '>20'), ' (1.5+3j)')
  631. self.assertEqual(format(1.5+3j, '^20'), ' (1.5+3j) ')
  632. self.assertEqual(format(1.123-3.123j, '^20.2'), ' (1.1-3.1j) ')
  633. self.assertEqual(format(1.5+3j, '20.2f'), ' 1.50+3.00j')
  634. self.assertEqual(format(1.5+3j, '>20.2f'), ' 1.50+3.00j')
  635. self.assertEqual(format(1.5+3j, '<20.2f'), '1.50+3.00j ')
  636. self.assertEqual(format(1.5e20+3j, '<20.2f'), '150000000000000000000.00+3.00j')
  637. self.assertEqual(format(1.5e20+3j, '>40.2f'), ' 150000000000000000000.00+3.00j')
  638. self.assertEqual(format(1.5e20+3j, '^40,.2f'), ' 150,000,000,000,000,000,000.00+3.00j ')
  639. self.assertEqual(format(1.5e21+3j, '^40,.2f'), ' 1,500,000,000,000,000,000,000.00+3.00j ')
  640. self.assertEqual(format(1.5e21+3000j, ',.2f'), '1,500,000,000,000,000,000,000.00+3,000.00j')
  641. # Issue 7094: Alternate formatting (specified by #)
  642. self.assertEqual(format(1+1j, '.0e'), '1e+00+1e+00j')
  643. self.assertEqual(format(1+1j, '#.0e'), '1.e+00+1.e+00j')
  644. self.assertEqual(format(1+1j, '.0f'), '1+1j')
  645. self.assertEqual(format(1+1j, '#.0f'), '1.+1.j')
  646. self.assertEqual(format(1.1+1.1j, 'g'), '1.1+1.1j')
  647. self.assertEqual(format(1.1+1.1j, '#g'), '1.10000+1.10000j')
  648. # Alternate doesn't make a difference for these, they format the same with or without it
  649. self.assertEqual(format(1+1j, '.1e'), '1.0e+00+1.0e+00j')
  650. self.assertEqual(format(1+1j, '#.1e'), '1.0e+00+1.0e+00j')
  651. self.assertEqual(format(1+1j, '.1f'), '1.0+1.0j')
  652. self.assertEqual(format(1+1j, '#.1f'), '1.0+1.0j')
  653. # Misc. other alternate tests
  654. self.assertEqual(format((-1.5+0.5j), '#f'), '-1.500000+0.500000j')
  655. self.assertEqual(format((-1.5+0.5j), '#.0f'), '-2.+0.j')
  656. self.assertEqual(format((-1.5+0.5j), '#e'), '-1.500000e+00+5.000000e-01j')
  657. self.assertEqual(format((-1.5+0.5j), '#.0e'), '-2.e+00+5.e-01j')
  658. self.assertEqual(format((-1.5+0.5j), '#g'), '-1.50000+0.500000j')
  659. self.assertEqual(format((-1.5+0.5j), '.0g'), '-2+0.5j')
  660. self.assertEqual(format((-1.5+0.5j), '#.0g'), '-2.+0.5j')
  661. # zero padding is invalid
  662. self.assertRaises(ValueError, (1.5+0.5j).__format__, '010f')
  663. # '=' alignment is invalid
  664. self.assertRaises(ValueError, (1.5+3j).__format__, '=20')
  665. # integer presentation types are an error
  666. for t in 'bcdoxX':
  667. self.assertRaises(ValueError, (1.5+0.5j).__format__, t)
  668. # make sure everything works in ''.format()
  669. self.assertEqual('*{0:.3f}*'.format(3.14159+2.71828j), '*3.142+2.718j*')
  670. # issue 3382
  671. self.assertEqual(format(complex(NAN, NAN), 'f'), 'nan+nanj')
  672. self.assertEqual(format(complex(1, NAN), 'f'), '1.000000+nanj')
  673. self.assertEqual(format(complex(NAN, 1), 'f'), 'nan+1.000000j')
  674. self.assertEqual(format(complex(NAN, -1), 'f'), 'nan-1.000000j')
  675. self.assertEqual(format(complex(NAN, NAN), 'F'), 'NAN+NANj')
  676. self.assertEqual(format(complex(1, NAN), 'F'), '1.000000+NANj')
  677. self.assertEqual(format(complex(NAN, 1), 'F'), 'NAN+1.000000j')
  678. self.assertEqual(format(complex(NAN, -1), 'F'), 'NAN-1.000000j')
  679. self.assertEqual(format(complex(INF, INF), 'f'), 'inf+infj')
  680. self.assertEqual(format(complex(1, INF), 'f'), '1.000000+infj')
  681. self.assertEqual(format(complex(INF, 1), 'f'), 'inf+1.000000j')
  682. self.assertEqual(format(complex(INF, -1), 'f'), 'inf-1.000000j')
  683. self.assertEqual(format(complex(INF, INF), 'F'), 'INF+INFj')
  684. self.assertEqual(format(complex(1, INF), 'F'), '1.000000+INFj')
  685. self.assertEqual(format(complex(INF, 1), 'F'), 'INF+1.000000j')
  686. self.assertEqual(format(complex(INF, -1), 'F'), 'INF-1.000000j')
  687. if __name__ == "__main__":
  688. unittest.main()