`catanh`, `catanhf`, `catanhl` — 복소수 아크쌍곡선 탄젠트
catanh, catanhf, catanhl — 복소수 아크쌍곡선 탄젠트
쌍곡선 탄젠트의 역함수를 복소수로 확장하면, 실수 탄젠트와 atanh(z) = atan(iz)/i 같은 관계가 드러나요. 이름의 '아크' 표현이 실제 의미와 조금 어긋나는 점까지 함께 살펴볼게요.
본문
catanh 계열 함수는 실수축을 따라 구간 [−1; +1] 바깥에 가지 자름을 두고, 복소수 z의 복소 아크쌍곡선 탄젠트를 계산해요.
float complex catanhf( float complex z ); // (1) (since C99)
double complex catanh( double complex z ); // (2) (since C99)
long double complex catanhl( long double complex z ); // (3) (since C99)
// Defined in header <tgmath.h>
#define atanh( z ) // (4) (since C99)
1-3) 실수축을 따라 구간 [−1; +1] 바깥에서 가지 자름을 갖는 z의 복소 아크쌍곡선 탄젠트를 계산해요.
4) 타입 제네릭 매크로예요. z가 long double complex면 catanhl, double complex면 catanh, float complex면 catanhf가 호출돼요. z가 실수·정수면 대응하는 실수 함수(atanhf, atanh, atanhl)를 호출해요. z가 허수면 atan의 실수 버전을 호출해 공식 atanh(iy) = i·atan(y)을 구현하고, 반환 타입은 허수예요.
매개변수
| 매개변수 | 설명 |
|---|---|
z |
복소수 인자 |
반환값
오류가 없으면 z의 복소 아크쌍곡선 탄젠트를 반환하는데, 수학적으로 실수축 방향으로 무한히 뻗은 반띠(half-strip)이면서 허수축 방향으로는 구간 [−iπ/2; +iπ/2] 안쪽이에요.
오류 처리와 특수 값
오류는 math_errhandling에 따라 보고돼요. 구현이 IEEE 부동소수점 산술을 지원한다면 다음 규칙이 적용돼요.
catanh(conj(z)) == conj(catanh(z))catanh(-z) == -catanh(z)z가+0+0i→ 결과는+0+0iz가+0+NaNi→ 결과는+0+NaNiz가+1+0i→ 결과는+∞+0i,FE_DIVBYZERO발생z가x+∞i(양의 유한x) → 결과는+0+iπ/2z가x+NaNi(0이 아닌 유한x) → 결과는NaN+NaNi,FE_INVALID발생 가능z가+∞+yi(양의 유한y) → 결과는+0+iπ/2z가+∞+∞i→ 결과는+0+iπ/2z가+∞+NaNi→ 결과는+0+NaNiz가NaN+yi(임의의 유한y) → 결과는NaN+NaNi,FE_INVALID발생 가능z가NaN+∞i→ 결과는±0+iπ/2(실수부 부호는 명시되지 않음)z가NaN+NaNi→ 결과는NaN+NaNi
Notes
C 표준은 이 함수를 "complex arc hyperbolic tangent"이라 부르지만, 쌍곡선 함수의 역함수는 사실 면적 함수예요. 정확히는 "complex inverse hyperbolic tangent", 덜 흔하게 "complex area hyperbolic tangent"이라 불러요.
역쌍곡선 탄젠트는 다가 함수라서 가지 자름이 필요해요. 관례적으로 실수축의 선분 (-∞,-1]과 [+1,+∞)에 자름을 둬요.
역쌍곡선 탄젠트의 주값의 수학적 정의는 다음과 같아요.
atanh z = (ln(1+z) - ln(1-z)) / 2
모든 z에 대해 다음 관계가 성립해요.
atanh(z) = atan(iz) / i
예시
가지 자름의 양쪽과 atan(iz)/i 관계를 확인해 보는 코드예요.
#include <stdio.h>
#include <complex.h>
int main(void)
{
double complex z = catanh(2);
printf("catanh(+2+0i) = %f%+fi\n", creal(z), cimag(z));
double complex z2 = catanh(conj(2)); // or catanh(CMPLX(2, -0.0)) in C11
printf("catanh(+2-0i) (the other side of the cut) = %f%+fi\n", creal(z2), cimag(z2));
// for any z, atanh(z) = atan(iz)/i
double complex z3 = catanh(1+2*I);
printf("catanh(1+2i) = %f%+fi\n", creal(z3), cimag(z3));
double complex z4 = catan((1+2*I)*I)/I;
printf("catan(i * (1+2i))/i = %f%+fi\n", creal(z4), cimag(z4));
}
출력:
catanh(+2+0i) = 0.549306+1.570796i
catanh(+2-0i) (the other side of the cut) = 0.549306-1.570796i
catanh(1+2i) = 0.173287+1.178097i
catan(i * (1+2i))/i = 0.173287+1.178097i
첫 두 출력이 허수부 부호만 정반대인 걸로 가지 자름을 확인할 수 있고, 마지막 두 줄이 atanh(z) = atan(iz)/i 관계를 그대로 보여줘요.
표준 참조
- C11: 7.3.6.3 The catanh functions (p: 193), 7.25 (p: 373-375), G.6.2.3 (p: 540-541), G.7 (p: 545)
- C99: 7.3.6.3 (p: 175), 7.22 (p: 335-337), G.6.2.3 (p: 475-476), G.7 (p: 480)
더 알아보기
- 복소 아크쌍곡선 사인
casinh, 복소 아크쌍곡선 코사인cacosh와 함께 역쌍곡선 함수군을 이뤄요. - 원함수는 복소 쌍곡선 탄젠트
ctanh예요. - 복소 아크탄젠트
catan과의 관계(atanh(z) = atan(iz)/i)가 핵심이에요. - 실수 역쌍곡선 탄젠트
atanh·atanhf·atanhl과 비교해 보세요. - cppreference의 catanh 원문에서 참조 절을 더 확인할 수 있어요.