cmath — 복소수를 위한 수학 함수
cmath — 복소수를 위한 수학 함수
이 모듈은 복소수를 위한 수학 함수에 접근을 제공해요. 이 모듈의 함수들은 정수, 부동소수점 수 또는 복소수를 인자로 받아들여요. __complex__() 또는 __float__() 메서드를 가진 어떤 파이썬 객체도 받아들여요. 이 메서드들이 객체를 각각 복소수나 부동소수점으로 변환하고, 함수는 변환 결과에 적용돼요.
참고 (branch cut): 가지치기(branch cut)를 포함한 함수에서 cut 자체에서 그 함수를 어떻게 정의할지 결정하는 문제가 있어요. Kahan의 "Branch cuts for complex elementary functions" 논문과 C99 이후의 Annex G를 따라, cut의 양쪽을 구별하는 데 영(0)의 부호를 사용해요. 실수 축을 따라 cut이 있으면 허수부의 부호를, 허수 축을 따라 cut이 있으면 실수부의 부호를 봐요.
예를 들어 cmath.sqrt()는 음의 실수 축을 따라 가지치기가 있어요. 인자 -2-0j는 cut 아래에 있는 것으로 취급돼 음의 허수 축에 결과를 줘요.
>>> cmath.sqrt(-2-0j)
-1.4142135623730951j
하지만 -2+0j는 cut 위에 있는 것으로 취급돼요.
>>> cmath.sqrt(-2+0j)
1.4142135623730951j
본문
극좌표 변환 (Conversions to and from polar coordinates)
파이썬 복소수 z는 내부적으로 직각(카르테시안) 좌표로 저장돼요. 실수부 z.real과 허수부 z.imag로 완전히 결정돼요. 극좌표는 복소수를 표현하는 또 다른 방법이에요. 극좌표에서 z는 modulus r(원점에서 z까지의 거리)과 phase angle phi(양의 x축에서 원점과 z를 잇는 선분까지 반시계 방향으로 잰 라디안 각도)로 정의돼요.
cmath.phase(z): z의 위상(argument라고도 함)을 float로 반환.phase(z)는math.atan2(z.imag, z.real)과 동등. 결과 범위는 [-π, π]이고 가지치기는 음의 실수 축을 따라 있어요. z.imag가 0이어도 결과의 부호는 z.imag의 부호와 같아요.
>>> phase(-1+0j)
3.141592653589793
>>> phase(-1-0j)
-3.141592653589793
참고: z의 modulus(절댓값)는 내장
abs()함수로 계산할 수 있어요. 이 연산을 위한 별도 cmath 함수는 없어요.
cmath.polar(z): z의 극좌표 표현을 반환.(r, phi)쌍을 반환하는데 r은 modulus, phi는 phase.polar(z)는(abs(z), phase(z))와 동등.cmath.rect(r, phi): 극좌표 r과 phi를 가진 복소수 z를 반환.complex(r * math.cos(phi), r * math.sin(phi))와 동등.
거듭제곱·로그 함수
cmath.exp(z): e의 z 거듭제곱을 반환 (e는 자연로그의 밑).cmath.log(z[, base]): 주어진 밑으로 z의 로그를 반환. 밑을 지정하지 않으면 z의 자연로그. 0에서 음의 실수 축을 따라 -∞까지 가지치기가 하나 있어요.cmath.log10(z): z의 밑 10 로그를 반환.log()와 같은 가지치기.cmath.sqrt(z): z의 제곱근을 반환.log()와 같은 가지치기.
삼각 함수
cmath.acos(z): z의 아크코사인. 가지치기 두 개: 1에서 실수 축을 따라 오른쪽으로 ∞까지, -1에서 실수 축을 따라 왼쪽으로 -∞까지.cmath.asin(z): z의 아크사인.acos()와 같은 가지치기.cmath.atan(z): z의 아크탄젠트. 가지치기 두 개: 1j에서 허수 축을 따라 ∞j까지, -1j에서 허수 축을 따라 -∞j까지.cmath.cos(z): z의 코사인.cmath.sin(z): z의 사인.cmath.tan(z): z의 탄젠트.
쌍곡 함수
cmath.acosh(z): z의 역쌍곡코사인. 1에서 실수 축을 따라 왼쪽으로 -∞까지 가지치기 하나.cmath.asinh(z): z의 역쌍곡사인. 가지치기 두 개: 1j에서 허수 축을 따라 ∞j까지, -1j에서 -∞j까지.cmath.atanh(z): z의 역쌍곡탄젠트. 가지치기 두 개: 1에서 실수 축을 따라 ∞까지, -1에서 -∞까지.cmath.cosh(z): z의 쌍곡코사인.cmath.sinh(z): z의 쌍곡사인.cmath.tanh(z): z의 쌍곡탄젠트.
분류 함수
cmath.isfinite(z): z의 실수부와 허수부가 모두 유한하면 True, 아니면 False. (3.2 추가)cmath.isinf(z): z의 실수부나 허수부 중 하나가 무한대이면 True, 아니면 False.cmath.isnan(z): z의 실수부나 허수부 중 하나가 NaN이면 True, 아니면 False.cmath.isclose(a, b, *, rel_tol=1e-09, abs_tol=0.0): a와 b가 서로 가까우면 True, 아니면 False. 주어진 절대·상대 허용오차로 결정돼요. 오류가 없다면 결과는abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol).rel_tol은 상대 허용오차로, a·b 중 큰 절댓값에 대한 최대 허용 차이. 5% 허용오차는rel_tol=0.05. 기본 1e-09는 약 9자리 십진수 내에서 같은 값을 보장.rel_tol은 음이 아니고 1.0보다 작아야 해요.abs_tol은 절대 허용오차로 기본 0.0, 음이 아니어야 해요. x를 0.0과 비교할 때isclose(x, 0)은abs(x) <= rel_tol * abs(x)로 계산돼 1.0보다 작은 rel_tol과 어떤 x에 대해 False예요. 그래서 적절한 양수abs_tol을 호출에 추가하세요. NaN, inf, -inf 같은 IEEE 754 특수값은 IEEE 규칙에 따라 처리돼요. NaN은 NaN을 포함한 어떤 값에도 가깝다고 여겨지지 않고, inf와 -inf는 자기 자신에게만 가깝다고 여겨져요. (3.5 추가, PEP 485 참고)
상수 (Constants)
cmath.pi: 수학 상수 π (float).cmath.e: 수학 상수 e (float).cmath.tau: 수학 상수 τ (float). (3.6 추가)cmath.inf: 부동소수점 양의 무한대.float('inf')와 동등. (3.6 추가)cmath.infj: 실수부가 0이고 허수부가 양의 무한대인 복소수.complex(0.0, float('inf'))와 동등. (3.6 추가)cmath.nan: 부동소수점 "not a number"(NaN) 값.float('nan')과 동등. (3.6 추가)cmath.nanj: 실수부가 0이고 허수부가 NaN인 복소수.complex(0.0, float('nan'))과 동등. (3.6 추가)
함수 선택은 math 모듈과 비슷하지만 동일하지는 않아요. 두 모듈이 있는 이유는 일부 사용자가 복소수에 관심이 없거나 복소수가 뭔지 모를 수도 있기 때문이에요. 그들은 math.sqrt(-1)이 복소수를 반환하는 것보다 예외를 내는 걸 더 원해요. 또 cmath에 정의된 함수는 답이 실수로 표현될 수 있어도(그 경우 허수부가 0) 항상 복소수를 반환한다는 점도 참고하세요.
가지치기(branch cut)에 대한 참고: 이는 주어진 함수가 연속적이지 않은 곡선이에요. 많은 복소 함수의 필수 특징이에요. 복소 함수로 계산해야 한다면 가지치기에 대해 이해하고 있다고 가정해요. 수치 목적의 가지치기 선택에 대한 좋은 참고는 Kahan의 논문을 보세요.